Доступ к событию в модуле данных из другой формы
В 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, и все будет в порядке.