2009-05-25 77 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。外部事件,你會很好去。