Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.08.15;
Скачать: [xml.tar.bz2];

Вниз

WindowProc внутри объекта   Найти похожие ветки 

 
SPeller   (2002-07-30 05:58) [0]

Всем доброго времени суток! У меня такой вопрос: Можно ли назначить окну оконную процедуру которая внутри объекта ?


 
MBo   (2002-07-30 06:42) [1]

Я правильно понял вопрос???


private
OldProc: TWndMethod;
procedure NewProc(var msg: TMessage);

procedure TForm1.FormCreate(Sender: TObject);
begin
OldProc := ScrollBox1.WindowProc;
ScrollBox1.WindowProc := NewProc;
end;

procedure TForm1.NewProc(var msg: TMessage);
begin
OldProc(msg);
case msg.Msg of
WM_VSCROLL: label1.caption := "vert";
WM_HSCROLL: label1.caption := "horiz";
end;
end;


 
SPeller   (2002-07-30 07:55) [2]

Правильно, только реализация не та. Я имел ввиду (почему сразу не написал?:) виндовую процедуру :
function (Handle, Message:cardinal; wParam, lParam:integer);


 
SPeller   (2002-07-30 07:56) [3]

Дело в том, что я не использую VCL.


 
Starkom   (2002-07-30 08:09) [4]

Я может неправильно понял, но в исходниках TApplication в конструкторе (вызов CreateHandle)создается окно с оконной функцией WndProc, которая является методом самого TApplication.
Хотя, возможно, я не шарю, ведь TApplication это VCL. Посмотри, может, поможет.


 
Юрий Зотов   (2002-07-30 09:14) [5]

С методом объекта не получится из-за неявного параметра Self.

Но если Вы не используете VCL, то почему бы не назначить окну обычную функцию, не метод объекта (SetWindowLong с GWL_WNDPROC)? Это точно пройдет.


 
Starkom   (2002-07-30 09:18) [6]

2 Юрий Зотов:

"С методом объекта не получится из-за неявного параметра Self."

А поподробнее нельзя?
Вроде, в TApplication.CreateHandle именно SetWindowLong вызывается с методом класса TApplication.


 
SPeller   (2002-07-30 09:22) [7]

2 Юрий Зотов © (30.07.02 09:14)

Вообще это можно сделать, но я не знаю как. Метод объекта, он ведь тоже содержит код, значит можно как-то достать указатель на этот код.
?


 
Starkom   (2002-07-30 09:25) [8]

да блин, WndProc - метод TApplication

FObjectInstance := MakeObjectInstance(WndProc);
FHandle := CreateWindow(WindowClass.lpszClassName, PChar(FTitle), ляля
SetWindowLong(FHandle, GWL_WNDPROC, Longint(FObjectInstance));

то, что происходит в MakeObjectInstance выше моего понимания :)


 
Starkom   (2002-07-30 09:29) [9]

http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1028003759&n=0
тут кстати есть код :)
надо в чужие вопросы иногда заглядывать :)


 
Юрий Зотов   (2002-07-30 09:38) [10]

Да, такой способ тоже известен. В конце не забудьте восстановить все назад и вызвать FreeObjectInstance.

Но непонятно - Вы же говорите, что не используете VCL, так откуда же объект появился?


 
SPeller   (2002-07-30 10:05) [11]


> Юрий Зотов © (30.07.02 09:38)
> Но непонятно - Вы же говорите, что не используете VCL, так
> откуда же объект появился?

Гы-гы.. :-))))

MyObject = Object
...

Это тоже к VCL относится? :-)))


 
Юрий Зотов   (2002-08-03 01:32) [12]

Если Вы имели в виду TMyObject = class (TObject), то ДА, ЭТО ОТНОСИТСЯ К VCL. Даже несмотря на "Гы-гы.." и смайлики.

Слово "Visual" не должно вводить в заблуждение. Это всего лишь не вполне точное название, а СУТЬ - в коде.

Или я что-то не так понял?


 
Dr_Mike   (2002-08-03 15:55) [13]

