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

Вниз

Обработчик сообщений   Найти похожие ветки 

 
Yurko   (2003-01-19 01:26) [0]

Скажите, пожалуйста, почему изменение параметра обработчика сообщения никак не проявляется (он (параметр) ведь var)?
Если пишу:
...
private
procedure WMLButtonDown(var Msg: TMessage); message WM_LBUTTONDOWN;
...
procedure TfmMain.WMLButtonDown(var Msg: TMessage);
begin
SendMessage(Handle, WM_NCLBUTTONDOWN, HTCAPTION, Msg.LParam);
end;
...

, то все работает.
Но если так:
...
private
procedure WMLButtonDown(var Msg: TMessage); message WM_LBUTTONDOWN;
...
procedure TfmMain.WMLButtonDown(var Msg: TMessage);
begin
Msg.Msg := WM_NCLBUTTONDOWN;
Msg.WParam := HTCAPTION;
// inherited;
end;
...

, то ничего не происходит (хоть Msg описан как var).
Если раскоментить inherited, то работает через раз (буквально).


 
Song   (2003-01-19 10:48) [1]

inherited вперёд


 
Yurko   (2003-01-19 12:58) [2]

Это шутка?


 
Романов Р.В.   (2003-01-19 13:47) [3]

Потому что по inherited происходит переход к методу WMLButtonDown предка. В котором выполняются действия связанные с нажатием ЛКМ на клиентской области. А то что вы поменяли параметры в Msg может привести только к неправильной обработке этого сообщения.


 
Yurko   (2003-01-20 02:09) [4]

Да, но мне надо поменять параметры в Msg, чтобы процедура окна получила, в место этого сообщения, другое!


 
Юрий Зотов   (2003-01-20 05:51) [5]

> чтобы процедура окна получила, в место этого сообщения, другое!

Ваш обработчик вызывается уже ПОСЛЕ того, как отработала процедура окна. Поэтому хоть меняйте Msg, хоть нет - все равно по inherited будет вызван унаследованный обработчик именно ЭТОГО сообщения.

А вот если не вызывать inherited, а вместо этого послать новое сообщение самому себе (или вызвать Perform), то получится как раз то, что Вам нужно.


 
Yurko   (2003-01-21 01:35) [6]

Тогда, почему Msg - var?


 
gsu   (2003-01-21 02:03) [7]

чтобы было удобно послать новое сообщение (-:|~


 
Демонов Е.В.   (2003-01-21 04:27) [8]

2Юрий Зотов © (20.01.03 05:51)

Ваш обработчик вызывается уже ПОСЛЕ того, как отработала процедура окна.

Разве - кажется этот обработчик вызывается до процедуры окна.



 
Юрий Зотов   (2003-01-21 08:49) [9]

> Тогда, почему Msg - var?

Чтобы перед вызовом inherited можно было поменять WParam и LParam. А после вызова (или вместо него) - изменить Result.

Вот это все влияет. А изменение Msg - не влияет.


> Демонов Е.В. © (21.01.03 04:27)

Чтобы ничего не казалось, проще всего поставить в обработчике брейкпойнт и посмотреть стек вызовов.

Если точнее, обработчик вызывается ИЗ процедуры окна, только опосредованно, через Dispatch. Но вызов Dispatch практически всегда стоит в конце оконной процедуры - то есть, ее код к этому моменту уже отработал.

Иногда логика обработки сообщений бывает более хитрой (скажем, для CommCtrl), но в любом случае цепочка остается той же:
WndProc - Dispatch - Handler.



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

Форум: "Основная";
Текущий архив: 2003.01.30;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.008 c
1-96735
Только начал изучать
2003-01-22 13:17
2003.01.30
Помогите пожалуйста с кодом.....


1-96657
nikulin
2003-01-21 15:29
2003.01.30
Поток


1-96668
Black Tiger
2003-01-21 04:33
2003.01.30
Edit


14-97001
MAXL
2003-01-12 17:32
2003.01.30
Защита ЕХЕшника от взлома.......


1-96711
DTK
2003-01-20 15:17
2003.01.30
Работа с рисунками





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