Форум: "Основная";
Текущий архив: 2002.10.07;
Скачать: [xml.tar.bz2];
ВнизВведение новой оконной процедуры (непонятка) Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c