Пожалуйста, рассмотрите такой сценарий:
У меня есть компонент с именем TMenuItemSelector
, который имеет два опубликованных свойства: PopupMenu
- позволяет выбрать экземпляр TPopupMenu
из формы и MenuItem
, который позволяет выбрать любой экземпляр TMenuItem
с формы.
Я хотел бы изменить редактор свойств для свойства MenuItem
таким образом, чтобы при назначении PopupMenu
в раскрывающемся списке отображались только элементы меню из этого PopupMenu
.
Я знаю, что мне нужно написать собственного потомка TComponentProperty
и переопределить GetValues
метод. Проблема в том, что я не знаю, как получить доступ к форме, на которой лежит TMenuItemSelector
.
Original TComponentProperty
использует этот метод для итерации всех доступных экземпляров:
procedure TComponentProperty.GetValues(Proc: TGetStrProc);
begin
Designer.GetComponentNames(GetTypeData(GetPropType), Proc);
end;
Однако Designer
, похоже, предварительно скомпилирован, поэтому я понятия не имею, как работает GetComponentNames
.
Это то, что у меня есть, я думаю, единственное, чего мне не хватает, это реализации GetValues
:
unit uMenuItemSelector;
interface
uses
Classes, Menus, DesignIntf, DesignEditors;
type
TMenuItemSelector = class(TComponent)
private
FPopupMenu: TPopUpMenu;
FMenuItem: TMenuItem;
procedure SetPopupMenu(const Value: TPopUpMenu);
procedure SetMenuItem(const Value: TMenuItem);
published
property PopupMenu: TPopUpMenu read FPopupMenu write SetPopupMenu;
property MenuItem: TMenuItem read FMenuItem write SetMenuItem;
end;
type
TMenuItemProp = class(TComponentProperty)
public
function GetAttributes: TPropertyAttributes; override;
procedure GetValues(Proc: TGetStrProc); override;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterPropertyEditor(TypeInfo(TMenuItem), TMenuItemSelector, 'MenuItem', TMenuItemProp);
RegisterComponents('Test', [TMenuItemSelector]);
end;
{ TMenuItemSelector }
procedure TMenuItemSelector.SetMenuItem(const Value: TMenuItem);
begin
FMenuItem := Value;
end;
procedure TMenuItemSelector.SetPopupMenu(const Value: TPopUpMenu);
begin
FPopupMenu := Value;
end;
{ TMenuItemProperty }
function TMenuItemProp.GetAttributes: TPropertyAttributes;
begin
Result := inherited GetAttributes + [paValueList, paSortList];
end;
procedure TMenuItemProp.GetValues(Proc: TGetStrProc);
begin
//How to filter MenuItems from the form in a way that only
//MenuItems which belong to TMenuItemSelector.PopupMenu are displayed? \
//And how to get to that form?
//inherited;
end;
end.
Кто-нибудь может помочь?
Спасибо.