Форум: "Основная";
Текущий архив: 2003.01.30;
Скачать: [xml.tar.bz2];
Внизнаследование, другое Найти похожие ветки
← →
Andrushk (2003-01-15 10:36) [0]Как сделать следующую штуку:
вызывается процедура 1 потомка, по inherited она пойдет в процедуру 1 предка, а там стоит вызов процедуры 2 предка. Как сделать, чтобы в предке вместо процедуры 2 вызвалась процедура 2 потомка.
Ситуация вообще вот какая, я описал в форме-предке реакцию формы на клавиши (ну типа if key=#13 then Action1(...) ), а в форме-потомке я хочу дополнить этот Action1 еще какими-то действиями, но сделать это надо не переписывая OnKeyPress, а просто дописав действия в Action1
Как можно извернуться?
Предок
----
procedure 1(...)
begin
inherited;
...
2(...)
...
end;
procedure 2(...)
begin
...
end;
----------
Потомок
----
procedure 1(...)
begin
...
end;
procedure 2(...)
begin
...
end;
----------
← →
uw (2003-01-15 11:40) [1]Именно для таких целей и придуманы виртуальные методы.
program Inheritance;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
Cl1 = class
procedure p1; virtual;
procedure p2; virtual;
end;
Cl2 = class(Cl1)
procedure p1; override;
procedure p2; override;
end;
{ Cl1 }
procedure Cl1.p1;
begin
p2;
end;
procedure Cl1.p2;
begin
// Do anything
end;
{ Cl2 }
procedure Cl2.p1;
begin
inherited;
end;
procedure Cl2.p2;
begin
// Do anything
end;
var
c2: Cl2;
begin
c2 := Cl2.Create;
c2.p1;
end.
← →
Calm (2003-01-15 12:08) [2]
> uw © (15.01.03 11:40)
> Именно для таких целей и придуманы виртуальные методы
Именно так. Почитай любую книжку для начинающих. Очень пригодится.
← →
Andrushk (2003-01-15 14:34) [3]> Calm
Ну допустим, в книжке для начинающих этого не найдешь, даже в книжках Руководство для профессионалов о виртуальных методах говориться очень мало...
ну а если по делу:
> uw
спасибо
← →
Andrushk (2003-01-15 15:06) [4]вот только у меня задача такая, что в форме-потомке программист только процедуру обработчик меняет, а в описании методов не суется. Тем более что уже создано много форм-потомков и придется везде добавлять ovirride.
вот объясните мне такую штуку:
если взять компонент MainMenu и на OnClick его пунктов указать какие-то обработчики, а также определить хот-кеи, то переопределив на форме-потомке эти обработчики получается как-бы обойтись без OnKeyPress и вызывать обработчики именно потомка. Причем как я уже говорил, на потомке воббще ничего не надо больше делать, только дописать нужные действия в обработчики
вот только как бы обойтись без mainmenu?
← →
uw (2003-01-15 16:50) [5]Вообще-то все это получается автоматически, если в дочерней форме дважды кликнуть по событию.
А про объектно-ориентированное программирование можно почитать в книжках типа "Object Pascal Для Delphi".
← →
Andrushk (2003-01-15 17:45) [6]>uw
что произойдет автоматически? override - автомвтически не добавиться, а без него всякий смысл теряется
← →
uw (2003-01-15 20:44) [7]"Автоматически" означает то, что я создаю форму TForm1, размещаю на ней TMainMenu, в нем - TMenuItem и кликаю по этому пункту. Получается
procedure TForm1.MenuItemClick(Sender: TObject);
begin
end;
После этого создаю форму TForm2, наследуя ее от TForm1. На ней я вижу то же самое меню. Кликаю по TMenuItem и получаю
procedure TForm2.MenuItemClick(Sender: TObject);
begin
inherited;
end;
Дальше я должен иметь хоть какой-то намек на то, как не воспользоваться этим удобным механизмом. Т.е. не догадываюсь о проблеме.
Кстати, никакие override"ы здесь не используются.
← →
Andrushk (2003-01-16 09:06) [8]>uw
Что здесь не используютя override"ы я знаю, я думал речь идет о твоем примере.
Почему не воспользоваться таким удобным примером щас объясню:
На форме лежит Грид, Едит, и Кнопка. По нажатию на кнопку происходит вызов активной записи из грида на редактирование, по нажатию Enter в любой части формы, кроме Edit"а вызывается тот же обработчик что и для кнопки. Но по нажатию Enter на Edit"е происходит другое действие (включение фильтра). - Это то, что в предке. В нем есть кнопка, обработчик, НО, реально дейсвия по редактированию описываются в потомке.
В чем фигня? Чтобы сохранить возможность включения фильтра по Enter, когда стоишь на Edit в обработчик кнопки надо добавить проверку у какого компонента фокус (потому что в mainmenu именно этот обработчик указан для Enter), теперь с Enter все работает зашибись, но стоит нажать на кнопку(отвечающую за редактирование) когда фокус у едита - и включается фильтр...лажа
← →
uw (2003-01-16 10:32) [9]Без конкретного примера непонятно. Если хочешь, сбрось мне пример на mail.
← →
Andrushk (2003-01-16 10:48) [10]>uw
ok, только чуть позже, я вырежу проблемный кусок, а то проект большой
← →
id_privin (2003-01-16 11:01) [11]Предложу вариант :
TParent = class(TObject)
protected
procedure p2; virtual;
public
procedure p1; virtual;
property CustomEvent : TNotifyEvent;
end;
TChild = class(TParent)
protected
procedure CustomEventRelease(Sender : TObject);
constructor Create;
end;
procedure TParent.p1;
begin
p2;
end;
procedure TParent.p2;
begin
if Assigned(CustomEvent) then CustomEvent(Self);
end;
constructor TChild.Create;
begin
inherited;
CustomEvent := CustomEventRelease;
end;
procedure TChild.CustomEventRelease(Sender : TObject);
begin
inherited; // Вдруг предок что-то делает
// Все специфичные действия делаем здесь
end;
Собственно обработчики событий компонент так и работают. Те функции типа p2 срабатывают по сообщениям windows и запускают конкретные присвоенные обработчики. А связывание событий те
CustomEvent := CustomEventRelease;
происходит при создании формы по dfm (точнее по тому во что ее превращает Delphi при сборке проекта)
← →
han_malign (2003-01-16 11:09) [12]Таки родной, тебе нужно два Action, один для редактирования, другой для фильтра и вызывать его ручками, либо глобальный(для объекта) флаг завести для индикации типа события, либо можно использовать поле TAction.Tag(32-битное значение, в которое можно запихивать все что угодно, VCL его никак не использует, специально для заплат завели)
← →
Andrushk (2003-01-20 17:15) [13]>id_privin
Предложение интересное, но тогда мне придется в потомке явно прописывать что теперь для этого события служит вот этот обработчик, а я писал что потомка менять нельзя.
>han_malign
По поводу двух Action"ов не понял, если можно подробнее, а вот за напоминание про TAction - спасибо, надо почитать
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.01.30;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.009 c