如何为事件方法创建一个单独的单元,IDE允许我在设计时分配给组件事件?

use*_*734 5 delphi delphi-2007

我有一个表单,其中包含某些具有事件处理程序的组件.现在我想将这些事件处理程序(那些方法)移动到一个单独的单元,仍然能够在设计时通过Object Inspector将它们分配给组件事件.

是否可以仅为事件方法创建一个单独的单元,以便Object Inspector允许我在设计时分配它们?

假设我是否会使用公共程序制作该单元:

unit Unit2;

interface

procedure ButtonClick(Sender: TObject);

implementation

procedure ButtonClick(Sender: TObject);
begin
  // do something here
end;

end.
Run Code Online (Sandbox Code Playgroud)

或者使用已发布方法的类,如下所示:

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.
Run Code Online (Sandbox Code Playgroud)

如何为事件方法创建一个单独的单元,IDE允许我在设计时分配给组件事件?例如:

在此输入图像描述

Gol*_*rol 4

大多数事件都是方法指针。这意味着它们指向类中的过程或函数。因此,您不能仅将过程 Unit2.ButtonClick 附加到按钮的单击事件,而是可以编写一个实现事件处理程序的类,如下所示:

type
  TMainFormButtonEventHandler = class
    procedure ButtonClick(Sender: TObject);
  end;

procedure TMainFormButtonEventHandler.ButtonClick(Sender: TObject);
begin
  ShowMessage('Clicked');
end;
Run Code Online (Sandbox Code Playgroud)

现在您可以创建这样一个对象并将其链接到事件:

handler := TMainFormButtonEventHandler.Create;
Form1.Button1.OnClick := handler.ButtonClick;
Run Code Online (Sandbox Code Playgroud)

不过,我认为这不是最好的应用程序结构。我不会从表单单元外部连接到表单的 GUI 元素。但如果您愿意这样做,那就是这样做的。

如果您正在寻求 GUI 和逻辑的分离,请查看操作。TAction(包装在 ActionList 中)是 GUI 组件(如按钮)与其执行的操作代码之间的第一层抽象。

方便的是,您也可以在设计时创建这些操作,并将它们附加到按钮或其他控件。您无需为 ButtonClick 编写代码,而是为 ActionExecute(操作的 OnExecute 事件)编写代码。该按钮知道当它被单击时,它应该执行其相关操作。

  • **可以**使用非类函数作为需要对象方法的事件的处理程序。诀窍是为函数提供一个额外的起始参数以从事件接收“Self”值,并使用“TMethod”记录来帮助您将函数分配给事件(这还允许您指定“ Self` 参数将实际接收,如果不是真实的对象,它可以是任何你想要的东西)。然而,这种方法**不**在设计时不起作用,只能在运行时起作用。 (2认同)