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

Вниз

Как "динамический" вызать конструктор?   Найти похожие ветки 

 
zamtmn   (2006-07-31 14:34) [0]

Никак не получается "динамически" вызвать конструктор для 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 проинициализировалась:(


 
tesseract ©   (2006-07-31 14:39) [1]

testobj=object
         public
                constructor Create;
          end;
  SimpleProcOfObj=procedure of object;
var obj:testobj;
  tm:tmethod;
constructor testobj.Create;
begin
   inherited create;
   writeln("init;")
end;
begin
   tm.Code:=Ttestobj.Create;
   tm.Data:=obj;
   SimpleProcOfObj(tm);
   writeln("end.");
   readln;
end.


 
zamtmn   (2006-07-31 14:52) [2]

Чето невъехал. почему?

  tm.Code:=Ttestobj.Create;
  tm.Data:=obj;

где @?
всеравно неробит


 
tesseract ©   (2006-07-31 14:56) [3]


> zamtmn   (31.07.06 14:52) [2]


надеюсь tm.code имеет тип tTestobj.

тогда заработает. Create возвратит тебе ссылку на объект.


 
StriderMan ©   (2006-07-31 15:01) [4]


> где @?

а зачем "@"?

читай основы Делфи.


>   testobj=object

может быть testobj = class?


 
zamtmn   (2006-07-31 15:11) [5]

>может быть testobj = class?
нет object
>надеюсь tm.code имеет тип tTestobj
tm.code это pointer
tmethod - определен в дельфовском system.pas
>Create возвратит тебе ссылку на объект
мне недадо его креатить, он уже создан, и он не класс а обжект, нужно проинициализировать VMT


 
StriderMan ©   (2006-07-31 15:18) [6]

предлагаю почитать хелп по ключевому слову object

The object interface attribute identifies a custom OLE interface. An interface attribute list that does not include the object attribute indicates a DCE RPC interface. An interface attribute list for an OLE interface must include the uuid attribute, but it cannot include the version attribute.


 
tesseract ©   (2006-07-31 15:18) [7]


> zamtmn   (31.07.06 15:11) [5]


Учить теорию срочно.


 
zamtmn   (2006-07-31 15:25) [8]

мне OLE ненужно:)
мне нужен старый добрый BP7 object, понимаю что щас классы в моде, но жизнь заставила:)
Имею выделенную под object память, проинициализированные поля, нужно вызвать пустой конструктор без ассемблерных хаков, чтоб можнобыло пользоваться виртуальными методами


 
zamtmn   (2006-07-31 15:28) [9]

>>Учить теорию срочно
ну уж если посылаешь в учебники, то ткни носом что именно.
чето мне кажется что ты не понял что мне надо


 
tesseract ©   (2006-07-31 15:29) [10]


> zamtmn   (31.07.06 15:25) [8]


нету его Delphi не паскаль, виртуальные методы объявляються дописыванием Virtual в конце.

Классы только динамические.


 
tesseract ©   (2006-07-31 15:29) [11]


> чето мне кажется что ты не понял что мне надо


Ты и не сказал, опиши проблему.


 
zamtmn   (2006-07-31 15:43) [12]

ну если в 2х словах то пытаюсь сделать паскаль подобный скриптовый язык.
нужно чтоб моя программа (не компилятор делфи) умела обробатывать вот такие файлики:

unit rp_21_;
type
   tvolt=(_DC_6V(*"6В постоянного тока"*),
          _DC_12V(*"12В постоянного тока"*),
          _DC_24V(*"24В постоянного тока"*),
          _DC_27V(*"27В постоянного тока"*),
          _DC_48V(*"48В постоянного тока"*),
          _DC_60V(*"60В постоянного тока"*),
          _DC_110V(*"110В постоянного тока"*),
          _AC_12V_50Hz(*"12В,50Гц"*),
          _AC_24V_50Hz(*"12В,50Гц"*),
          _AC_36V_50Hz(*"12В,50Гц"*),
          _AC_40V_50Hz(*"12В,50Гц"*),
          _AC_110V_50Hz(*"12В,50Гц"*),
          _AC_220V_50Hz(*"12В,50Гц"*));
   tkont=(_004(*"004"*),
          _003(*"003"*),
          _002(*"002"*),
          _001(*"001"*));
   tklimat=(_UHL(*"УХЛ"*),
            _O(*"О"*));
   tiznos=(_A(*"А"*),
           _B(*"Б"*));
   trp_21=object(DeviceBaseObjectWithVariable)
                volt:tvolt;
                kont:tkont;
                klimat:tklimat;
                iznos:tiznos;
          end;
