![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
WindowProc внутри объекта [D6]
SPeller © (2002-07-30 05:58:00)Всем доброго времени суток! У меня такой вопрос: Можно ли назначить окну оконную процедуру которая внутри объекта ?
Almaz (2002-08-04 01:49:00) [1]Цитата из справки 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.
Удачи.
vuk (2002-08-04 00:59:00) [2]Я тут влезу по поводу, что считать VCL, а что нет. Имху свою выражу. :o) Это лучше у Borland спросить. Но можно и на структуру каталога sources посмотреть - там четко видно, что Borland считает RTL, что VCL, что CLX и т.д.
Юрий Зотов (2002-08-03 20:00:00) [3]> А из Вашего утверждения, таким образом, следует, что любое использование любых классов в программе означает использование VCL,...
Именно так. В подтверждение я привел структуру справки Delphi - из нее следует, что сама Borland рассматривает модуль System, как часть VCL. Если же это так, то вся RTL является частью VCL - а тогда, даже написав в программе не то что слово "class", а просто вызов любой встроенной функции, мы уже используем VCL.
> ...что противоречит вами же высказанному суждению о ни от чего не зависящей иерархии классов как пути неиспользования VCL.
Нет, не противоречит. Потому что это суждение, естественно, чисто гипотетическое. Реализовать же такую независимую иерархию на практике невозможно, ибо сам компилятор уже "заточен" под TObject, как базовый класс.
> а если он имел в виду просто "TMyObject = class"?
...то это, как все мы знаем, абсолютно одно и то же.
Господа, я предлагаю прекратить эту теоретическую дискуссию. Мы прекрасно понимаем друг друга и вопрос сводится лишь к тому, является ли RTL частью VCL, или нет. Отвечая "да", мы должны признать правоту одной стороны, отвечая "нет" - другой стороны.
Мы смотрим на это по-разному и вряд ли кто-то кого-то сможет переубедить. Рассудить нас, по-видимому, может только Borland, а обращаться к ней по вопросам терминологии вряд ли имеет смысл...
Но от спора я получил удовольствие. Спасибо.
Старый паскалист (2002-08-03 18:03:00) [4]2Юрий Зотов
а если он имел в виду просто "TMyObject = class"? :-)))))
Вообще говоря, затруднительно на Дельфи написать иерархию классов, не унаследованную от TObject. (Пережитки турбопаскаля не в счёт).
2PVOzerski ©
>Исходя из изложенного, очевидно, что использовать метод в >качестве WndProc практически невозможно.
Тем не менее Борланд преодолел это узкое место - см. выше.
PVOzerski (2002-08-03 18:02:00) [5]2Юрий Зотов:
Опять не могу с Вами согласиться. Модуль System не есть часть VCL, он относится к RTL и практически необходим для любой программы, хоть использующей VCL, хоть не использующей. А тип tObject определён именно в модуле System. Выражения
type
tX=class
end;
и
type
tY=class(tObject)
end;
по сути дела эквивалентны, и класс tX является неявным потомком tObject и содержит в себе тот же набор свойств и методов, что и tY. А из Вашего утверждения, таким образом, следует, что любое использование любых классов в программе означает использование VCL, что противоречит вами же высказанному суждению о ни от чего не зависящей иерархии классов как пути неиспользования VCL.
Юрий Зотов (2002-08-03 17:36:00) [6]> PVOzerski © (03.08.02 17:15)
> VCL - это библиотека, классы - часть синтаксиса Object Pascal
Безусловно. Поэтому, если мы используем СВОЮ иерархию классов, ни от чего не отнаследованную, а полностью и самого нуля ручками написанную - то мы используем ТОЛЬКО язык и ничего более. Но как только мы отнаследовали хотя бы один свой класс от TObject из модуля System, или от любого его потомка - мы используем VCL.
Поэтому я и написал - "Если Вы имели в виду TMyObject = class (TObject)".
PVOzerski (2002-08-03 17:15:00) [7]А теперь давайте всё разложим по полочкам.
>Если Вы имели в виду TMyObject = class (TObject), то ДА, ЭТО
>ОТНОСИТСЯ К VCL. Даже несмотря на "Гы-гы.." и смайлики.
1) использование классов само по себе использование VCL не означает. VCL - это библиотека, классы - часть синтаксиса Object Pascal, с использованием которой, в частности, написана VCL. Тип tObject определён в модуле system. При всём уважении к Ю.Зотову, вынужден поддержать "Гы-гы..".
2) Метод в классе - штука довольно забавная. Во-первых, имеет неявный параметр Self, во-вторых, процедурная переменная procedure/function(...)of object - это, в отличие от обычной процедурной переменной, не указатель на точку входа, а массив из двух указателей - на точку входа и на блок данных. Исходя из изложенного, очевидно, что использовать метод в качестве WndProc практически невозможно.
Юрий Зотов (2002-08-03 16:44:00) [8]> Старый паскалист (03.08.02 16:33)
Еще раз посмотрел в той же справке - модули Windows, ShellAPI и им подобные в VCL не числятся.
Так что не все так плохо, коллега - системные библиотеки частью VCL все же не являются.
:о)
Что дает нам, старым паскалистам, некоторую отдушину.
Старый паскалист (2002-08-03 16:33:00) [9]Оказывается, я всю жизнь говорил прозой...
Слишком уж ёмким понятие VCL получается.
VCL, VCL и ничего кроме VCL :-(
Юрий Зотов (2002-08-03 16:26:00) [10]> разработчики поместили его в модули библиотеки времени выполнения
И что же с того? От этого он перестал быть частью 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, являются не менее очевидно правильными. В любом регистре.
:о)
Dimka Maslov (2002-08-03 16:26:00) [11]В MakeObjectInstance оконная процедура связывается с объектом. В памяти динамически создаётся код, который принимает параметры оконной процедуры, создаёт из них запись типа TMessage и передаёт их "оконной" функции объекта, которая уже ищет нужный обработчик сообщения для объекта. Весь этот код находится в модуле Forms, следовательно вся VCL всё равно попадёт в программу. Чтобы этого избежать, нужно выдрать из модуля Forms весь код, связанный с MakeObjectInstance.
Dr_Mike (2002-08-03 15:55:00) [12]Кстати, писать в верхнем регистре очевидно неправильные вещи не стоило бы :))
TObject - это основополагающий элемент языка Object Pascal, и разработчики поместили его в модули библиотеки времени выполнения, описывается он в модуле System и к VCL никакого отношения не имеет...
Юрий Зотов (2002-08-03 01:32:00) [13]Если Вы имели в виду TMyObject = class (TObject), то ДА, ЭТО ОТНОСИТСЯ К VCL. Даже несмотря на "Гы-гы.." и смайлики.
Слово "Visual" не должно вводить в заблуждение. Это всего лишь не вполне точное название, а СУТЬ- в коде.
Или я что-то не так понял?
SPeller (2002-07-30 10:05:00) [14]
> Юрий Зотов © (30.07.02 09:38)
> Но непонятно - Вы же говорите, что не используете VCL, так
> откуда же объект появился?
Гы-гы.. :-))))
MyObject = Object
...
Это тоже к VCL относится? :-)))
Юрий Зотов (2002-07-30 09:38:00) [15]Да, такой способ тоже известен. В конце не забудьте восстановить все назад и вызвать FreeObjectInstance.
Но непонятно - Вы же говорите, что не используете VCL, так откуда же объект появился?
Starkom (2002-07-30 09:29:00) [16]http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1028003759&n=0
тут кстати есть код :)
надо в чужие вопросы иногда заглядывать :)
Starkom (2002-07-30 09:25:00) [17]да блин, WndProc - метод TApplication
FObjectInstance := MakeObjectInstance(WndProc);
FHandle := CreateWindow(WindowClass.lpszClassName, PChar(FTitle), ляля
SetWindowLong(FHandle, GWL_WNDPROC, Longint(FObjectInstance));
то, что происходит в MakeObjectInstance выше моего понимания :)
SPeller (2002-07-30 09:22:00) [18]2 Юрий Зотов © (30.07.02 09:14)
Вообще это можно сделать, но я не знаю как. Метод объекта, он ведь тоже содержит код, значит можно как-то достать указатель на этот код.
?
Starkom (2002-07-30 09:18:00) [19]2 Юрий Зотов:
"С методом объекта не получится из-за неявного параметра Self."
А поподробнее нельзя?
Вроде, в TApplication.CreateHandle именно SetWindowLong вызывается с методом класса TApplication.
Юрий Зотов (2002-07-30 09:14:00) [20]С методом объекта не получится из-за неявного параметра Self.
Но если Вы не используете VCL, то почему бы не назначить окну обычную функцию, не метод объекта (SetWindowLong с GWL_WNDPROC)? Это точно пройдет.