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-07-31 23:53:00) [61]

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


tesseract   (2006-07-31 23:52:00) [62]

> [24] zamtmn   (31.07.06 22:56)


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


jack128   (2006-07-31 23:50:00) [63]

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


Джо   (2006-07-31 23:48:00) [64]

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

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


jack128   (2006-07-31 23:44:00) [65]

Джо ©   (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:34:00) [66]

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

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


jack128   (2006-07-31 23:33:00) [67]

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

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


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

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


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

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


Джо   (2006-07-31 16:10:00) [70]

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

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


begin...end   (2006-07-31 16:09:00) [71]

> zamtmn   (31.07.06 16:05) [18]

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


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

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


tesseract   (2006-07-31 16:05:00) [73]


> 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:05:00) [74]

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


begin...end   (2006-07-31 15:55:00) [75]

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

> StriderMan
> tesseract

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


tesseract   (2006-07-31 15:54:00) [76]


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


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


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


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


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

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

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

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


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

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


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


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


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


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

ну если в 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. Собственно во фрипаскале указаным в первом посте методом конструктор вызывается, а дельфи на нем вылетает


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

Наверх

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