3

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

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

4

3 回答 3

6

您在 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 发送自定义窗口消息并在表单中响应该消息。

于 2009-05-25T14:18:04.480 回答
2

应该是这样的:

procedure TForm1.FormCreate(Sender: TObject);
begin
  DataModule1.MyCDS.AfterScroll := MyAfterScrollHandler;
end;
于 2009-05-25T14:15:34.127 回答
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 就可以了。

于 2009-05-25T14:23:24.220 回答