【问题标题】:Can a Component Editor be executed on multiple components?组件编辑器可以在多个组件上执行吗?
【发布时间】:2013-01-25 23:28:20
【问题描述】:

短版

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

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

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

加长版

我正在为我自己的一个组件实现 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 个按钮,然后使用组件编辑器一次将导入的设置应用到这些按钮上。

【问题讨论】:

    标签: delphi custom-controls


    【解决方案1】:

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

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

    【讨论】:

    • 我需要重新考虑我的方法,因为手动选择并右键单击每个按钮只是为了加载和应用配置文件中的设置太乏味了。更改按钮视觉外观的属性都已发布,但将值存储在文件中对于快速导入现有按钮外观设置会很方便。
    • 添加另一个样式组件来执行此操作,并将此类样式器的属性添加到您的按钮类。
    • @NGLN 是对的,加一层间接解决问题
    • @NGLN 好主意感谢您的建议,而不是为我的每个按钮控件调用编辑器,我可以创建另一个组件来代替。感谢大卫的回答,它很快解决了我的问题。
    猜你喜欢
    • 2020-10-25
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 2020-05-23
    • 1970-01-01
    • 1970-01-01
    • 2018-04-12
    相关资源
    最近更新 更多