请考虑这样之情况:如何修改TComponentProperty以仅显示下拉列表中的特定项目?
我有分量叫TMenuItemSelector
它有两个公布属性:PopupMenu
- 允许挑选的TPopupMenu
从形式和MenuItem
一个实例,它允许从形式挑选的TMenuItem
任何实例。
我想修改MenuItem
属性的属性编辑器,当PopupMenu
被分配时,只有这个PopupMenu
的菜单项在下拉列表中可见。
我知道我需要写我自己的TComponentProperty
的后代并覆盖GetValues
方法。问题是我不知道如何访问TMenuItemSelector
所在的表单。
原始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.
任何人都可以帮助吗?
谢谢。
使用'Designer.Root'来转换表单,我想。 – 2012-04-02 21:07:57