![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
нужно ли перекрывать функцию? [D7, WinXP]
sda © (2006-04-24 19:47:00)Есть мой компонент, хочу написать наследника... Там есть процедуры, которые ловят сообщения CM_MOUSEENTER, CM_MOUSELEAVE:
TMyComp = class(TCustomControl)
private
procedure CMMouseEnter(var Message: TMessage); Message CM_MOUSEENTER;
procedure CMMouseLeave(var Message: TMessage); Message CM_MOUSELEAVE;
В наследнике эти процедуры нужно немного переделать таким образом:
TMyNewComp = class(TMyComp)
private
procedure CMMouseEnter(var Message: TMessage); Message CM_MOUSEENTER;
procedure CMMouseLeave(var Message: TMessage); Message CM_MOUSELEAVE;
.....
procedure TMyNewComp.CMMouseEnter(var Message: TMessage);
begin
if <условие> then
inherited;
end;
procedure TMyNewComp.CMMouseLeave(var Message: TMessage);
begin
if <условие> then
inherited;
end;
т.е. если выполняется какое-то условие то выполнить все те действия которые в компоненте родителе в этой процедуре... А вопрос такой, в таком случае нужно ли в родителе объявлять эти процедуры как virtual, а в наследнике override?
vl_chel (2006-04-25 12:39:00) [1]Настоятельно советую посмотреть как сделано подобное в VCL
Обявлена процедура MouseEnter(....); virtual;
в ней прописана вся работа с объектом
ее вызов в процедуре
procedure MyNewMouseEnter(var Message: TMessage); Message CM_MOUSEENTER;
которая занимается обработкой непосредственно сообщения и передачей данных в MouseEnter
при наследовании переопределяется теoverride
icWasya (2006-04-25 10:11:00) [2]>> нужно ли в родителе объявлять эти процедуры как virtual, а в наследнике override?
>Нет
более того, в наследнике эти процедуры можно объявить даже с другими именами
TMyNewComp = class(TMyComp)
private
procedure MyNewMouseEnter(var Message: TMessage); Message CM_MOUSEENTER;
procedure MyNewMouseLeave(var Message: TMessage); Message CM_MOUSELEAVE;
, и всё будет правильно работать. Главное, правильно указать код сообщения (CM_MOUSEENTER,CM_MOUSELEAVE)
jack128 (2006-04-24 20:24:00) [3]обработчики сообщений всегда отрабатывают как динамические методы. никакие virual/dymanic/override к ним не применимы..
Мефисто (2006-04-24 19:55:00) [4]>> нужно ли в родителе объявлять эти процедуры как virtual, а в наследнике override?
Нет