Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-20982
Separator
2002-09-26 14:34
2002.10.07
Странная ситуация с Application.Title


4-21301
Sour
2002-08-19 14:19
2002.10.07
Создать socket


4-21333
stainer
2002-08-21 14:32
2002.10.07
не получается изменить стиль дилогового окна


1-21086
Sergey V. Shadrin
2002-09-25 08:08
2002.10.07
найти файл.


3-20905
romannorth
2002-09-16 09:24
2002.10.07
ADO SEEK





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский