Вниз
Скачать: CL | DM;

Поле=@метод?   Найти похожие ветки 

 
JaDS   (2004-06-13 15:03) [0]

Сначала код:

TWnd = object
private
 function WndProc(hwnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
public
 procedure Create;
end;

procedure TWnd.Create;
var
 wc: WNDCLASSEXA;
begin
 wc.lpfnWndProc:=@WndProc;
end;


Вобщем задача: присвоить полю класса адресс метода класса, делфя ругается, вроде бы там чтото надо делать с дерективами class - но ничего у меня не получилось, подскажите плз.


 
Palladin ©   (2004-06-13 15:27) [1]

во первых не @TWnd.WndProc, а во вторых lpfnWndProc не может быть назначен метод класса


 
JaDS   (2004-06-13 15:56) [2]

2Palladin:
Не понял ответа :(

1) "во первых не @TWnd.WndProc" - а что?

Замечательно работает код:

function WndProc(hwnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
end;

procedure TWnd.Create;
var
wc: WNDCLASSEXA;
begin
wc.lpfnWndProc:=@WndProc;
end;


Но проблема в том, что я бы хотел оконную процедуру инкапсулировать в классе, просто так удобней, имхо. Это удобней уже хотя бы по тому, что могу быть описаны TWnd1, TWnd2 - и чтоб интерфейс управления ими был один и тот же: Wnd.Create - и при этом у первого и второго окна - разные оконные процедуры.

2) lpfnWndProc не может быть назначен метод класса - почему?

Ведь насколько я понимаю, метод - это субпрограмма, причем делфя скрывает немного: метод - это смещение в таблице вызодов ячейки в которой лежит адрес вызова субпрограммы (или это только для виртуальных?)

Да ладно, это я отвлёкся, в любом случае гдето в памяти лежит мой метод Create, единственное что мне нужно - это адресс этого метода запихнуть в lpfnWndProc, но просто так это сделать нельзя, потому что насколько я понял, делфя скрыто во все методы передаёт Self - но ведь как то же делают что он туда не передаётся.

3) Вообще возможен такой код:

TWnd = object
private
 tmp: integer;
public
 procedure Create;
end;

procedure TWnd.Create;

 function WndProc(hwnd: HWND; uMsg: UINT; wParam: WPARAM;
   lParam: LPARAM): LRESULT;
 begin
   tmp:=1;
 end;

var
 wc: WNDCLASSEXA;
begin
 wc.lpfnWndProc:=@WndProc;
end;


Тут уже всё работает на ура, но:
а) как то всё равно не удобно, хотелось бы просто метод, хотя конечно уже инкапсуляция налицо
б) не совсем понял как WndProc узнаёт адресс tmp. Причём подозреваю что она его берёт из стека Create. Но тогда если я вызову (веней не я а винда) WndProc не из Create (верней делфя этого не даст сделать, но вот винда через указатель - легко) то тогда адрес tmp - будет ссылаться непойми на что. Надо это дело глянуть под отладчиком.

PS:
Вобщем если ли способы запихнуть в lpfnWndProc метод класса?


 
default ©   (2004-06-13 16:02) [3]

"Вобщем если ли способы запихнуть в lpfnWndProc метод класса?"
SizeOf(TMethod) <> SizeOf(Pointer)


 
evvcom ©   (2004-06-13 16:08) [4]


> lpfnWndProc не может быть назначен метод класса - почему?

Потому что в метод класса еще неявно передается ссылка на объект, поэтому аналогичной методу класса функцией будет

function WndProc(Self: TObject; hwnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;

кстати даже она не будет аналогичной. Здесь Self передастся через стек, а в методе класса через EAX.


 
evvcom ©   (2004-06-13 16:17) [5]

Кстати, тебе ничего не мешает переопределить procedure WndProc(var Message: TMessage); Это как раз то, что тебе в данном случае нужно.



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

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.034 c
1-1087154837
Hooked
2004-06-13 23:27
2004.06.27
Cоздание компонента в Run Time


1-1087301794
han
2004-06-15 16:16
2004.06.27
отлавливание момента перемещения контрола


14-1086388326
Soft
2004-06-05 02:32
2004.06.27
Я сдал кандидатский экзамен по философии на 5.


3-1086168355
din
2004-06-02 13:25
2004.06.27
Как создать запрос по датам


3-1086111654
Dmitry Vyacheslavovich
2004-06-01 21:40
2004.06.27
Like - Containing




   Наверх