Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как "динамический" вызать конструктор? [D7, WinXP]


Страницы:   1 2 3 4 5

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 ©


Страницы:   1 2 3 4 5

Наверх

Титульная страница Поиск, карта сайта Написать письмо