Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2014.06.22;
Скачать: CL | DM;

Вниз

inherited; не работает. Как выполнить все события?   Найти похожие ветки 

 
Abcdef123   (2013-08-27 07:43) [0]

Здравствуйте, Мастера.
Подскажите плиз, это возможно, и если да, то как реализовать  вложенность выполнения процедур?
Есть Датамодуль  DM1.
На событие создания этого модуля прописано, чтоб для всех таблиц модуля выполнялись некие процедуры.
 for intIndex := 0 to (ComponentCount - 1) do
   if Components[intIndex] is TAdsTable then
   begin
     tblThisTable := TAdsTable(Components[intIndex]);
     begin
       tblThisTable.BeforePost:= DoOnBeforePost;
       tblThisTable.BeforeEdit:= DoOnBeforeEdit;  //....и так далее
      end;
   end;
На основе этого модуля создан inherited модуль DM2. Получается, что для всех таблиц модуля DM2 будут выполняться процедуры , которые назначенны в родителе. Как раз то что надо! Но, например, дополнительно к некоторым таблицам надо выполнять еще что то. Как это реализовать оптимально (не дублируя код из родителя).
Делала вот так :
procedure TDM2.TBL_MainBeforeEdit(DataSet: TDataSet);
begin
 inherited;
 MessageDlg("ququ", mtWarning, [mbOK], 0);  //просто для теста, вместо нужного кода
end;
Но не идет вообще в эту процедуру, так как она переназначена общей DoOnBeforeEdit. А мне надо, чтоб и DoOnBeforeEdit выполнилась, и чтоб сообщение "ququ" потом отрабатывалось.
Подскажите, как это сделать.
Заранее благодарна


 
anonims   (2013-08-27 09:19) [1]

1 вар.
в родителе создать виртуальную функцию назначения. ЕЕ вызывать в событии создания.
procedure DoSetEvents; virtual;
в наследнике ПЕРЕОПРЕДЕЛИТЬ эту функцию. с тем чтобы назначать новые функции. которые при необходимости будут вызывать старые.
procedure DoSetEvents; override;

2 вар.
создать доп. обработчик события OnCreate с вызовом предыдущего.
(или же сделать все назначения заново).
В нем переназначить нужное на новые обработчики. (после вызова старого).

В новых обработчиках вызывать старые как процедуры.
новый обработчик.
procedure TDM2.TBL_MainBeforeEdit(DataSet: TDataSet);
begin
DoOnBeforeEdit(dataset); // вызов старой процедуры обработки.
//возможен такой вызов  inherited doOnBeforeEdit(dataset);
MessageDlg("ququ", mtWarning, [mbOK], 0);  //просто для теста, вместо нужного кода
end;


 
Ega23 ©   (2013-08-27 10:29) [2]

Обработчик события один. Внутри обработчика дёргается виртуальный метод. Метод у потомков перекрывается.
И не мог не удержаться: архитектура - гуано.


 
brother ©   (2013-08-27 10:30) [3]

> архитектура - гуано.

я бы с этого начал, а там может и проблемм таких уже не будет...


 
brother ©   (2013-08-27 10:31) [4]

вообще, разговор надо вести о начальных знаниях основ ООП...? Впрочем, вопрос - ответ...


 
Abcdef123   (2013-08-27 11:33) [5]

To [2], [3] А могли бы вы хотя бы кратенько описать свою идею какой добжен быть датамодуль-предок, чтобы при использовании его в потомках можно было избежать дублирования кода?
Вам, конечно, виднее. Просто я пытаюсь создать как бы шаблон, который будет удобно использовать во многих проектах как inherited, и чтобы не переписывать каждый раз одни и те же правила. К примеру вот одна из этих процедур, о которых идет речь
procedure TDM1.DoOnBeforeEdit(DataSet: TDataSet);
begin
 strRFVAL :="F";
 if TAdsTable(DataSet).MasterSource <> Nil then
   if TAdsTable(DataSet).MasterSource.DataSet.State=dsBrowse then
     TAdsTable(DataSet).MasterSource.DataSet.Edit;
 pnt:= MethodAddress(DataSet.Name+"BeforeEdit");
 @evntDataSet:= pnt;
 if (@evntDataSet <> nil) then
   evntDataSet(DataSet);

end;
!Кстати, жирным шрифтом я выделила код, который мне был нужен. (я сама нашла решение после того как отправила уже вопрос на форум).Это работает.
Тем не менее, мне интересно узнать ваше мнение - мнение мастеров. Возможно, и это мое решение вы считаете не правильным.
Буду признательна за любые полезные комментарии и примеры хороших "манер" программирования датамодуля.


 
brother ©   (2013-08-27 11:43) [6]

я настоятельно не рекомендую лезть в адресное пространство начинающим!


 
Abcdef123   (2013-08-27 12:45) [7]

То [6]
Ну почему? Мне кажется, что очень оптимально придумала.
Вот если без обобщения, на данном конкретном примере, этот прием чем то "опасен", чтоб его использовать? Может я просто не вижу каких то ньюансов или исключений, когда данный мой код не будет правильно работать? Прокомментируйте, пожалуйста. Очень прошу! А то иначе, с такими обобщенными комментариями как ваш последний так и можно навсегда остаться начинающим :-)


 
brother ©   (2013-08-27 12:46) [8]

Вы это код понимаете? Как он работает?


 
Ega23 ©   (2013-08-27 12:54) [9]


> To [2], [3] А могли бы вы хотя бы кратенько описать свою
> идею какой добжен быть датамодуль-предок, чтобы при использовании
> его в потомках можно было избежать дублирования кода?

Скажем так. DataModule - весьма специфичная штука. Использовать её как шаблон, конечно, можно, но, откровенно говоря, я на практике за 15 лет этого ни разу не видел. Ну, например, у тебя используются компоненты доступа вполне определённого класса. А это уже сужает возможности данного шаблона.
Это во-первых.

Во-вторых, при виде TxxxTable большинство БД-разработчиков колбасит и мясорубит.

В-третьих, как правило, всяких датасетов и команд много, причём довольно разномастных. Каждому крутить одни и те же события - не айс. Хотя тут уже хозяин-барин.

В-четвёртых, редактировать в DBGrid (а, судя по событиям, именно это у тебя происходит) - это так же прошлый век, хотя бы с точки зрения GUI.



Страницы: 1 вся ветка

Текущий архив: 2014.06.22;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.008 c
15-1386365402
Юрий
2013-12-07 01:30
2014.06.22
С днем рождения ! 7 декабря 2013 суббота


15-1386315211
oldman
2013-12-06 11:33
2014.06.22
Не ли у кого конвертера GDBTOXML?


15-1386058324
LDV
2013-12-03 12:12
2014.06.22
html-редактор


15-1386575834
oldman
2013-12-09 11:57
2014.06.22
С днем рождения!


3-1298992270
vvv777
2011-03-01 18:11
2014.06.22
TADOStoredProc не ждать выполнения