Форум: "Начинающим";
Текущий архив: 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.
Страницы: 1 2 3 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.08.27;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.047 c