Форум: "Основная";
Текущий архив: 2005.01.02;
Скачать: [xml.tar.bz2];
ВнизЧто вызывается вместо inherited в данном случае? Найти похожие ветки
← →
Bless © (2004-12-16 17:24) [0]В модуле Controls есть такая процедура:
описание в классе TWinControlprocedure 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.034 c