Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.01 c
1-96742
borg
2003-01-22 09:10
2003.01.30
Смещение


1-96656
HermitAlex
2003-01-20 16:49
2003.01.30
Multiline Component Palette


4-97069
Matolch
2002-12-12 13:06
2003.01.30
Что значит the default directory в параметрах функции?


1-96836
Tundra
2003-01-20 13:22
2003.01.30
Как узнать координаты курсора мыши находящегося над формой.


6-96925
Свой
2002-12-03 19:21
2003.01.30
ras и телефоны





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский