我有一个包含某些组件的表单,这些组件都有事件处理程序。现在我想将这些事件处理程序(那些方法)移动到一个单独的单元,仍然可以在设计时通过Object Inspector将它们分配给组件事件。
是否可以仅为事件方法创建一个单独的单元,以便Object Inspector允许我在设计时分配它们?
假设我是否会使用公共程序制作该单元:
unit Unit2;
interface
procedure ButtonClick(Sender: TObject);
implementation
procedure ButtonClick(Sender: TObject);
begin
// do something here
end;
end.
或者使用已发布方法的类:
unit Unit2;
interface
type
TMyClass = class
published
procedure ButtonClick(Sender: TObject);
end;
var
MyClass: TMyClass;
implementation
{ TMyClass }
procedure TMyClass.ButtonClick(Sender: TObject);
begin
// do something here
end;
end.
如何为事件方法创建一个单独的单元,IDE允许我在设计时分配给组件事件?比如:
答案 0 :(得分:4)
大多数事件都是方法指针。这意味着它们指向类中的过程或函数。所以你不能只将程序Unit2.ButtonClick附加到按钮的单击事件上,但你可以编写一个实现事件处理程序的类,如下所示:
type
TMainFormButtonEventHandler = class
procedure ButtonClick(Sender: TObject);
end;
procedure TMainFormButtonEventHandler.ButtonClick(Sender: TObject);
begin
ShowMessage('Clicked');
end;
现在您可以创建这样的对象并将其链接到事件:
handler := TMainFormButtonEventHandler.Create;
Form1.Button1.OnClick := handler.ButtonClick;
但是,我不认为这是最好的应用程序结构。我不会从表单单元外部挂钩表单的GUI元素。但如果您愿意这样做,这就是它的完成方式。
如果您正在寻找GUI和逻辑的分离,请查看操作。 TAction(包含在ActionList中)是GUI组件(如按钮)与其执行的操作代码之间的第一层abstration。
方便的是,您也可以在设计时创建这些操作,并将它们附加到按钮或其他控件上。您不是为ButtonClick编写代码,而是为ActionExecute(操作的OnExecute事件)编写代码。按钮知道单击它时,它应该执行相关的操作。