Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.06.27;
Скачать: 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 вся ветка

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

Наверх




Память: 0.48 MB
Время: 0.023 c
3-1086168355
din
2004-06-02 13:25
2004.06.27
Как создать запрос по датам


14-1087036630
Vasya.ru
2004-06-12 14:37
2004.06.27
вопрос может и глупый, но...


1-1086845576
sergt
2004-06-10 09:32
2004.06.27
DateTimePicker


6-1083718856
K
2004-05-05 05:00
2004.06.27
WinSock


1-1087123030
killer
2004-06-13 14:37
2004.06.27
Как можно из буфера обмена в Image вставить фотографию?