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

Вниз

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

 
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.



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

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

Наверх




Память: 0.64 MB
Время: 0.037 c
9-1133498299
Fosgen
2005-12-02 07:38
2006.08.27
"Ошибка перечисления" из-за чего может возникать?


2-1155113001
Хам
2006-08-09 12:43
2006.08.27
Работа с ini файлами


4-1147028029
Lik
2006-05-07 22:53
2006.08.27
User logon из сервиса


2-1155025424
learner
2006-08-08 12:23
2006.08.27
Быстрый линейный график на координатной сетке ( OpenGL ).


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