Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Как создать TDataSetNotifyEvent в runtime


Автор: count 16.8.2010, 10:50
Собственно вопрос:
хочется в рантайм создать обработчик события (ну например AfterEdit) и присвоить его соответсвующему event'y датасета.
соответственно - написал процедуру вида
Код

procedure procname(DataSet:Tdataset);
begin
end;


и пытаюсь ее присвоить :

Код

myDS.AfterEdit:=procname;


и это не работает...
наверное я сильно не прав с синтаксисом, но где именно?
заранее благодарен за помощь.

Автор: БелАмор 16.8.2010, 20:53
Код

property AfterEdit: TDataSetNotifyEvent;
type TDataSetNotifyEvent = procedure(DataSet: TDataSet) of object;

Обратите внимание на of object
Ваш обработчик должен быть не отдельной процедурой, а методом какого-либо класса.
Смотрите ссылки:
http://www.delphikingdom.com/asp/answer.asp?IDAnswer=68289
http://www.delphikingdom.com/asp/answer.asp?IDAnswer=50218

Автор: БелАмор 16.8.2010, 23:52
Ещё пару слов...
Указатель на метод на самом деле содержит два отдельных указателя: на собственно функцию и на объект (TDataSetNotifyEvent, кстати, имеет sizeof не 4, а 8). Обычно этот момент упускается из вида, т.к. в большинстве случаев обработчик является либо методом класса формы, на которой расположен элемент управления, которому назначается событие, либо методом дата-модуля, на котором находися датасет. В этом случае всё происходит просто и естественно за счёт неявного Self, не вызывая дополнительных вопросов. Если же обработчик является методом постороннего класса, то появляются дополнительные тонкие моменты.
По этому поводу можете посмотреть ещё ссылки:
http://www.delphikingdom.com/asp/answer.asp?IDAnswer=72459
http://www.delphikingdom.com/asp/answer.asp?IDAnswer=55213

Автор: count 17.8.2010, 09:12
в общем собаку я забыл....

Код

myDS.AfterEdit:=@procname;

Автор: БелАмор 17.8.2010, 11:06
Цитата(count @  17.8.2010,  09:12 Найти цитируемый пост)
в общем собаку я забыл....
myDS.AfterEdit:=@procname;

Неудачное решение...
Наводящий вопрос: у вас в процедуре параметр используется для получения ссылки на датасет, или так, для красоты?...

Автор: count 17.8.2010, 12:19
да, там на основании датасета идут проверки и некоторые дополнительные действия.
(а чем неудачное то?) 

Автор: БелАмор 17.8.2010, 12:42
Цитата(count @  17.8.2010,  12:19 Найти цитируемый пост)
а чем неудачное то?

Смотрите ссылки в двух первых ответах. Там много и подробно.
Если кратко, то в приведённом вами виде (не метод, а отдельная процедура) в процедуре вы получите вместо ссылки на датасет мусорную ссылку на Self, а ссылка на датасет будет идти вторым параметром, который вы не используете...

Автор: count 17.8.2010, 13:28
Да, точно. так и будет. эта процедура реально объявлена в датамодуле, поэтому проблемы в приложении не возникнет. За ссылки - спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)