简洁版本
我正在尝试为我制作的自定义按钮实现我的第一个组件编辑器。在一些在线文章的帮助下,我成功安装了编辑器,当我在表单设计器中右键单击我的按钮时可以看到菜单项。
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 个按钮,并使用组件编辑器一次将导入的设置应用到这些按钮上。