Главная страница
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.021 c
6-84489
Akni
2003-04-17 13:49
2003.06.26
WSAEventSelect


3-83889
Levsha
2003-06-01 21:41
2003.06.26
Lookup field в DBgride, у когонить получалось???


14-84573
tahion2
2003-06-07 07:28
2003.06.26
Программа для пересылки сообщений и файлов по локальной сети


14-84536
Yakudza
2003-06-06 13:24
2003.06.26
Изгнание беса и лягушек


14-84575
Кен
2003-06-06 02:08
2003.06.26
В Windows найдены секретные API