在Delphi 2009中,我有一个带有MyProcedure过程的表单,该过程写入表单上的标签。表单使用 DataModule和ClientDataSet。当触发ClientDataSet的AfterScroll事件时,应执行MyProcedure。 为了避免循环引用,更重要的是,因为我希望DataModule可以重用, DataModule不应引用此特定表单。
简而言之,我希望我可以从我的表单中访问AfterScroll事件。我可以从表单中挂接DataModule上的Afterscroll事件吗?我认为它应该是可能的,但我不记得该怎么做了。提前谢谢。
答案 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,你就可以了。