代码之家  ›  专栏  ›  技术社区  ›  RR-NL

从另一个窗体访问DataModule上的事件

  •  3
  • RR-NL  · 技术社区  · 17 年前

    3 回复  |  直到 15 年前
        1
  •  6
  •   Mihaela    17 年前

    您在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

    MyHandleAfterScroll;

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

        2
  •  2
  •   Uli Gerhardt    17 年前

    应该是这样的:

    procedure TForm1.FormCreate(Sender: TObject);
    begin
      DataModule1.MyCDS.AfterScroll := MyAfterScrollHandler;
    end;
    
        3
  •  1
  •   Mason Wheeler    17 年前

    如果您只想在不同的单元中声明事件处理程序,如表单,请按照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;