2009-05-25 72 views
3

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

总之,我希望我可以从我的窗体访问AfterScroll事件。我可以从Form中连接DataModule上的Afterscroll事件吗?我认为这应该是可能的,但我不记得如何去做。提前致谢。

回答

6

你把一个事件属性在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

Datamodule1.OnAfterScroll:= MyHandleAfterScroll;

另一种方法是从DataModule发送自定义窗口消息并在窗体中响应该消息。

+0

谢谢Mihaela,就像一个魅力。 确切地说,在'If Assigned(FAfterScroll)'声明中将FAfterScroll改为FOnAfterScroll :) – 2009-05-25 14:53:59

2

应该是这样的:

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

谢谢Ulrich。我接受了Mihaela的答案,因为解释更长,但如果可能的话,我也会接受你的答案。 – 2009-05-25 14:49:04

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。外部事件,你会很好去。