从另一个表单访问 DataModule 上的事件

问题描述 投票:0回答:3

在 Delphi 2009 中,我有一个带有过程 MyProcedure 的表单,该过程写入表单上的标签。表单使用带有 ClientDataSet 的 DataModule。当 ClientDataSet 的 AfterScroll 事件被触发时,应该执行 MyProcedure。 为了避免循环引用,更重要的是,因为我希望 DataModule 可以重用, DataModule 不应引用此特定表单。

简而言之,我希望可以从我的 Form 访问 AfterScroll 事件。我可以从我的表单中连接 DataModule 上的 Afterscroll 事件吗?我认为这应该是可能的,但我不记得该怎么做。预先感谢。

delphi event-handling datamodule
3个回答
7
投票

您需要在 DataModule 中放置一个事件属性:

private
FOnAfterScroll : TNotifyEvent;
public
property OnAfterScroll   : TNotifyEvent read FOnAfterScroll write FOnAfterScroll;

然后,您可以在 DataModule 的 AfterScroll 过程中调用该事件:

If Assigned(FOnAfterScroll) then FOnAfterScroll(Self);

形式: 声明事件处理程序

procedure HandleAfterScroll(Sender : TObject);

然后为 DataModule 的 OnAfterScroll 分配一个过程

 Datamodule1.OnAfterScroll :=
 MyHandleAfterScroll;

另一种方法是从 DataModule 发送自定义 Windows 消息并在表单中响应该消息。


3
投票

应该是这样的:

procedure TForm1.FormCreate(Sender: TObject);
begin
  DataModule1.MyCDS.AfterScroll := MyAfterScrollHandler;
end;

1
投票

如果您只想在不同的单元(例如表单)中声明事件处理程序,请遵循 Ulrich 的建议。如果您希望能够将默认事件处理程序放入数据模块中,但随后能够扩展其行为,则需要做更多的工作。您可以通过向数据模块添加事件来完成此操作。

使用适当的签名定义一个方法指针,并将其添加到公共范围的数据模块中,如下所示:

type
  TMyEvent = procedure({arg list here}) of object;

  TMyDataModule = class(TDataModule)
  //definition goes here
    procedure MyTableAfterScroll({arg list here});
  private
    FExternalEvent: TMyEvent;
  public
    property ExternalEvent: TMyEvent read FMyEvent write FMyEvent
  end;

implementation

procedure TMyDataModule.MyTableAfterScroll({arg list here});
begin
  //do whatever
  if assigned(FExternalEvent) then
    FExternalEvent({whatever arguments});
  //do more stuff, if you'd like
end;

要连接它,在表单的 OnCreate 中,只需将您的过程分配给 MyDataModule.ExternalEvent 即可。

© www.soinside.com 2019 - 2024. All rights reserved.