Форум: "Основная";
Текущий архив: 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.007 c