Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.015 c
1-96814
beginer_
2003-01-20 11:01
2003.01.30
Как запустить программу и дождаться её завершения?


1-96808
Smok_er
2003-01-19 17:18
2003.01.30
MDIForm without Child Captions


4-97105
feniks1
2002-12-14 17:39
2003.01.30
как быть без компонентов


1-96716
alextov
2003-01-21 16:18
2003.01.30
Как можно поместить курсор в любую точку документа MSWord?


6-96905
TankMan
2002-11-27 03:06
2003.01.30
Как узнать свой IP в сетке а не в Инете....




   Наверх