![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Что вызывается вместо inherited в данном случае?
Bless © (2004-12-16 17:24:00)В модуле 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?
PVOzerski (2004-12-17 10:30:00) [1]У TObject есть такой метод: DefaultHandler. Вот он-то и вызывается как inherited, если явного перекрытого обработчика предка нет. Проверено экспериментально.
Bless (2004-12-17 09:44:00) [2]На Bless [11] не реагируйте. Ибо бред.
Bless (2004-12-17 09:40:00) [3]Vlchel (17.12.04 09:27) [9]
Внимательно прочитайте свою же цитату :)
"message handler for the same message" - обработчика для того же события.
А называться они могут как угодно.
Bless (2004-12-17 09:39:00) [4]jack128 © (16.12.04 18:24) [6]
Спасибо. Разобрался.
Внамательное прочтение хелпа в нужном месте, с намеком на виртуальные методы привели к просветлению.
Vlchel (2004-12-17 09:27:00) [5]Внимательно почитайте справку приведенную здесь.
- if the enclosing method is a message handler, to the inherited message handler for the same message
Вызывается обработчик сообщения с темже именем, это совсем не то, что обработчик события (события это к дельфи а сообщения ето к винде)
По F8 в процедуру не зайдешь, только по F7.
Fay (2004-12-17 09:26:00) [6]2 Bless © (17.12.04 09:01) [7]
К динамическим, как тут недавно заметили (забыл, кто). Можешь проверить - inherited запросто пашет.
Bless (2004-12-17 09:01:00) [7]jack128[6]>
:(
А что, обработчики событий относятся к виртуальным методам?
jack128 (2004-12-16 18:24:00) [8]Bless © (16.12.04 18:04) [4]
из TWinControl - в TCustomDBEditEh, вверх по иерархии! Как это объяснить?
Почитай про виртуальные методы. Может сам поймешь ;-)
Bless (2004-12-16 18:07:00) [9]Bless © (16.12.04 18:04) [4]>
Причем глучит именно со "стрелочкой вниз" (ну и не только с ней).
А вот с VK_RETURN отрабатывает нормально.
:(
Bless (2004-12-16 18:04:00) [10]Собственно, говоря, что вызывается я и так могу посмотреть. Но ПОЧЕМУ ЭТО вызывается, я не понимаю.
Конкретно проблема такая:
на форме лежит обычный компонент 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 17:51:00) [11]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-окне изменилось, а в эту процедуру не заходило. Да и не должно, собственно.
TUser (2004-12-16 17:35:00) [12]Вызывается
procedure TWinControl.UpdateUIState(CharCode: Word);
PS. Дебажир рулут
Reindeer Moss Eater (2004-12-16 17:32:00) [13]Одноименный метод предка вызывается