2

简洁版本

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

But this component editor menu is not showing when selecting more than one of my button controls.

默认情况下,组件编辑器是否仅适用于单个选定的控件,或者它们是否可以与多个选定的控件一起使用,如果可以,如何?

长版

我正在为我自己的一个组件实现 TPropertyEditor,但现在决定使用 TComponentEditor 会更好,至少我是这么认为的。

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

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

据我所见,一切都运行良好,但由于我还是个新手并且正在掌握 Delphi 的整个自定义控件方面,我注意到一些没有发生的事情 - 我不确定这是否是实际预期的行为或我是否可以改变它。

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

代码示例

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 个按钮,并使用组件编辑器一次将导入的设置应用到这些按钮上。

4

1 回答 1

4

组件编辑器只能对单个组件进行操作。

这是尽可能通过对象检查器而不是组件编辑器提供属性的一个很好的理由。因为 Object Inspector 可以一次对多个组件进行操作。

于 2013-02-10T20:46:27.760 回答