Кстати, писать в верхнем регистре очевидно неправильные вещи не стоило бы :))

TObject - это основополагающий элемент языка Object Pascal, и разработчики поместили его в модули библиотеки времени выполнения, описывается он в модуле System и к VCL никакого отношения не имеет...


 
Dimka Maslov   (2002-08-03 16:26) [14]

В MakeObjectInstance оконная процедура связывается с объектом. В памяти динамически создаётся код, который принимает параметры оконной процедуры, создаёт из них запись типа TMessage и передаёт их "оконной" функции объекта, которая уже ищет нужный обработчик сообщения для объекта. Весь этот код находится в модуле Forms, следовательно вся VCL всё равно попадёт в программу. Чтобы этого избежать, нужно выдрать из модуля Forms весь код, связанный с MakeObjectInstance.


 
Юрий Зотов   (2002-08-03 16:26) [15]

> разработчики поместили его в модули библиотеки времени выполнения

И что же с того? От этого он перестал быть частью VCL?

В run-time модулях запросто могут жить и визуальные объекты. Они тоже перестают быть частью VCL?

Разве VCL - это только то, что входит в палитру компонентов IDE?

В Borland так не считают. Открываем содержание справки Delphi, раскрываем пункт "Visual Component Library Reference", затем подпункт "Routines Listing by Unit" - и в списке модулей видим и SysUtils, и даже System. То есть, сама Borland рассматривает эти модули, как часть VCL.

А то, что они входят в RTL, говорит только о том, что VCL состоит как из run-time, так и из design-time модулей. Вот и все.

Так что "очевидно неправильные вещи", согласно структуре справки Delphi, являются не менее очевидно правильными. В любом регистре.
:о)



 
Старый паскалист   (2002-08-03 16:33) [16]

Оказывается, я всю жизнь говорил прозой...

Слишком уж ёмким понятие VCL получается.
VCL, VCL и ничего кроме VCL :-(


 
Юрий Зотов   (2002-08-03 16:44) [17]

> Старый паскалист (03.08.02 16:33)

Еще раз посмотрел в той же справке - модули Windows, ShellAPI и им подобные в VCL не числятся.

Так что не все так плохо, коллега - системные библиотеки частью VCL все же не являются.
:о)

Что дает нам, старым паскалистам, некоторую отдушину.


 
PVOzerski   (2002-08-03 17:15) [18]

А теперь давайте всё разложим по полочкам.
>Если Вы имели в виду TMyObject = class (TObject), то ДА, ЭТО
>ОТНОСИТСЯ К VCL. Даже несмотря на "Гы-гы.." и смайлики.

1) использование классов само по себе использование VCL не означает. VCL - это библиотека, классы - часть синтаксиса Object Pascal, с использованием которой, в частности, написана VCL. Тип tObject определён в модуле system. При всём уважении к Ю.Зотову, вынужден поддержать "Гы-гы..".

2) Метод в классе - штука довольно забавная. Во-первых, имеет неявный параметр Self, во-вторых, процедурная переменная procedure/function(...)of object - это, в отличие от обычной процедурной переменной, не указатель на точку входа, а массив из двух указателей - на точку входа и на блок данных. Исходя из изложенного, очевидно, что использовать метод в качестве WndProc практически невозможно.


 
Юрий Зотов   (2002-08-03 17:36) [19]

> PVOzerski © (03.08.02 17:15)

> VCL - это библиотека, классы - часть синтаксиса Object Pascal

Безусловно. Поэтому, если мы используем СВОЮ иерархию классов, ни от чего не отнаследованную, а полностью и самого нуля ручками написанную - то мы используем ТОЛЬКО язык и ничего более. Но как только мы отнаследовали хотя бы один свой класс от TObject из модуля System, или от любого его потомка - мы используем VCL.

Поэтому я и написал - "Если Вы имели в виду TMyObject = class (TObject)".


 
PVOzerski   (2002-08-03 18:02) [20]

