Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.08.27;
Скачать: CL | DM;

Вниз

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

 
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.



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

Текущий архив: 2006.08.27;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.033 c
15-1154599687
3S
2006-08-03 14:08
2006.08.27
Как вернуть..


2-1155116069
DelphiLexx
2006-08-09 13:34
2006.08.27
Скопировать все данные из TRxMemoryData в TFIBDataSet


3-1150796690
N
2006-06-20 13:44
2006.08.27
Corrupt table index header


2-1154619126
Чабан
2006-08-03 19:32
2006.08.27
SHGetSpecialFolderLocation


15-1154532828
MultiCreator
2006-08-02 19:33
2006.08.27
Спасение Delphi7