var
  rp_21:trp_21;
begin
    rp_21.initnul;
    rp_21.Category:="Электроаппараты";
    rp_21.TU:="ТУ16-523.593-80";
    rp_21.EdIzm:="Шт";
    rp_21.Mass:=1.5;

    rp_21.NameTemplate:="РП21-%%(*self.kont*)-%%(*self.klimat*) %%(*self.iznos*)";
    rp_21.IDTemplate:="rele_rp21_%%(*self.kont*)_%%(*self.rez*)_%%(*self.volt*)";
    rp_21.NameFullTemplate:="Реле промежуточное, напряжение питания %%(*self.volt*), колличество контактов %%(*self.kont*)";
end.

объект DeviceBaseObjectWithVariable определен в программе, евляется базовым для trp_21 и ему подобных. о trp_21 программа ничего не знает и парсит его структуру из этого файла.
rp_21.initnul; - воттут для созданного rp_21 должен вызваться DeviceBaseObjectWithVariable.initnul чтоб дальше с ним можно было работать методами DeviceBaseObjectWithVariable. Собственно во фрипаскале указаным в первом посте методом конструктор вызывается, а дельфи на нем вылетает


 
Игорь Шевченко ©   (2006-07-31 15:46) [13]


> type
>    testobj=object
>                  constructor init;
>            end;
>    SimpleProcOfObj=procedure of object;


в последней строчке не тот object,  который во второй


 
zamtmn   (2006-07-31 15:51) [14]

>> type
>>    testobj=object
>>                  constructor init;
>>            end;
>>    SimpleProcOfObj=procedure of object;
>в последней строчке не тот object,  который во второй
если constructor init заменить на procedure то все вызывается и работает


 
tesseract ©   (2006-07-31 15:53) [15]


> Собственно во фрипаскале указаным в первом посте методом
> конструктор вызывается, а дельфи на нем вылетает


Ну разумеется, Delphi не Pascal , да и пока не Free тоже.

В delphi у объектов коструктор называется create.

и создание его : MyObject:=TMyObject.Create;

ЗЫ: А почему ещё не в начинающих???


 
tesseract ©   (2006-07-31 15:54) [16]


> если constructor init заменить на procedure то все вызывается
> и работает


А если лобъект создан, зачем ему ещё один вызов конструктора?


 
begin...end ©   (2006-07-31 15:55) [17]

Я очень извиняюсь, но procedure of object, TMethod и прочие пляски с бубном -- они тут, собственно, на зачем? Перед первым обращением к виртуальным методам вызываем конструктор Init, как самый обычный метод. В результате вызывается _ObjSetup и инициализируется VMT. Что ещё нужно-то?

> StriderMan
> tesseract

Добрый совет: почитайте справку по object types. Для общего, так сказать, развития.


 
zamtmn   (2006-07-31 16:05) [18]

>>и прочие пляски с бубном -- они тут, собственно, на зачем?
Ну хочу я вызов конструктора из скрипта:), на асме его сделаю, но ведь долженбыть человечий способ


 
tesseract ©   (2006-07-31 16:05) [19]


> begin...end ©   (31.07.06 15:55) [17]


прочитал:

Object types are supported for backward compatibility only. Their use is not recommended.


т.е их использование строго не рекомендуется и как будет работать не ясно.


 
zamtmn   (2006-07-31 16:08) [20]

