Форум: "Начинающим";
Текущий архив: 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.
← →
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.
← →
Джо © (2006-08-01 16:52) [81]Или использовать records в Delphi 2006 :)
← →
zamtmn © (2006-08-01 17:47) [82]>>Мои предложения не отличатся оригинальностью - не маяться дурью и использовать class
и в чем будет принципиальная разница? ну разве что ненадо хранить предка и поля
>>Или использовать records в Delphi 2006 :)
дак они у меня работают, только соответственно методов не имеют
← →
Джо © (2006-08-01 17:51) [83]> дак они у меня работают, только соответственно методов не
> имеют
В том и фишка, что в D2006 в них методы можно объявлять и даже перегрузку операторов. Ну, и конструкторы (с параметрами).
← →
zamtmn © (2006-08-01 17:55) [84]
> В том и фишка, что в D2006 в них методы можно объявлять
> и даже перегрузку операторов. Ну, и конструкторы (с параметрами).
>
Это всё есть у обжекта, а фишка с перегрузкой операторов без автоматических деструкторов малоприменима
← →
Джо © (2006-08-01 17:57) [85]> а фишка с перегрузкой операторов без автоматических деструкторов
> малоприменима
Почему?
← →
zamtmn © (2006-08-01 18:09) [86]допустим перегрузили + и *
d:=(a+b)*c
можно посчитать только с применением промежуточной пременной или заменив значение a(b)
без автодеструктора компилятор забудет о промежуточной переменной:(
и если это сложные типы
например
record
pdata:^data;
x,y....:intrger;
end;
будет утечка памяти
кстати в freepascal вот шаблоны появились:), раз уж пошла тема про "сианизацию" паскаля
← →
jack128 © (2006-08-01 18:30) [87]zamtmn (01.08.06 0:12) [34]
пост 27 прекрасно компилируется на D2006 без всяких патчей.
ну значит у меня дома какой то особенный дельфи стоит, на котором эта фишка не компилируется. (Borland® Delphi® for Microsoft® Windows™ Version 10.0.2151.25345 )
zamtmn © (01.08.06 12:38) [38]
vmtQueryInterface = 0;
vmtAddRef = 4;
vmtRelease = 8;
vmtCreateObject = 12;
ниче не напоминает?
а.. То есть если я в своей программе объявлю константу const QueryInterface = 12 - то моя прога привязана к ком?
tesseract © (01.08.06 13:29) [43]
находиться "следы" в частности ссылки на GUID у Tobject. Хотя ИМХО это RTTI- радости.
Это для поддержки ком, а конкретно IUnknown.QueryInterface. Но и без ком, всё будет отлично работать.
И вообще, дельфи совместима с ком, но не привязана к нему. Например интерфейсов без guid"а в ком быть не может, а в дельфи есть.
← →
zamtmn © (2006-08-01 18:51) [88]у меня на 10.0.2151.25345
program Project1;
type
TestObj = object
private
procedure Test;
end;
procedure TestObj.Test;
begin
readln;
end;
begin
end.
компилируешся. патчей не ставил
>>QueryInterface = 12 - то моя прога привязана к ком?
>>Это для поддержки ком, а конкретно IUnknown.QueryInterface. Но и без ком, всё будет отлично работать.
ладно здаюсь, не привязка, ПОДДЕРЖКА
Мне поддержка COM любым объектом моей программы ненужна
← →
Игорь Шевченко © (2006-08-02 11:26) [89]
> ладно здаюсь, не привязка, ПОДДЕРЖКА
> Мне поддержка COM любым объектом моей программы ненужна
Ты бредишь. Читай [49] до полного просветления.
← →
GrayFace © (2006-08-04 09:17) [90]Ну дак что ты решил? Есть, как минимум 2 нормальных решения проблемы - [79] или такое: ZeroMem, конструктор базового боъекта, изменение TBM.
← →
GrayFace © (2006-08-04 09:18) [91]изменение TBM
В смысле изменение указателя на TBM в объекте.
Страницы: 1 2 3 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.08.27;
Скачать: [xml.tar.bz2];
Память: 0.73 MB
Время: 0.06 c