Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

SetWindowLong(hwnd,GWL_WNDPROC,Integer(P));


I:D ©   (2003-04-25 18:09:00) 

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

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

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);

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


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


> 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)));

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


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

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


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

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


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

MakeObjectInstance


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


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


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

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




Наверх

Титульная страница Поиск, карта сайта Написать письмо