Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.02.03;
Скачать: [xml.tar.bz2];

Вниз

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

 
Юрий Федоров   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.01 c
14-5273
Mika
2003-01-17 14:02
2003.02.03
Установка компонента в Delphi 6


14-5154
Sabor
2003-01-17 20:36
2003.02.03
form


1-4833
diks
2003-01-24 14:03
2003.02.03
Опен диалог


14-5198
gloogle
2003-01-12 19:40
2003.02.03
Тесты


4-5327
a-leksey
2002-12-18 14:36
2003.02.03
Запаковать 3х байтный цвет в 2х. (24милиона ц. в 16милн.)





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