![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как "динамический" вызать конструктор? [D7, WinXP]
zamtmn © (2006-07-31 14:34:00)Никак не получается "динамически" вызвать конструктор для object`a. Делаю чтото вроде вотэтого:
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
testobj=object
constructor init;
end;
SimpleProcOfObj=procedure of object;
var obj:testobj;
tm:tmethod;
constructor testobj.init;
begin
writeln('init;')
end;
begin
tm.Code:=@testobj.init;
tm.Data:=@obj;
SimpleProcOfObj(tm);
writeln('end.');
readln;
end.
На FPC всё компилится и работает, на DELPHI7 никак. если constructor заменить на procedure то все работает, но нужно именно конструктор - чтоб VMT проинициализировалась:(
Сергей М. (2006-08-01 13:55:00) [41]
> zamtmn © (01.08.06 13:48) [50]
> я говорю о object а не о class
А откуда у object взялся конструирующий метод constructor ?
Это - метод класса, он характерен и поддерживается компилятором лишь для class.
zamtmn (2006-08-01 13:48:00) [42]>>Конструктор еще многое чего делает ... а не только VMT инициализирует ... На то он и конструктор)
как и процедура. я говорю о object а не о class
Игорь Шевченко (2006-08-01 13:47:00) [43]zamtmn © (01.08.06 13:42) [47]
> напрямую они нигде не используются
Поиск - рулез фарева.
> но по ним видна структура VMT класса
Дружок, ты малость перепутал, так как эти смещения используются в функциях работы с интерфейсами, которые, как ты наверняка знаешь, наследуются от IUnknown, значит, обязаны иметь методы QueryInterface, AddRef и Release
Сергей М. (2006-08-01 13:44:00) [44]
> zamtmn © (01.08.06 13:39) [46]
> формально constructor и procedure одно и тоже, только конструктор
> еще вызывает ObjSetup для инициализации VMT
Конструктор еще многое чего делает ... а не только VMT инициализирует ... На то он и конструктор)
zamtmn (2006-08-01 13:42:00) [45]>>А теперь внимательно смотрим в system.pas, где эти константы используются и больше не говорим недостоверных сведений.
напрямую они нигде не используются, но по ним видна структура VMT класса
zamtmn (2006-08-01 13:39:00) [46]>Зачем object'у конструктор?! Тем более, зачем пихать constructor в
>TMethod - если бы сработало, то это означало бы, что constructor и
>procedure - одно и то же.
вобщето формально constructor и procedure одно и тоже, только конструктор еще вызывает ObjSetup для инициализации VMT
Игорь Шевченко (2006-08-01 13:37:00) [47]zamtmn © (01.08.06 11:33) [36]
> загляни в system.pas, класс в дельфи обычный ком объект
Нет, класс Delphi и COM-объект это две большие разницы.
zamtmn © (01.08.06 12:38) [38]
> vmtQueryInterface = 0;
> vmtAddRef = 4;
> vmtRelease = 8;
> vmtCreateObject = 12;
>
> ниче не напоминает?
А теперь внимательно смотрим в system.pas, где эти константы используются и больше не говорим недостоверных сведений.
zamtmn (2006-08-01 13:32:00) [48]>>Как я понимаю, это относится к TInterfacedObject.
а я понял что относится к TObject
вот, нашел статейку
http://www.rsdn.ru/article/Delphi/delphiabs.xml
см. раздел "Структура классов Delphi"
tesseract (2006-08-01 13:29:00) [49]
> Уже в D7 не работают property.
какие property?
В OLE/классах всё работает.
> Хоть я и не знаю COM, но никаких привязок к чему-либо извне
> не находится. Интерфейсы - да, но вроде тоже не требует
> COM'а.
находиться "следы" в частности ссылки на GUID у Tobject. Хотя ИМХО это RTTI- радости.
>для этих констант стоит директива deprecated. Что значит delphi не >рекомендует их использовать, т.к. они платформозависимы (я вроде так >понял хэлп). А какое они отношение имеют к class?
Там вместо них VMTooffset рекомендуют использовать. При платформозависиомти ставят platform.
begin...end (2006-08-01 13:27:00) [50]> GrayFace © (01.08.06 13:12) [39]
> Зачем object'у конструктор?!
Хотя бы из этой ветки видно, что для инициализации ТВМ. А в некоторых случаях -- и для создания этого самого object'а.
StriderMan (2006-08-01 13:19:00) [51]
> zamtmn © (01.08.06 12:38) [38]
для этих констант стоит директива deprecated. Что значит delphi не рекомендует их использовать, т.к. они платформозависимы (я вроде так понял хэлп). А какое они отношение имеют к class?
GrayFace (2006-08-01 13:15:00) [52]GrayFace © (01.08.06 13:12) [39]
Интерфейсы - да, но вроде тоже не требует COM'а.
Т.е. им совсем не обязательна поддержка со стороны ОС.
zamtmn © (01.08.06 12:38) [38]
vmtQueryInterface = 0;
vmtAddRef = 4;
vmtRelease = 8;
vmtCreateObject = 12;
ниче не напоминает?
Как я понимаю, это относится к TInterfacedObject.
GrayFace (2006-08-01 13:12:00) [53]Зачем object'у конструктор?! Тем более, зачем пихать constructor в TMethod - если бы сработало, то это означало бы, что constructor и procedure - одно и то же.
И, вообще, зачем тут нужен object? И чего ты добьешся вызовом этого TMethod'а? Это же то же самое что obj.init.
tesseract © (31.07.06 15:53) [15]
В delphi у объектов коструктор называется create.
Как хочешь, так и называешь.
jack128 © (31.07.06 23:33) [25]
в d2006 что то с объектами не работает. Что именно, уже не помню, если интересно - поищи в архивах - тему про появление delphi2006/
Уже в D7 не работают property.
zamtmn (01.08.06 0:12) [34]
object какразтаки штука фундаментальная, а class со своей привязкой к COM - кончается там где нет windows
Хоть я и не знаю COM, но никаких привязок к чему-либо извне не находится. Интерфейсы - да, но вроде тоже не требует COM'а.
zamtmn (2006-08-01 12:38:00) [54]
vmtQueryInterface = 0;
vmtAddRef = 4;
vmtRelease = 8;
vmtCreateObject = 12;
ниче не напоминает?
StriderMan (2006-08-01 12:06:00) [55]
> загляни в system.pas, класс в дельфи обычный ком объект
заглянул. мало чего понял, нельзя ли поподробнее? можно с кодом, показывающим что это СОМ.
zamtmn (2006-08-01 11:33:00) [56]>>это каким таким местом класс к СОМ привязан?
загляни в system.pas, класс в дельфи обычный ком объект
>>СОМ есть не только в Windows. Можно сделать и в юниксоидах
согласен, можно сделать всё
StriderMan (2006-08-01 11:10:00) [57]
> а class со своей привязкой к COM
это каким таким местом класс к СОМ привязан?
> кончается там где нет windows
СОМ есть не только в Windows. Можно сделать и в юниксоидах
zamtmn (2006-08-01 00:12:00) [58]пост 27 прекрасно компилируется на D2006 без всяких патчей.
>> Обычно для скриптовых языков OLE и используется
обычно это где?
object какразтаки штука фундаментальная, а class со своей привязкой к COM - кончается там где нет windows
jack128 (2006-08-01 00:08:00) [59]Джо © (31.07.06 23:53) [31]
ну что ж. молодцы борланды.
Джо (2006-07-31 23:53:00) [60]> [31] Джо © (31.07.06 23:53)
> А у меня на D2006 приведенный код
Т.е, код в [27] jack128 ©