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 проинициализировалась:(


zamtmn   (2006-08-01 15:27:00) [21]


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;


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


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


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

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


zamtmn   (2006-08-01 15:11:00) [23]

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


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


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


Чавой-то ?!

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


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


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


zamtmn   (2006-08-01 15:05:00) [25]

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


zamtmn   (2006-08-01 14:53:00) [26]

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

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


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


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


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

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


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


> 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, и прочие таблицы .. практически в полном объеме ..


zamtmn   (2006-08-01 14:41:00) [29]

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


zamtmn   (2006-08-01 14:36:00) [30]

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

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

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


StriderMan   (2006-08-01 14:32:00) [31]


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

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

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


begin...end   (2006-08-01 14:28:00) [32]

> zamtmn

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


zamtmn   (2006-08-01 14:26:00) [33]

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


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


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


StriderMan   (2006-08-01 14:19:00) [35]


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

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

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

> zamtmn   (01.08.06 00:12) [34]


begin...end   (2006-08-01 14:17:00) [36]

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

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

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

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


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


> 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

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


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


> 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.

?


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

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

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


zamtmn   (2006-08-01 13:59:00) [40]

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


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

Наверх

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