Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.039 c
6-1083690307
Alpupil
2004-05-04 21:05
2004.06.27
Ping


3-1085736543
BPK
2004-05-28 13:29
2004.06.27
Функция с произвольной таблицей на выходе


1-1087298316
Apocalepse
2004-06-15 15:18
2004.06.27
Как сделатть свою программу поверх всех окон


3-1086247449
Mamed
2004-06-03 11:24
2004.06.27
AdoConnection


3-1086261004
Serg
2004-06-03 15:10
2004.06.27
Управление нижним скроллером в DBGrid





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский