可以在多个组件上执行组件编辑器吗?

时间:2013-02-10 20:42:56

标签: delphi custom-controls

短版

我正在尝试为我制作的自定义按钮实现我的第一个组件编辑器。在一些在线文章的帮助下,我成功安装了编辑器,当我在表单设计器中右键单击我的按钮时,可以看到菜单项。

但是当选择多个按钮控件时,这个组件编辑器菜单没有显示。

默认情况下,组件编辑器是仅使用单个选定的控件,还是可以使用多个选定的控件?如果是,如何使用?

长版

我正在为我自己的一个组件实现TPropertyEditor,但现在已经决定更好地服务TComponentEditor,或者我认为。

基本上我有一个TCustomButton我已经拥有,这个按钮组件有几个已发布的属性,用于更改外观,如边框和填充颜色等。

我正在实现的组件编辑器在上下文菜单中显示一个新菜单项“从文件加载设置”。执行时,会显示一个简单的TOpenDialog,您可以选择相应的文件,例如Ini文件,然后我将其读取并相应地设置文件中的值。

从我所看到的一切都很好,但是因为我仍然是新的并且掌握了Delphi的整个自定义控件方面,我注意到了一些不会发生的事情 - 我不确定这是不是真的预期的行为或我是否可以改变它。

问题是在我的按钮控件的多个选定实例上使用“组件编辑器”菜单。如果只选择了一个按钮,我在Designer中右键单击,我的菜单显示在上下文菜单的顶部,但是多个选定的控件不显示“组件编辑器”菜单。

代码示例

type
  TMyButtonEditor = class(TComponentEditor)
  public
    procedure ExecuteVerb(Index: Integer); override;
    function GetVerb(Index: Integer): string; override;
    function GetVerbCount: Integer; override;
  end;

implementation

{ TMyButtonEditor }

procedure TMyButtonEditor.ExecuteVerb(Index: Integer);
var
  OpenDialog: TOpenDialog;
begin
  case Index of
    0:
    begin
      OpenDialog := TOpenDialog.Create(nil);
      try
        OpenDialog.Filter := 'All Files (*.*)|*.*';

        if OpenDialog.Execute then
        begin
          // handle opened file..
        end;
      finally
        OpenDialog.Free;
      end;
    end;
  end;
end;

function TMyButtonEditor.GetVerb(Index: Integer): string;
begin
  case Index of
    0:
    begin
      Result := 'Load settings from File...';
    end;
  end;
end;

function TMyButtonEditor.GetVerbCount: Integer;
begin
  Result := 1;
end;

在注册程序单元中:

RegisterComponentEditor(TMyButton, TMyButtonEditor);

从我所看到的只有单个组件可以在任何给定时间使用组件编辑器,或者我错了,它们可以用于多个控件?

我希望在表单设计器上选择说3或4个按钮,然后使用组件编辑器同时在这些按钮上应用导入的设置。

1 个答案:

答案 0 :(得分:4)

组件编辑器只能在单个组件上运行。

这是一个非常好的理由,希望尽可能通过Object Inspector而不是组件编辑器提供属性。因为Object Inspector可以同时对多个组件进行操作。