Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.10.07;
Скачать: CL | DM;

Вниз

Введение новой оконной процедуры (непонятка)   Найти похожие ветки 

 
1g0r ©   (2002-09-24 17:51) [0]

Вопрос следующий: как ввести новую оконную процедуру, если WndProc это метод класса (в моем примере это Tlvsimply.WndProc()).
Ниже даю пример (надеюсь он разъяснит суть вопроса :) )...
При попытке установить новую процедуру компилятор выдает ошибку "Variable required" (как я понял, сообщение гласит о невозможности определения адреса данной процедуры)
Как с этим бороться или как это обойти.

unit lvsimply;

interface

uses Windows, Messages, CommCtrl;

interface

Tlvsimply = class
private
OldWndProc: Pointer;
FHandle: THandle;
public
constructor Create; virtual;
destructor Destroy; override;
function WndProc(Window : HWnd; Message, WParam : Word;
LParam : LongInt): LongInt; stdcall;
published
property Handle: THandle read FHandle write FHandle;
end;

implementation

constructor Tlvsimply.Create;
begin
FHandle := CreateWindow(WC_LISTVIEW, nil,
WS_OVERLAPPED or WS_POPUP,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
0, 0,
HInstance, nil);


OldWndProc := Pointer(SetWindowLong(FHandle, GWL_WNDPROC, LongInt(@WndProc))) //<< @WndProc ??
end;

destructor Tlvsimply.Destroy;
begin
SetWindowLong(FHandle, GWL_WNDPROC, LongInt(OldWndProc));
if FHandle <> 0 then DestroyWindow(FHandle)
end;

function Tlvsimply.WndProc(Window : HWnd; Message, WParam : Word;
LParam : LongInt): LongInt; stdcall;
begin
Result := CallWindowProc(OldWndProc, FHandle, Message, WParam, LParam)
end;

initialization

InitCommonControls();

end.


 
qube ©   (2002-09-24 17:54) [1]

Указатель на метод класса -- 8 байт, вместо обычного указателя подставлять нельзя


 
MBo ©   (2002-09-24 17:58) [2]

cм. TControl.WindowProc, TWndMethod.
без использования этого придется MakeObjectInstance делать


 
qube ©   (2002-09-24 18:00) [3]

2 MBo

Судя по примеру, прога-то на АПИ. Где уж там ТКонтрол.


 
MBo ©   (2002-09-24 18:02) [4]

>qube
ну тогда только MakeObjectInstance


 
qube ©   (2002-09-24 18:05) [5]

Прошу прощения за вопросы не в своем топике, но что такое MakeObjectInstance (полный поиск по хелпу ничего не дал).


 
1g0r ©   (2002-09-24 18:13) [6]

как я понял мне как минимум надо подключать Forms или его перелопатить :((
Ну ладно спасибо


 
MBo ©   (2002-09-24 18:16) [7]

Недокументировано, субклассинг оконной процедуры для объектов.
Есть в исходниках VCL.
Примеры применения http://www.torry.net/vcl/system/draganddrop/swissexplorerdrop.zip
и
http://www.delphikingdom.com/treasury/combo.htm


 
qube ©   (2002-09-24 18:16) [8]

да необязательно.

сделай новую оконную процедуру обычной процедурой, которая вызывает нужный метод нужного объекта, к примеру.


 
1g0r ©   (2002-09-24 18:17) [9]

qube <
смотри Forms.pas


 
1g0r ©   (2002-09-24 18:23) [10]

не совсем то что хотел, но наверное так и сделаю :)

Еще раз спасибо


 
Старый паскалист   (2002-09-24 18:30) [11]

2qube © (24.09.02 18:05)

Оконная процедура в Виндах - это ф-я, а не метод объекта.
Такое положение вещей не очень согласуется с ООП, поскольку
по идее оконная процедура должна быть методом объекта. Если бы
в оконной процедуре был бы пользовательский параметр, то
это легко можно было бы преодолеть (передав в пользовательский параметр Self), как, например, это сделано с
TThread"ом (Ведь ф-я потока в Виндах - тоже не метод).

В случае с оконной процедурой дело обстоит сложнее.
Представь себе ф-ю для каждого конкретного экземпляра
TWinControl с его методом:

function WinProc1(...): LResult;
begin
ConcreteExemplarOfAnyWinControl.WndProc(...);
// И на каждый экземпляр (не класс) отдельная ф-я.
// Адрес экземпляра жёстко зашит в коде
end;

function WinProc2(...): LResult;
begin
AnotherExemplarOfAnyWinControl.WndProc(...);
end;
...

Ф-я MakeObjectInstance как раз и генерирует в рантайме код
такой (или примерно такой) переходной ф-и для каждого экземпляра.

Такие ф-и и являются настоящими оконными процедурами,
указатель на которые имеет Виндовс.



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

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

Наверх




Память: 0.49 MB
Время: 0.022 c
14-21215
T2
2002-09-11 15:45
2002.10.07
To AL2002


1-20964
tytus
2002-09-26 12:07
2002.10.07
Доступ к папке.


14-21275
Andrey
2002-09-10 17:20
2002.10.07
Идея по использованию UDF


1-21136
Wolverin
2002-09-23 20:38
2002.10.07
Срочно нужна помощь


3-20940
Kurt
2002-08-29 17:34
2002.10.07
текст SQL-запроса прямо передается на сервер (случай работы с MS