Форум: "Начинающим";
Текущий архив: 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