在 Delphi 2009 中,我有一个带有过程 MyProcedure 的表单,该过程写入表单上的标签。表单使用带有 ClientDataSet 的 DataModule。当 ClientDataSet 的 AfterScroll 事件被触发时,应该执行 MyProcedure。 为了避免循环引用,更重要的是,因为我希望 DataModule 可以重用, DataModule 不应引用此特定表单。
简而言之,我希望可以从我的 Form 访问 AfterScroll 事件。我可以从我的表单中连接 DataModule 上的 Afterscroll 事件吗?我认为这应该是可能的,但我不记得该怎么做。预先感谢。
您需要在 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 消息并在表单中响应该消息。
应该是这样的:
procedure TForm1.FormCreate(Sender: TObject);
begin
DataModule1.MyCDS.AfterScroll := MyAfterScrollHandler;
end;
如果您只想在不同的单元(例如表单)中声明事件处理程序,请遵循 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 即可。