Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.01.02;
Скачать: [xml.tar.bz2];

Вниз

Что вызывается вместо 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.034 c
1-1103116643
Zloy
2004-12-15 16:17
2005.01.02
Приветствую!!! Как сделать label ссылкой на инет ресурс


3-1102336931
Shved
2004-12-06 15:42
2005.01.02
Отбор в DBGrid


3-1102255866
Andrick
2004-12-05 17:11
2005.01.02
Битые индексы в dbf


14-1103055770
Kein
2004-12-14 23:22
2005.01.02
запись звука с центра


3-1102316702
Sergo
2004-12-06 10:05
2005.01.02
Тип поля





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