Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.01.30;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.46 MB
Время: 0.008 c
3-96584
Sedunov Vitaly
2003-01-13 11:04
2003.01.30
Как DBGridEh определить позицию относительно экрана?


8-96883
Lnstr
2002-10-14 14:02
2003.01.30
TMediaplayer - вывод AVI на панель в уменьшенном масштабе


14-96948
Tsr
2003-01-11 12:11
2003.01.30
Как правильно скачать апдейты для Windows?


6-96941
A.Perez
2002-11-11 22:03
2003.01.30
net send


6-96900
Groove
2002-12-02 07:02
2003.01.30
Пример проги типа ICQ, только для локалки





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