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

Вниз

Что вызывается вместо inherited в данном случае?   Найти похожие ветки 

 
Bless ©   (2004-12-16 17:24) [0]

В модуле Controls есть такая процедура:

описание в классе TWinControl

procedure WMKeyDown(var Message: TWMKeyDown); message WM_KEYDOWN;

реализация


procedure TWinControl.WMKeyDown(var Message: TWMKeyDown);
begin
 if not DoKeyDown(Message) then  inherited;
 UpdateUIState(Message.CharCode);
end;


Ни у кого из предков обработчика события WM_KEYDOWN не определено (если я не ошибаюсь, конечно).
Что вызывается в таком случае в качестве inherited?


 
Reindeer Moss Eater ©   (2004-12-16 17:32) [1]

Одноименный метод предка вызывается


 
TUser ©   (2004-12-16 17:35) [2]

Вызывается
procedure TWinControl.UpdateUIState(CharCode: Word);

PS. Дебажир рулут


 
Bless ©   (2004-12-16 17:51) [3]

Reindeer Moss Eater ©  (16.12.04 17:32) [1]>

Для обработчиков событий это не совсем так.
Цитата из справки:

When inherited has no identifier after it, it refers to the inherited method with the same name as the enclosing method or, if the enclosing method is a message handler, to the inherited message handler for the same message.


А никаких обработчиков этого события  у предков нет вроде.

TUser ©  (16.12.04 17:35) [2]>
Очень сильно сомневаюсь. С чего бы это вдруг?
Сомневаюсь, потому что поставил точку останова на начало UpdateUIState.  По нажатии f8 на строчке then inherited значение одной переменной в watch-окне изменилось, а в эту процедуру не заходило. Да и не должно, собственно.


 
Bless ©   (2004-12-16 18:04) [4]

Собственно, говоря, что вызывается я и так могу посмотреть. Но ПОЧЕМУ ЭТО вызывается, я не понимаю.

Конкретно проблема такая:
на форме лежит обычный компонент DBEditEh (без всякой привязки к датасетам, чистенький, только с палитры).
И на OnKeyDown для него написан обработчик:

procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
if key=VK_DOWN then selectnext(twincontrol(sender),false, true);
end;


Так вот, этот код не работает.
Как ясно из строчки обработчика, я хочу, чтоб при нажатии "стрелочки вниз" фокус получил следующий Control на форме (обыкновенный TEdit, например). Если присмотреться, то можно заметить, что фокус к следующему control-у все-таки перемещается, но тут же возвращается назад. Причем со стандартными компонентами (TEdit, TDBEdit) никаких проблем не возникает и все отрабатывает, как и ожидалось. Видимо, это глюк именно EhLib-овского Edit-а. Я захотел разобраться, в чем же конкретно проблема.
И возник сабжевый вопрос.
Потому что вместо inherited вызывается
procedure TCustomDBEditEh.DefaultHandler(var Message)
что мне совершенно непонятно: из TWinControl - в TCustomDBEditEh, вверх по иерархии! Как это объяснить?


 
Bless ©   (2004-12-16 18:07) [5]

Bless ©  (16.12.04 18:04) [4]>
Причем глучит именно со "стрелочкой вниз" (ну и не только с ней).
А вот с VK_RETURN отрабатывает нормально.
:(


 
jack128 ©   (2004-12-16 18:24) [6]

Bless ©   (16.12.04 18:04) [4]
из TWinControl - в TCustomDBEditEh, вверх по иерархии! Как это объяснить?

Почитай про виртуальные методы. Может сам поймешь ;-)


 
Bless ©   (2004-12-17 09:01) [7]

jack128[6]>

:(
А что, обработчики событий относятся к виртуальным методам?


 
Fay ©   (2004-12-17 09:26) [8]

2 Bless ©   (17.12.04 09:01) [7]
К динамическим, как тут недавно заметили (забыл, кто). Можешь проверить - inherited запросто пашет.


 
Vlchel   (2004-12-17 09:27) [9]

Внимательно почитайте справку приведенную здесь.
- if the enclosing method is a message handler, to the inherited message handler for the same message
Вызывается обработчик сообщения с темже именем, это совсем не то, что обработчик события (события это к дельфи а сообщения ето к винде)

По F8 в процедуру не зайдешь, только по F7.


 
Bless ©   (2004-12-17 09:39) [10]

jack128 ©  (16.12.04 18:24) [6]
Спасибо. Разобрался.
Внамательное прочтение хелпа в нужном месте, с намеком на виртуальные методы привели к просветлению.


 
Bless ©   (2004-12-17 09:40) [11]

Vlchel  (17.12.04 09:27) [9]

Внимательно прочитайте свою же цитату :)
"message handler for the same message" - обработчика для того же события.
А называться они могут как угодно.


 
Bless ©   (2004-12-17 09:44) [12]

На Bless [11] не реагируйте. Ибо бред.


 
PVOzerski ©   (2004-12-17 10:30) [13]

У TObject есть такой метод: DefaultHandler. Вот он-то и вызывается как inherited, если явного перекрытого обработчика предка нет. Проверено экспериментально.



Страницы: 1 вся ветка

Текущий архив: 2005.01.02;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.047 c
1-1103411650
pika
2004-12-19 02:14
2005.01.02
Flash MX


3-1101976169
Sholoma
2004-12-02 11:29
2005.01.02
MySQL


3-1101292107
zom
2004-11-24 13:28
2005.01.02
Insert большого количества строк... как быстрее?


1-1103540302
Pavelkq
2004-12-20 13:58
2005.01.02
Break из For


1-1103388317
Ivolg
2004-12-18 19:45
2005.01.02
Компоненты