Главная страница
    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
14-96979
korvet
2002-12-12 17:08
2003.01.30
Server windows 2000


14-96961
ferrik
2003-01-12 18:32
2003.01.30
Компоненты


7-97045
BJValentine
2002-11-18 18:38
2003.01.30
Список файлов в каталоге


6-96907
NeXWiZ
2002-12-03 20:24
2003.01.30
PINGwini


14-97012
blackman
2003-01-13 16:41
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский