Bitte so scenerio beachten:So ändern Sie TComponentProperty so, dass nur bestimmte Elemente in der Dropdown-Liste angezeigt werden?
Ich habe Komponente TMenuItemSelector
genannt, die zwei veröffentlichten Eigenschaften haben: PopupMenu
- ermöglicht eine Instanz von TPopupMenu
aus der Form und MenuItem
die jede Instanz von TMenuItem
aus der Form holen kann zu holen. Menüpunkte aus dieser PopupMenu
sichtbar sind in einer Dropdown-Liste
Ich möchte Eigenschaftseditor für MenuItem
Eigenschaft in einer Art und Weise ändern, dass, wenn PopupMenu
dann nur zugeordnet ist.
Ich weiß, dass ich meinen eigenen Nachkomme von TComponentProperty
schreiben und GetValues
Methode überschreiben muss. Das Problem ist, dass ich nicht weiß, wie man auf das Formular zugreifen kann, auf dem TMenuItemSelector
liegt.
Original-TComponentProperty
wird mit dieser Methode alle verfügbaren Instanzen zu durchlaufen:
procedure TComponentProperty.GetValues(Proc: TGetStrProc);
begin
Designer.GetComponentNames(GetTypeData(GetPropType), Proc);
end;
Allerdings scheint Designer
vorkompilierte zu sein, so habe ich keine Ahnung, wie GetComponentNames
funktioniert.
Das ist, was ich habe, so weit, ich denke nur, was die mir fehlt ist die Implementierung von 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.
Wer helfen könnte?
Danke.
Verwenden Sie 'Designer.Root', um an das Formular zu gelangen, denke ich. –