2Юрий Зотов:
Опять не могу с Вами согласиться. Модуль System не есть часть VCL, он относится к RTL и практически необходим для любой программы, хоть использующей VCL, хоть не использующей. А тип tObject определён именно в модуле System. Выражения
type
tX=class
end;
и
type
tY=class(tObject)
end;
по сути дела эквивалентны, и класс tX является неявным потомком tObject и содержит в себе тот же набор свойств и методов, что и tY. А из Вашего утверждения, таким образом, следует, что любое использование любых классов в программе означает использование VCL, что противоречит вами же высказанному суждению о ни от чего не зависящей иерархии классов как пути неиспользования VCL.


 
Старый паскалист   (2002-08-03 18:03) [21]

2Юрий Зотов
а если он имел в виду просто "TMyObject = class"? :-)))))

Вообще говоря, затруднительно на Дельфи написать иерархию классов, не унаследованную от TObject. (Пережитки турбопаскаля не в счёт).


2PVOzerski ©
>Исходя из изложенного, очевидно, что использовать метод в >качестве WndProc практически невозможно.

Тем не менее Борланд преодолел это узкое место - см. выше.


 
Юрий Зотов   (2002-08-03 20:00) [22]

> А из Вашего утверждения, таким образом, следует, что любое использование любых классов в программе означает использование VCL,...

Именно так. В подтверждение я привел структуру справки Delphi - из нее следует, что сама Borland рассматривает модуль System, как часть VCL. Если же это так, то вся RTL является частью VCL - а тогда, даже написав в программе не то что слово "class", а просто вызов любой встроенной функции, мы уже используем VCL.


> ...что противоречит вами же высказанному суждению о ни от чего не зависящей иерархии классов как пути неиспользования VCL.

Нет, не противоречит. Потому что это суждение, естественно, чисто гипотетическое. Реализовать же такую независимую иерархию на практике невозможно, ибо сам компилятор уже "заточен" под TObject, как базовый класс.


> а если он имел в виду просто "TMyObject = class"?

...то это, как все мы знаем, абсолютно одно и то же.


Господа, я предлагаю прекратить эту теоретическую дискуссию. Мы прекрасно понимаем друг друга и вопрос сводится лишь к тому, является ли RTL частью VCL, или нет. Отвечая "да", мы должны признать правоту одной стороны, отвечая "нет" - другой стороны.

Мы смотрим на это по-разному и вряд ли кто-то кого-то сможет переубедить. Рассудить нас, по-видимому, может только Borland, а обращаться к ней по вопросам терминологии вряд ли имеет смысл...

Но от спора я получил удовольствие. Спасибо.




 
vuk   (2002-08-04 00:59) [23]

Я тут влезу по поводу, что считать VCL, а что нет. Имху свою выражу. :o) Это лучше у Borland спросить. Но можно и на структуру каталога sources посмотреть - там четко видно, что Borland считает RTL, что VCL, что CLX и т.д.


 
Almaz   (2002-08-04 01:49) [24]

Цитата из справки Delphi5 :
When you write classes of your own in Object Pascal, they should descend from TObject. By deriving new classes from the VCL’s base class (or one of its descendants), you provide your classes with essential functionality and ensure that they work with the VCL.

Таким образом Borland называет TObject базовым классом VCL. А так как все классы наследуются от TObject, то использование классов есть использование VCL.

НО, объекты в Object Pascal можно объявить и почти забытой директивой object. И вот тут VCL уже не причем, т.к. при таком определении объект не является наследником TObject, а значит не использует VCL.

Удачи.



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

Форум: "Основная";
Текущий архив: 2002.08.15;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.008 c
3-47990
Hawk2
2002-07-26 18:13
2002.08.15
СРОЧНО!!! Эксперементировать нет времени.


3-48000
Naik
2002-07-27 19:12
2002.08.15
Delphi 6 и BDE


1-48199
Nikoss
2002-08-02 23:22
2002.08.15
Три вопроса. Работа с двумерным массивом


1-48147
Малограмотный
2002-08-01 13:52
2002.08.15
Вопрос чайника


14-48301
Igorek
2002-07-19 00:07
2002.08.15
Нужен исходник компилятора ObjectPascal





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