在Delphi2009中,我有一个带有过程MyProcedure的表单,它可以写入表单上的标签。表单使用DataModule和ClientDataSet。当触发ClientDataSet的ClientDataSet事件时,应该执行MyProcedure。为了避免循环引用,更重要的是,由于我希望DataModule是可重用的,所以DataModule不应该引用这个特定的表单。
简而言之,我希望我可以从我的表单中访问AfterScroll事件。我能否从我的表单中连接DataModule上的后滚动事件?我认为这应该是可能的,但我想不起来该怎么做了。提前谢谢。
发布于 2009-05-25 14:18:04
您在DataModule中放置了一个事件属性:
private
FOnAfterScroll : TNotifyEvent;
public
property OnAfterScroll : TNotifyEvent read FOnAfterScroll write FOnAfterScroll;然后在AfterScroll过程中调用DataModule中的事件:
If Assigned(FOnAfterScroll) then FOnAfterScroll(Self);形式:声明事件处理程序
procedure HandleAfterScroll(Sender : TObject);然后将一个过程分配给DataModule的OnAfterScroll
.关于:= MyHandleAfterScroll;
另一种方法是从DataModule发送自定义窗口消息,并在表单中响应该消息。
发布于 2009-05-25 14:15:34
应该是这样的:
procedure TForm1.FormCreate(Sender: TObject);
begin
DataModule1.MyCDS.AfterScroll := MyAfterScrollHandler;
end;发布于 2009-05-25 14:23:24
如果您只想在一个不同的单元(如表单)中声明事件处理程序,那么就按照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,就可以了。
https://stackoverflow.com/questions/906853
复制相似问题