【发布时间】:2012-04-16 12:53:18
【问题描述】:
请考虑这样的场景:
我有一个名为 TMenuItemSelector 的组件,它有两个已发布的属性:PopupMenu - 允许从表单中选择 TPopupMenu 的实例,MenuItem 允许选择 any 的实例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来获取表单。
标签: delphi delphi-2009 propertyeditor