![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Обработчик сообщений [D5, Win95/98, WinME, NT4]
Yurko © (2003-01-19 01:26:00)Скажите, пожалуйста, почему изменение параметра обработчика сообщения никак не проявляется (он (параметр) ведь 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, то работает через раз (буквально).
Юрий Зотов (2003-01-21 08:49:00) [1]> Тогда, почему Msg - var?
Чтобы перед вызовом inherited можно было поменять WParam и LParam. А после вызова (или вместо него) - изменить Result.
Вот это все влияет. А изменение Msg - не влияет.
> Демонов Е.В. © (21.01.03 04:27)
Чтобы ничего не казалось, проще всего поставить в обработчике брейкпойнт и посмотреть стек вызовов.
Если точнее, обработчик вызывается ИЗ процедуры окна, только опосредованно, через Dispatch. Но вызов Dispatch практически всегда стоит в конце оконной процедуры - то есть, ее код к этому моменту уже отработал.
Иногда логика обработки сообщений бывает более хитрой (скажем, для CommCtrl), но в любом случае цепочка остается той же:
WndProc - Dispatch - Handler.
Демонов Е.В. (2003-01-21 04:27:00) [2]2Юрий Зотов © (20.01.03 05:51)
Ваш обработчик вызывается уже ПОСЛЕ того, как отработала процедура окна.
Разве - кажется этот обработчик вызывается до процедуры окна.
gsu (2003-01-21 02:03:00) [3]чтобы было удобно послать новое сообщение (-:|~
Yurko (2003-01-21 01:35:00) [4]Тогда, почему Msg - var?
Юрий Зотов (2003-01-20 05:51:00) [5]> чтобы процедура окна получила, в место этого сообщения, другое!
Ваш обработчик вызывается уже ПОСЛЕ того, как отработала процедура окна. Поэтому хоть меняйте Msg, хоть нет - все равно по inherited будет вызван унаследованный обработчик именно ЭТОГО сообщения.
А вот если не вызывать inherited, а вместо этого послать новое сообщение самому себе (или вызвать Perform), то получится как раз то, что Вам нужно.
Yurko (2003-01-20 02:09:00) [6]Да, но мне надо поменять параметры в Msg, чтобы процедура окна получила, в место этого сообщения, другое!
Романов Р.В. (2003-01-19 13:47:00) [7]Потому что по inherited происходит переход к методу WMLButtonDown предка. В котором выполняются действия связанные с нажатием ЛКМ на клиентской области. А то что вы поменяли параметры в Msg может привести только к неправильной обработке этого сообщения.
Yurko (2003-01-19 12:58:00) [8]Это шутка?
Song (2003-01-19 10:48:00) [9]inherited вперёд