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

Вниз

Вопрос глупый, но что-то никак не могу сообразить:   Найти похожие ветки 

 
Юрий Федоров ©   (2003-01-23 19:50) [0]

как в форме отлавливать сообщения, приходящие на handle"ы ее Сontrol"ов ?


 
leonon   (2003-01-23 20:02) [1]

Если ты знаешь какое конкретно сообщение тебе надо отловить, то объявляешь, например

TForm ...
private
procedure WMClose(var a: TWMClose); message WM_CLOSE;
...
end;

Далее реализуешь этот обработчик.

Если надо отлавливать любые сообщения, то тебе надо делать подмену оконной процедуры.


 
Юрий Федоров ©   (2003-01-23 20:04) [2]

>leonon
Меня интересует конкретное сообщение, но приходит оно не на форму, а на контрол в форме(например на Edit1.handle)


 
leonon   (2003-01-23 20:08) [3]

По-моему, сообщение получает форма, а потом его передает всем своим контролам. Или я не прав?


 
MBo ©   (2003-01-23 20:10) [4]

Application.OnMessage?


 
Юрий Зотов ©   (2003-01-23 22:04) [5]

> leonon (23.01.03 20:08)

Не прав. Сообщение приходит тому окну, которому оно адресовано. В некоторых (но далеко не во всех) случаях оно действительно сначала "проходит через форму", но это скорее исключение, чем правило.

> Юрий Федоров

Application.OnMessage.

А в нем:
FindControl(Msg.HWnd) - контрол-адресат, а его Owner (приведенный к TForm)- нужная Вам форма.


 
Романов Р.В. ©   (2003-01-23 22:22) [6]

А что за сообщение то? OnMessage не все ловит. Может оконную процедуру едита подменить?


 
Guerrillero ©   (2003-01-23 22:24) [7]

можно заменить его оконную процедуру WindowProc на свою


 
Игорь Шевченко ©   (2003-01-24 10:22) [8]

Если на конкретный контрол, то Guerrillero © (23.01.03 22:24)

Если на все, то примерно так:


procedure TfMain.Loaded;
var
I : Integer;
begin
inherited;
FHooks := THSControlMessagePumpHookList.Create;
FHooks.Add(THSControlMessagePumpHook.Create(Self));
for I:=0 to Pred(ComponentCount) do
if Components[I] IS TControl then
FHooks.Add(THSControlMessagePumpHook.Create(TControl(Components[I])));
end;


unit HSControlMessagePumpHook;

interface
uses
HSObjectList, Controls, Messages;

type
THSControlMessagePumpHook = class
private
FControl : TControl;
FOldWndProc : TWndMethod;
procedure HookWndProc (var Message : TMessage);
public
constructor Create (AControl : TControl);
end;

THSControlMessagePumpHookList = class(THSObjectList)
end;

const EnableMsgHook = FALSE;

implementation
uses
Windows, SysUtils, MessageLogger;

{ THSControlMessagePumpHook }

constructor THSControlMessagePumpHook.Create(AControl: TControl);
begin
FControl := AControl;
FOldWndProc := FControl.WindowProc;
FControl.WindowProc := HookWndProc;
end;

procedure THSControlMessagePumpHook.HookWndProc(var Message: TMessage);
begin
if Assigned(FControl) AND (FControl IS TWinControl) AND
TWinControl(FControl).HandleAllocated then
LogMessage(Format("%s.WndProc", [FControl.Name]),
TWinControl(FControl).Handle, Message.Msg,
Message.WParam, Message.LParam)
else
LogMessage(Format("%s.WndProc", [FControl.Name]),
0, Message.Msg,
Message.WParam, Message.LParam);
FOldWndProc(Message);
LogMsgReturn(Format("%s.WndProc", [FControl.Name]), Message);
end;

end.


 
Юрий Федоров ©   (2003-01-24 10:30) [9]

>Романов Р.В. © (23.01.03 22:22)
>Guerrillero © (23.01.03 22:24)
Подменять придется все WindowProc(для всех контролов), при этом запоминать указатели на старые и вызывать их, что достаточно муторно

>MBo © (23.01.03 20:10)
>Юрий Зотов © (23.01.03 22:04)
>Игорь Шевченко © (24.01.03 10:22)
Попробую. О результатах доложу :)



 
Юрий Федоров ©   (2003-01-24 10:34) [10]

Application.OnMessage подошло.
Спасибо




Страницы: 1 вся ветка

Текущий архив: 2003.02.03;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.018 c
7-5312
Shtock
2002-11-26 11:08
2003.02.03
инициализация модема


3-4753
b_baranov
2003-01-16 01:34
2003.02.03
трудности в написании SQL запроса


7-5291
FoxM
2002-11-21 23:24
2003.02.03
%system root%


4-5325
EndDie
2002-12-19 09:54
2003.02.03
API - caption кнопки.


3-4803
Rustik
2003-01-15 13:29
2003.02.03
Не вытаскиваются данные из DBText с предыдущей формы