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

Вниз

наследование, другое   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.018 c
14-96987
Novice
2003-01-10 16:01
2003.01.30
Вопросы и вопросы


3-96595
Niger
2003-01-13 15:22
2003.01.30
Capability not supported


3-96537
shur
2003-01-15 07:48
2003.01.30
Есть ли способ получить комментарии к полям ...


4-97087
dimmu3
2002-12-16 10:38
2003.01.30
Windows Serivce


6-96922
LeReve
2002-11-29 15:08
2003.01.30
ф-я connect завершается успехом раньше чем вызывается accept=(((