Форум: "Основная";
Текущий архив: 2004.06.27;
Скачать: [xml.tar.bz2];
ВнизПоле=@метод? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.034 c