to tesseract
не разводи флейма
нужно на OBJECT`ах и все тут


 
begin...end ©   (2006-07-31 16:09) [21]

> zamtmn   (31.07.06 16:05) [18]

Я всё же не совсем понимаю, что мешает напрямую вызвать конструктор Init. Можно пояснить?


 
Джо ©   (2006-07-31 16:10) [22]

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

Не нужно драматизировать. :) Все работает и будет работать как часы.


 
zamtmn   (2006-07-31 16:12) [23]

ну пока предок у объектов один, но в дальнейшем планируется их много.
ну и для унификации вобщемто, тут уже столько плясок с бубном, что такая мелочь не помешает


 
zamtmn   (2006-07-31 22:56) [24]

Перед вызовом конструктора DELPHI7 в EDX пихает адрес VMT объекта, ассемблерная вставка всё решила, но уж больно это версиезависимо:(


 
jack128 ©   (2006-07-31 23:33) [25]

Джо ©   (31.07.06 16:10) [22]
Все работает и будет работать как часы.

в d2006 что то с объектами не работает. Что именно, уже не помню, если интересно - поищи в архивах - тему про появление delphi2006/


 
Джо ©   (2006-07-31 23:34) [26]

> [25] jack128 ©   (31.07.06 23:33)
> Все работает и будет работать как часы.
> в d2006 что то с объектами не работает. Что именно, уже
> не помню, если интересно - поищи в архивах - тему про появление
> delphi2006/

Гм. Интересно было бы почитать. Только архивы скачивать лень :) Если у кого-то сохранилась ветка — буду очень признателен за ее обнародование.


 
jack128 ©   (2006-07-31 23:44) [27]

Джо ©   (31.07.06 23:34) [26]
Гм. Интересно было бы почитать. Только архивы скачивать лень :)

хе. я просто думал ты каким нить клиентом пользуешься.. ну раз так..

-----------------------------------------------------
jack128 ©   (17.12.05 12:16) [28]
Хе. Любителей старой конструкции
TObj = object
...
end; могу огорчить. Не компилируется такой вот простейший код:

type
TestObj = object
private
  procedure Test;
end;

{ TestObj }

procedure TestObj.Test;
begin
ShowMessage("fgf");
end;

[Pascal Fatal Error] Unit3.pas(40): F2084 Internal Error: URW813
-----------------------------------------------------
Anatoly Podgoretsky ©   (17.12.05 19:09) [31]
jack128 ©   (17.12.05 12:16) [28]
Наверно наконец закрыли это.
-----------------------------------------------------
jack128 ©   (17.12.05 22:04) [32]
Anatoly Podgoretsky ©   (17.12.05 19:09) [31]
Криво закрыли. Проверка синтаксиса то говорит, что всё окей..


 
Джо ©   (2006-07-31 23:48) [28]

> [27] jack128 ©   (31.07.06 23:44)

Спасибо. Вот так дела... А я на Д2006 ни разу этим object"ом не пользовался, вот и не заметил.


 
jack128 ©   (2006-07-31 23:50) [29]

Джо ©   (31.07.06 23:48) [28]
н6о это на дельфе без апдейтов. Хотя не думаю, что нить с тех пор поменялось.


 
tesseract ©   (2006-07-31 23:52) [30]

> [24] zamtmn   (31.07.06 22:56)


Да уж и COM/OLE версиезависимым стал. Обычно для скриптовых языков OLE и используется. Позднее связывание имеет немало преимуществ.


 
Джо ©   (2006-07-31 23:53) [31]

А у меня на D2006 приведенный код скомпилировался без проблем. Ставьте патчи, господа! ;)


 
Джо ©   (2006-07-31 23:53) [32]

> [31] Джо ©   (31.07.06 23:53)
> А у меня на D2006 приведенный код

Т.е, код в [27] jack128 ©


 
jack128 ©   (2006-08-01 00:08) [33]

Джо ©   (31.07.06 23:53) [31]
ну что ж. молодцы борланды.


 
zamtmn   (2006-08-01 00:12) [34]

пост 27 прекрасно компилируется на D2006 без всяких патчей.
>> Обычно для скриптовых языков OLE и используется
обычно это где?
object какразтаки штука фундаментальная, а class со своей привязкой к COM - кончается там где нет windows


 
StriderMan ©   (2006-08-01 11:10) [35]


> а class со своей привязкой к COM

это каким таким местом класс к СОМ привязан?

> кончается там где нет windows

СОМ есть не только в Windows. Можно сделать и в юниксоидах


 
zamtmn ©   (2006-08-01 11:33) [36]

>>это каким таким местом класс к СОМ привязан?
загляни в system.pas, класс в дельфи обычный ком объект
>>СОМ есть не только в Windows. Можно сделать и в юниксоидах
согласен, можно сделать всё


 
StriderMan ©   (2006-08-01 12:06) [37]


> загляни в system.pas, класс в дельфи обычный ком объект

заглянул. мало чего понял, нельзя ли поподробнее? можно с кодом, показывающим что это СОМ.


 
zamtmn ©   (2006-08-01 12:38) [38]


 vmtQueryInterface    = 0;
 vmtAddRef            = 4;
 vmtRelease           = 8;
 vmtCreateObject      = 12;

ниче не напоминает?


 
GrayFace ©   (2006-08-01 13:12) [39]

Зачем 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"а.


 
GrayFace ©   (2006-08-01 13:15) [40]

GrayFace ©   (01.08.06 13:12) [39]
Интерфейсы - да, но вроде тоже не требует COM"а.

Т.е. им совсем не обязательна поддержка со стороны ОС.

zamtmn ©   (01.08.06 12:38) [38]
vmtQueryInterface    = 0;
vmtAddRef            = 4;
vmtRelease           = 8;
vmtCreateObject      = 12;

ниче не напоминает?

Как я понимаю, это относится к TInterfacedObject.


 
StriderMan ©   (2006-08-01 13:19) [41]


> zamtmn ©   (01.08.06 12:38) [38]

для этих констант стоит директива deprecated. Что значит delphi не рекомендует их использовать, т.к. они платформозависимы (я вроде так понял хэлп). А какое они отношение имеют к class?


 
begin...end ©   (2006-08-01 13:27) [42]

> GrayFace ©   (01.08.06 13:12) [39]
> Зачем object"у конструктор?!

Хотя бы из этой ветки видно, что для инициализации ТВМ. А в некоторых случаях -- и для создания этого самого object"а.


 
tesseract ©   (2006-08-01 13:29) [43]


> Уже в D7 не работают property.


какие property?

В OLE/классах  всё работает.


> Хоть я и не знаю COM, но никаких привязок к чему-либо извне
> не находится. Интерфейсы - да, но вроде тоже не требует
> COM"а.


находиться "следы" в частности ссылки на GUID у Tobject.  Хотя ИМХО это RTTI- радости.


>для этих констант стоит директива deprecated. Что значит delphi не >рекомендует их использовать, т.к. они платформозависимы (я вроде так >понял хэлп). А какое они отношение имеют к class?


Там вместо них VMTooffset рекомендуют использовать. При платформозависиомти ставят platform.


 
zamtmn ©   (2006-08-01 13:32) [44]

>>Как я понимаю, это относится к TInterfacedObject.
а я понял что относится к TObject
вот, нашел статейку
http://www.rsdn.ru/article/Delphi/delphiabs.xml
см. раздел "Структура классов Delphi"


 
Игорь Шевченко ©   (2006-08-01 13:37) [45]

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:39) [46]

>Зачем object"у конструктор?! Тем более, зачем пихать constructor в
>TMethod - если бы сработало, то это означало бы, что constructor и
>procedure - одно и то же.

вобщето формально constructor и procedure одно и тоже, только конструктор еще вызывает ObjSetup для инициализации VMT


 
zamtmn ©   (2006-08-01 13:42) [47]

>>А теперь внимательно смотрим в system.pas, где эти константы используются и больше не говорим недостоверных сведений.
напрямую они нигде не используются, но по ним видна структура VMT класса


 
Сергей М. ©   (2006-08-01 13:44) [48]


> zamtmn ©   (01.08.06 13:39) [46]


> формально constructor и procedure одно и тоже, только конструктор
> еще вызывает ObjSetup для инициализации VMT


Конструктор еще многое чего делает ... а не только VMT инициализирует ... На то он и конструктор)


 
Игорь Шевченко ©   (2006-08-01 13:47) [49]

zamtmn ©   (01.08.06 13:42) [47]


> напрямую они нигде не используются


Поиск - рулез фарева.


> но по ним видна структура VMT класса


Дружок, ты малость перепутал, так как эти смещения используются в функциях работы с интерфейсами, которые, как ты наверняка знаешь, наследуются от IUnknown, значит, обязаны иметь методы QueryInterface, AddRef и Release


 
zamtmn ©   (2006-08-01 13:48) [50]

>>Конструктор еще многое чего делает ... а не только VMT инициализирует ... На то он и конструктор)
как и процедура. я говорю о object а не о class


 
Сергей М. ©   (2006-08-01 13:55) [51]


> zamtmn ©   (01.08.06 13:48) [50]


> я говорю о object а не о class


А откуда у object взялся конструирующий метод constructor ?
Это - метод класса, он характерен и поддерживается компилятором лишь для class.


 
zamtmn ©   (2006-08-01 13:59) [52]

>>Это - метод класса, он характерен и поддерживается компилятором лишь для class.
одно да потому. тебе кто это сказал?
не сочти за труд, проверь


 
begin...end ©   (2006-08-01 14:00) [53]

> Сергей М. ©   (01.08.06 13:55) [51]

Ой. Конструкторы у object"ов ещё в Паскале были.


 
Сергей М. ©   (2006-08-01 14:11) [54]


> begin...end ©   (01.08.06 14:00) [53]


Неужели ?

Ну если New() считать конструктором, то конечно были)


> zamtmn ©   (01.08.06 13:59) [52]


> тебе кто это сказал?


Справка и Д7-компилятор.


> не сочти за труд, проверь


Не счел.
Проверил.

В ответ на

type
 TMyObj = object
 public
   constructor Create;
 end;

constructor TMyObj.Create;
begin
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
 TMyObj.Create;
end;


получил от компилятора вполне ожидаемый отлуп:

This form of method call only allowed in methods of derived types

что абсолютно объяснимо, ибо тип object не относится к derived types.

?


 
Сергей М. ©   (2006-08-01 14:12) [55]


> zamtmn


Since object types do not descend from TObject, they provide no built-in constructors, destructors, or other methods. You can create instances of an object type using the New procedure and destroy them with the Dispose procedure, or you can simply declare variables of an object type, just as you would with records

Борландом это для кого писано, спрашивается ?


 
begin...end ©   (2006-08-01 14:17) [56]

> Сергей М. ©   (01.08.06 14:11) [54]

А они для object"ов в такой форме и не вызывались никогда. Тем не менее, конструкторы эти есть, и, как здесь уже было сказано, при их вызове исполняется System._ObjSetup, задача которой состоит в выделении памяти под объект (если ссылка на экземпляр -- нулевая) и инициализации ТВМ.

> Сергей М. ©   (01.08.06 14:12) [55]

Это говорит лишь о том, что у object"ов нет встроенных (built-in) конструкторов. Однако их можно описать самостоятельно.


 
StriderMan ©   (2006-08-01 14:19) [57]


> Сергей М. ©   (01.08.06 14:12) [55]

справедливость восторжествовала :)

Сергей, а что насчет class и COM?

> zamtmn   (01.08.06 00:12) [34]


 
zamtmn ©   (2006-08-01 14:22) [58]


type
TMyObj = object
public
  constructor Create;
end;
var myobj:TMyObj;

constructor TMyObj.Create;
begin
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
myobj.Create;
end;

цитирую себя
>>я говорю о object а не о class


 
zamtmn ©   (2006-08-01 14:26) [59]

>>справедливость восторжествовала :)
что имеешь ввиду под справедливостью?
я имею ввиду то что class это object с кучей ЛИШНЕГО ДЛЯ МЕНЯ тюнинга


 
begin...end ©   (2006-08-01 14:28) [60]

> zamtmn

Мы несколько отклонились от темы, а как обстоят дела с исходной задачей?


 
StriderMan ©   (2006-08-01 14:32) [61]


> я имею ввиду то что class это object с кучей ЛИШНЕГО ДЛЯ
> МЕНЯ тюнинга

если честно никогда не пользовался object"ом.

Если не нужно ничего лишнего можно вообще record"ами все решить. Добавить в них процедурных ссылок - чем не "класс лайт"?


 
zamtmn ©   (2006-08-01 14:36) [62]

да флейм не рулит.
остановился на этом:

{$IFDEF DELPHI}
asm
    mov eax,[self]
    mov edx,[eax+pvmt]
end;
{$ENDIF}
SimpleProcOfObj(tm);

self тут объект описывающий структуру [12]
в поле PVMT - адрес VMT DeviceBaseObjectWithVariable
все работает


 
zamtmn ©   (2006-08-01 14:41) [63]

>>Если не нужно ничего лишнего можно вообще record"ами все решить. Добавить в них процедурных ссылок - чем не "класс лайт"?
когдато давно еще на TurboPascal так делал, это неудобно:)
object - компромис минимализма и функциональности:)


 
Сергей М. ©   (2006-08-01 14:43) [64]


> begin...end ©   (01.08.06 14:17) [56]


> их можно описать самостоятельно


Да, не проблема. Однако зачем это надо автору - остается загадкой.


> StriderMan ©   (01.08.06 14:19) [57]
> что насчет class и COM?


Выше по топику уже все справедливое сказано. Мне нечего к этому добавить.


> zamtmn ©   (01.08.06 14:22) [58]
> цитирую себя
> >>я говорю о object а не о class


Я тоже, заметь, не о попугаях) .. о том же самом object и о том же самом constructor ..


> zamtmn ©   (01.08.06 14:26) [59]
> я имею ввиду то что class это object с кучей ЛИШНЕГО ДЛЯ
> МЕНЯ тюнинга


Нет там для тебя ничего лишнего)
Что ты вызвал constructor для class, что ты явно вызвал ObjSetup для object - индифферентно. И там и там - одна строчка явного кода. Если же ты заботишься о результирующем объеме кода - это тебе не сюда: везде будет присутствовать и VMT, и RTTI, и прочие таблицы .. практически в полном объеме ..


 
Сергей М. ©   (2006-08-01 14:46) [65]


> zamtmn ©   (01.08.06 14:41) [63]
> object - компромис минимализма и функциональности


object - фетиш, не более того ... судя по твоим аргументам в пользу оного) ...

Пойми, ты ни на чем не сэкономишь, пользуя object вместо class)


 
zamtmn ©   (2006-08-01 14:53) [66]

>>Нет там для тебя ничего лишнего)
Что ты вызвал constructor для class, что ты явно вызвал ObjSetup для object - индифферентно. И там и там - одна строчка явного кода. Если же ты заботишься о результирующем объеме кода - это тебе не сюда: везде будет присутствовать и VMT, и RTTI, и прочие таблицы .. практически в полном объеме ..object - индифферентно.

есть такой термин Data-Driven. вот мне и нужно рантайм вызвать нужный конструктор. class хорош для пользовательского интерфейса, не спорю, для структуры из 3х байтов он избыточен, тут нужен object


 
zamtmn ©   (2006-08-01 15:05) [67]

>>object - фетиш, не более того ... судя по твоим аргументам в пользу оного) ...
собственно пишу я на FPC, иногда для ловли "неуловимых" ошибок использую D7(у делфи отллабчик гораздо удобней), вот и столкнулся с проблемой - вроде рабочий код не работает
Извиняюсь если приперся в чужой монастырь со своим уставом:)


 
Сергей М. ©   (2006-08-01 15:07) [68]


> class хорош для пользовательского интерфейса


Чавой-то ?!

Советую не продолжать.


> для структуры из 3х байтов он избыточен, тут нужен object


Какие нафих 3 байта, если ты замахнулся на VMT и она тебя колышет более всего ?!


 
zamtmn ©   (2006-08-01 15:11) [69]

>>Какие нафих 3 байта, если ты замахнулся на VMT и она тебя колышет более всего ?!
VMT я не трогаю, мне нужно чтобы она была проинициализирована runtime


 
Сергей М. ©   (2006-08-01 15:15) [70]


> мне нужно чтобы она была проинициализирована runtime


Покажи, как ты намерен при этом вызывать ObjSetup(), с какими параметрами ..

проиллюстрируй в коде, который по-твоему решил бы твои задачи ...


 
zamtmn ©   (2006-08-01 15:27) [71]


procedure RecordDescriptor.RunMetod(mn:string);
var pmd:pMetodDescriptor;
   pp:SimpleProcOfObj;
   tm:tmethod;
   p:pointer;
begin
     p:=self.pvmt;
       pmd:=SimpleMenods.beginiterate;
       if pmd<>nil then
       repeat
             if pmd^.MetodName=mn then
             begin
                  tm.Code:=pmd^.MetodAddr;
                  tm.Data:=obj;
                  case pmd^.Attributes of
                                         m_procedure:SimpleProcOfObj(tm);
                                         m_function:SimpleFuncOfObj(tm);
                                         m_constructor:
                                                       begin
                                                            {$IFDEF DELPHI}
                                                            asm
                                                               mov eax,[self]
                                                               mov edx,[eax+pvmt]
                                                            end;
                                                            {$ENDIF}
                                                            SimpleProcOfObj(tm);
                                                       end;
                  end;
                  pmd:=nil;
                  exit;
             end;
             pmd:=SimpleMenods.iterate;
       until pmd=nil;
       if parent<>nil then parent^.RunMetod(mn,obj);
end;


 
zamtmn ©   (2006-08-01 15:32) [72]

забыл
type
SimpleProcOfObj=procedure of object;

тробегает по дереву зарегистрированных объектов и вызывает метод, конструктор, функцию у ближайшего родителя с именем mn, вот ещебы передачу параметров прикрутить....


 
zamtmn ©   (2006-08-01 15:39) [73]

PFieldDescriptor=^FieldDescriptor;
FieldDescriptor=record
                     FieldName:string;
                     FieldType:gdbtypedesk;
                     Offset,Size:integer;
                     Attributes:word;
               end;
PMetodDescriptor=^MetodDescriptor;
MetodDescriptor=record
                     MetodName:string;
                     MetodAddr:pointer;
                     Attributes:word;
               end;
PRecordDescriptor=^RecordDescriptor;
RecordDescriptor=object(UserTypeDescriptor)
                      Fields:GDBOpenArrayOfData;
                      SimpleMenods:GDBOpenArrayOfData;
                      Parent:PRecordDescriptor;
                      PVMT:pointer;
                      constructor init;
                      procedure AddField(var fd:FieldDescriptor);
                      procedure AddMetod(mn:string;ma:pointer;attr:word);
                      procedure RegisterVMT(pv:pointer);
                      procedure RunMetod(mn:string;obj:pointer);
                      procedure AddConstField(var fd:FieldDescriptor);
                      procedure CopyTo(RD:PRecordDescriptor);
                  end;

описанье всего остального


 
Сергей М. ©   (2006-08-01 15:48) [74]

мда..


 
GrayFace ©   (2006-08-01 16:14) [75]

tesseract ©   (01.08.06 13:29) [43]
> Уже в D7 не работают property.

какие property?

В OLE/классах  всё работает.


В object"ах тоже можно объявлять свойства, но они не работают.

begin...end ©   (01.08.06 13:27) [42]

Посмотрел - действительно. Вот уж не думал, что у object"ов могут быть виртуальные методы. Только _ObjSetup не инициализирует TBM, а инициализирует сам объект - заполняет нулями и пишет в нужное место указатель на TBM.

zamtmn ©   (01.08.06 13:39) [46]
вобщето формально constructor и procedure одно и тоже, только конструктор еще вызывает ObjSetup для инициализации VMT


Формально constructor и procedure - разные слова. На практике - тоже.

zamtmn ©   (01.08.06 14:36) [62]

Проще вызвать ZeroMem и записать адрес TBM в нужное место (наверняка это начало). Ты все-равно зависишь от структуры TBM и места где лежит на него указатель, так хоть не будешь зависить от реализации конструкторов.

Сергей М. ©   (01.08.06 14:43) [64]
Если же ты заботишься о результирующем объеме кода - это тебе не сюда: везде будет присутствовать и VMT, и RTTI, и прочие таблицы .. практически в полном объеме ..

В object есть только VMT. Ни RTTI, ни Interface Table, ни Dinamic Table, ни имени класса, ни предка. А значит, не нужно о них заботиться при создании VMT. В общем, неплохое решение.


 
Сергей М. ©   (2006-08-01 16:22) [76]


> GrayFace ©   (01.08.06 16:


Ловля блох.


 
zamtmn ©   (2006-08-01 16:25) [77]

>>Проще вызвать ZeroMem и записать адрес TBM в нужное место (наверняка
>>это начало). Ты все-равно зависишь от структуры TBM и места где лежит на
>>него указатель, так хоть не будешь зависить от реализации конструкторов.
ZeroMem не отделаться, если объект создает дополнительные структуры, нужно вызывать родные конструктор/деструктор


 
zamtmn ©   (2006-08-01 16:26) [78]

>>Ловля блох.
ваши предложения?


 
GrayFace ©   (2006-08-01 16:29) [79]

zamtmn ©   (01.08.06 16:25) [77]
ZeroMem не отделаться, если объект создает дополнительные структуры, нужно вызывать родные конструктор/деструктор

А понизить его ранг до процедуры и после ZeroMem вызывать по-обычному?


 
Сергей М. ©   (2006-08-01 16:31) [80]


> zamtmn ©   (01.08.06 16:26) [78]
> ваши предложения?


Мои предложения  не отличатся оригинальностью - не маяться дурью и использовать class.


 
Джо ©   (2006-08-01 16:52) [81]

Или использовать records в Delphi 2006 :)


 
zamtmn ©   (2006-08-01 17:47) [82]

>>Мои предложения  не отличатся оригинальностью - не маяться дурью и использовать class
и в чем будет принципиальная разница? ну разве что ненадо хранить предка и поля

>>Или использовать records в Delphi 2006 :)
дак они у меня работают, только соответственно методов не имеют


 
Джо ©   (2006-08-01 17:51) [83]

> дак они у меня работают, только соответственно методов не
> имеют

В том и фишка, что в D2006 в них методы можно объявлять и даже перегрузку операторов. Ну, и конструкторы (с параметрами).


 
zamtmn ©   (2006-08-01 17:55) [84]


> В том и фишка, что в D2006 в них методы можно объявлять
> и даже перегрузку операторов. Ну, и конструкторы (с параметрами).
>

Это всё есть у обжекта, а фишка с перегрузкой операторов без автоматических деструкторов малоприменима


 
Джо ©   (2006-08-01 17:57) [85]

> а фишка с перегрузкой операторов без автоматических деструкторов
> малоприменима

Почему?


 
zamtmn ©   (2006-08-01 18:09) [86]

допустим перегрузили + и *
d:=(a+b)*c
можно посчитать только с применением промежуточной пременной или заменив значение a(b)
без автодеструктора компилятор забудет о промежуточной переменной:(
и если это сложные типы
например
record
 pdata:^data;
 x,y....:intrger;
end;
будет утечка памяти
кстати в freepascal вот шаблоны появились:), раз уж пошла тема про "сианизацию" паскаля


 
jack128 ©   (2006-08-01 18:30) [87]

zamtmn   (01.08.06 0:12) [34]
пост 27 прекрасно компилируется на D2006 без всяких патчей.

ну значит у меня дома какой то особенный дельфи стоит, на котором эта фишка не компилируется. (Borland® Delphi® for Microsoft® Windows™ Version 10.0.2151.25345 )

zamtmn ©   (01.08.06 12:38) [38]
vmtQueryInterface    = 0;
vmtAddRef            = 4;
vmtRelease           = 8;
vmtCreateObject      = 12;

ниче не напоминает?

а.. То есть если я в своей программе объявлю константу const QueryInterface = 12 - то моя прога привязана к ком?

tesseract ©   (01.08.06 13:29) [43]
находиться "следы" в частности ссылки на GUID у Tobject.  Хотя ИМХО это RTTI- радости.


Это для поддержки ком, а конкретно IUnknown.QueryInterface.  Но и без ком, всё будет отлично работать.
И вообще, дельфи совместима с ком, но не привязана к нему. Например интерфейсов без guid"а в ком быть не может, а в дельфи есть.


 
zamtmn ©   (2006-08-01 18:51) [88]

у меня на 10.0.2151.25345

program Project1;
type
TestObj = object
private
 procedure Test;
end;
procedure TestObj.Test;
begin
    readln;
end;
begin
end.

компилируешся. патчей не ставил

>>QueryInterface = 12 - то моя прога привязана к ком?

>>Это для поддержки ком, а конкретно IUnknown.QueryInterface.  Но и без ком, всё будет отлично работать.
ладно здаюсь, не привязка, ПОДДЕРЖКА
Мне поддержка COM любым объектом моей программы ненужна


 
Игорь Шевченко ©   (2006-08-02 11:26) [89]


> ладно здаюсь, не привязка, ПОДДЕРЖКА
> Мне поддержка COM любым объектом моей программы ненужна


Ты бредишь. Читай [49] до полного просветления.


 
GrayFace ©   (2006-08-04 09:17) [90]

Ну дак что ты решил? Есть, как минимум 2 нормальных решения проблемы - [79] или такое: ZeroMem, конструктор базового боъекта, изменение TBM.


 
GrayFace ©   (2006-08-04 09:18) [91]

изменение TBM
В смысле изменение указателя на TBM в объекте.



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

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

Наверх




Память: 0.73 MB
Время: 0.06 c
15-1154543754
X9
2006-08-02 22:35
2006.08.27
Пришлашение Gmail


15-1154424567
tsa
2006-08-01 13:29
2006.08.27
Головокружение от успехов


2-1155058563
koha
2006-08-08 21:36
2006.08.27
Зацените прогу


2-1154930963
валет
2006-08-07 10:09
2006.08.27
word


15-1154262709
Alral
2006-07-30 16:31
2006.08.27
Коммандная строка





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