Главная страница
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.013 c
4-21349
dumb
2002-08-19 16:37
2002.10.07
Как зарегистрировать COM объект кодом?


1-20968
Begin
2002-09-24 00:54
2002.10.07
Нужен совет по созданию компонента (если не жалко)


1-20955
Demiurg
2002-09-25 19:14
2002.10.07
Сохранение шрифта в поток.


3-20890
cutter-pro
2002-09-16 15:57
2002.10.07
Заставь дурака богу молиться он и лоб себе расшебет


14-21238
VictorT
2002-09-12 16:21
2002.10.07
Какая на ваш взгляд программа для синхронизации файлов наиболее..