Форум: "Начинающим";
Текущий архив: 2010.01.17;
Скачать: [xml.tar.bz2];
ВнизWndProc vs WindowProc Найти похожие ветки
← →
Molchanov (2009-11-26 19:36) [0]Господа Мастера!
Есть потребность обрабатывать сообщения в главном окне приложения.
Создать для всех сообщений обработчики типа
procedure WMXXXX(var Msg: TMessage); message WM_XXXX;
невозможно, т.к. часть из них регистрируется RegisterWindowMessage.
Нашел два варианта.
Вариант 1:
TForm1 = class(TForm)
...
protected
procedure WndProc(var Message: TMessage); override;
...
end;
procedure TForm1.WndProc(var Message: TMessage);
begin
// Processing custom messages
// ...
inherited WndProc(Message);
end;
Вариант 2:
OldWindowProc: Pointer;
function NewWindowProc(Handle: HWND; uMsg: LongInt; ParamW: WPARAM; ParamL: LPARAM): Longint stdcall;
begin
// Processing custom messages
// ...
Result := CallWindowProc(OldWindowProc, Handle, uMsg, ParamW, ParamL);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
...
OldWindowProc := Pointer(SetWindowLong(Handle, GWL_WNDPROC, LongInt(@NewWindowProc)));
...
end;
Чем они принципиально отличаются и какой из них предпочтителен?
Очевидно, что первый вариант предоставляет доступ к полям и методам формы, а что можно сказать в пользу второго?
← →
Игорь Шевченко © (2009-11-26 19:51) [1]
> невозможно, т.к. часть из них регистрируется RegisterWindowMessage
procedure Defaulthandler (var Message); override;
http://faqs.org.ru/progr/pascal/fcdelphi.htm
← →
Molchanov (2009-11-26 20:01) [2]
> procedure Defaulthandler (var Message); override;
Перекрывать Defaulthandler лучше чем WndProc?
Чем лучше?
← →
Игорь Шевченко © (2009-11-26 20:09) [3]
> Чем лучше?
вопрос религии.
> Чем они принципиально отличаются и какой из них предпочтителен?
Они принципиально отличаются тем, что в случае перекрытия WndProc необходимо создать наследника класса, а при замене WindowProc этого делать не обязательно.
RTFS: Controls.pas
← →
Leonid Troyanovsky © (2009-11-27 08:58) [4]
> Molchanov (26.11.09 19:36)
> и методам формы, а что можно сказать в пользу второго?
Второй вариант - просто ошибочен.
Как уже сказал Игорь, надо обратить внимание на свойство WindowProc.
--
Regards, LVT.
← →
Григорьев Антон © (2009-11-27 09:40) [5]Посмотрите http://www.delphikingdom.com/asp/viewitem.asp?catalogid=169#07 - там билже к концу раздела приводится список всех методов перехвата сообщений в VCL с обсуждением их достоинств и недостатков.
А SetWindowLong совместо с VCL лучше не использовать - там тоже написано, почему.
← →
Molchanov (2009-11-27 09:56) [6]Спасибо откликнувшимся за содержательные ответы
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2010.01.17;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.004 c