【发布时间】: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 个按钮,然后使用组件编辑器一次将导入的设置应用到这些按钮上。
【问题讨论】: