Главная страница
    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.01 c
1-96876
jen_bond
2003-01-20 17:06
2003.01.30
Распознование штрих кода сканером!


14-96995
Фтпуд
2003-01-13 14:07
2003.01.30
Господа, не подскажите ссылку на компонент


1-96793
alexnmsk
2003-01-22 15:40
2003.01.30
Как сделать dll


14-96990
RV
2003-01-13 10:34
2003.01.30
да, Всех с Новым Годом!


3-96622
YurikV
2003-01-14 09:57
2003.01.30
ODBC & Access





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