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

Вниз

SetWindowLong(hwnd,GWL_WNDPROC,Integer(P));   Найти похожие ветки 

 
I:D   (2003-04-25 18:09) [0]

Существует ли способ подложить под окно (контрол) оконную процедуру, реализованную в классе, причем так, чтоб работало?
Пробовал, но что происходит, не понимаю.

Есть, допустим, метод:

function TWnd.DefaultProc(handle: HWnd; message, wParam, lParam: Integer): LongInt; stdcall;
begin
Result := DefWindowProc(handle,message,wParam,lParam);
end;

Создаю окно, при этом lpfnWdnProc := @DefWindowProc;
Затем:
SetWindowLong(хвнд,GWL_WNDPROC,Integer(P));
где p - указатель на TWnd.DefaultProc.

Ставлю точку останова на строке
Result := DefWindowProc(handle,message,wParam,lParam);

Исполение доходит до неё, однако окно висит. Можно ли как-то выкрутиться, или я болею чем-то?


 
C   (2003-04-25 18:54) [1]


> где p - указатель на TWnd.DefaultProc.


TWnd.DefaultProc - это метод класса, а р должно указывать на статическую процедуру

function DefaultProc(handle: HWnd; message, wParam, lParam: Integer): LongInt; stdcall;
begin
Result := Wnd.DefaultProc(handle,message,wParam,lParam);
end;





 
Игорь Шевченко ©   (2003-04-25 19:43) [2]

MakeObjectInstance


 
Scorp   (2003-04-25 19:53) [3]

Значит так:
методы классов отличаются от обычных функций(процедур) только дополнительным неявним параметром, который передается последним и потом трактируэтся как Self. Поэтому тут только один вариант, не выводящий из рамок ООП:
Написать клас-метод класса, и передавать его параметром (класс-методы не принимают дополнитедьных параметров, а попросту трактируются, как стачичесские методы из пространства имени класса).


 
I:D   (2003-04-25 21:31) [4]

Ок, буду пробовать!


 
I:D   (2003-04-25 21:44) [5]


> C (25.04.03 18:54)

Согласен.


> Scorp (25.04.03 19:53)

Что-то не представлю пока!? На подумать.


> Игорь Шевченко © (25.04.03 19:43)
> MakeObjectInstance

Что-то у меня, наверное, хелп срубленный, не реагирует на %. Ага, врубился, ништяк, хорошо, просто ну надо допереть было. Спасибо Всем!

procedure Proc(var Msg: TMessage);
SetWindowLong(ХВНД, GWL_WNDPROC, Longint(MakeObjectInstance(Proc)));

Игорь, Спасибо.



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

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

Наверх




Память: 0.48 MB
Время: 0.017 c
1-84308
ASt
2003-06-15 02:49
2003.06.26
Непонятная ошибка при компиляции


14-84661
Malder
2003-06-10 12:13
2003.06.26
Просто нет слов


14-84750
agentru
2003-06-05 23:13
2003.06.26
Лучший сайт?


4-84827
Vitalik
2003-04-23 20:33
2003.06.26
ComboBox


9-83833
Argonaut
2003-01-13 17:56
2003.06.26
Управление мышью