Форум: "Начинающим";
Текущий архив: 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