Главная страница
    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.



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

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

Наверх





Память: 0.56 MB
Время: 0.047 c
15-1154099012
vain
2006-07-28 19:03
2006.08.27
AboutBox


2-1154809655
fog
2006-08-06 00:27
2006.08.27
TScrollBox


2-1154625261
HelloWord
2006-08-03 21:14
2006.08.27
AdoTable


15-1154259582
antonn
2006-07-30 15:39
2006.08.27
вопросик по ява-скрипту


15-1154372410
Gydvin
2006-07-31 23:00
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский