Доступ к событию в модуле данных из другой формы

В Delphi 2009 у меня есть Форма с процедурой MyProcedure, которая записывает метку в Форме. Форма использует DataModule с ClientDataSet. Когда происходит событие AfterScroll ClientDataSet, MyProcedure должен быть выполнен. Чтобы избежать циклических ссылок и, что более важно, поскольку я хочу, чтобы DataModule можно было многократно использовать, DataModule не должен ссылаться на эту конкретную форму.

Короче говоря, я надеюсь, что смогу получить доступ к событию AfterScroll из моей формы. Могу ли я подключить событие Afterscroll в DataModule из моей формы? Я думал, что это возможно, но я не могу вспомнить, как это сделать. Заранее спасибо.

3 ответа

Решение

Вы помещаете свойство события в свой DataModule:

private
FOnAfterScroll : TNotifyEvent;
public
property OnAfterScroll   : TNotifyEvent read FOnAfterScroll write FOnAfterScroll;

Затем вы вызываете это событие в процедуре AfterScroll в DataModule:

If Assigned(FOnAfterScroll) then FOnAfterScroll(Self);

В форме: объявить обработчик события

procedure HandleAfterScroll(Sender : TObject);

Затем вы назначаете процедуру OnAfterScroll в DataModule

Datamodule1.OnAfterScroll:= MyHandleAfterScroll;

Другой способ - отправить пользовательское сообщение Windows из DataModule и ответить на это сообщение в форме.

Должно быть что-то вроде:

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

Если все, что вам нужно, это объявить обработчик событий в другом модуле, например, в форме, воспользуйтесь предложением Ульриха. Если вы хотите иметь возможность добавлять обработчик событий по умолчанию в свой модуль данных, а затем расширять его поведение, потребуется немного больше работы. Вы можете сделать это, добавив событие в модуль данных.

Определите указатель метода с соответствующей подписью и добавьте его в модуль данных в общедоступной области, например так:

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, и все будет в порядке.

Другие вопросы по тегам