Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2014.06.22;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.003 c
3-1298992270
vvv777
2011-03-01 18:11
2014.06.22
TADOStoredProc не ждать выполнения


15-1386700170
Дмитрий СС
2013-12-10 22:29
2014.06.22
Прокси-интерфейс


2-1377511120
jacksotnik
2013-08-26 13:58
2014.06.22
Ошибка в ClientDataset


15-1386448204
Юрий
2013-12-08 00:30
2014.06.22
С днем рождения ! 8 декабря 2013 воскресенье


15-1378911726
p
2013-09-11 19:02
2014.06.22
RAD Studio XE5





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский