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

时间:2009-05-25 14:02:53

标签: delphi event-handling datamodule

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

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

3 个答案:

答案 0 :(得分: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发送自定义Windows消息并在表单中响应该消息。

答案 1 :(得分:2)

应该是这样的:

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

答案 2 :(得分: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,你就可以了。