![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как "динамический" вызать конструктор? [D7, WinXP]
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 проинициализировалась:(
Джо (2006-07-31 23:53:00) [61]А у меня на D2006 приведенный код скомпилировался без проблем. Ставьте патчи, господа! ;)
tesseract (2006-07-31 23:52:00) [62]> [24] zamtmn (31.07.06 22:56)
Да уж и COM/OLE версиезависимым стал. Обычно для скриптовых языков OLE и используется. Позднее связывание имеет немало преимуществ.
jack128 (2006-07-31 23:50:00) [63]Джо © (31.07.06 23:48) [28]
н6о это на дельфе без апдейтов. Хотя не думаю, что нить с тех пор поменялось.
Джо (2006-07-31 23:48:00) [64]> [27] jack128 © (31.07.06 23:44)
Спасибо. Вот так дела... А я на Д2006 ни разу этим object'ом не пользовался, вот и не заметил.
jack128 (2006-07-31 23:44:00) [65]Джо © (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:34:00) [66]> [25] jack128 © (31.07.06 23:33)
> Все работает и будет работать как часы.
> в d2006 что то с объектами не работает. Что именно, уже
> не помню, если интересно - поищи в архивах - тему про появление
> delphi2006/
Гм. Интересно было бы почитать. Только архивы скачивать лень :) Если у кого-то сохранилась ветка — буду очень признателен за ее обнародование.
jack128 (2006-07-31 23:33:00) [67]Джо © (31.07.06 16:10) [22]
Все работает и будет работать как часы.
в d2006 что то с объектами не работает. Что именно, уже не помню, если интересно - поищи в архивах - тему про появление delphi2006/
zamtmn (2006-07-31 22:56:00) [68]Перед вызовом конструктора DELPHI7 в EDX пихает адрес VMT объекта, ассемблерная вставка всё решила, но уж больно это версиезависимо:(
zamtmn (2006-07-31 16:12:00) [69]ну пока предок у объектов один, но в дальнейшем планируется их много.
ну и для унификации вобщемто, тут уже столько плясок с бубном, что такая мелочь не помешает
Джо (2006-07-31 16:10:00) [70]> т.е их использование строго не рекомендуется и как будет
> работать не ясно.
Не нужно драматизировать. :) Все работает и будет работать как часы.
begin...end (2006-07-31 16:09:00) [71]> zamtmn (31.07.06 16:05) [18]
Я всё же не совсем понимаю, что мешает напрямую вызвать конструктор Init. Можно пояснить?
zamtmn (2006-07-31 16:08:00) [72]to tesseract
не разводи флейма
нужно на OBJECT`ах и все тут
tesseract (2006-07-31 16:05:00) [73]
> 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:05:00) [74]>>и прочие пляски с бубном -- они тут, собственно, на зачем?
Ну хочу я вызов конструктора из скрипта:), на асме его сделаю, но ведь долженбыть человечий способ
begin...end (2006-07-31 15:55:00) [75]Я очень извиняюсь, но procedure of object, TMethod и прочие пляски с бубном -- они тут, собственно, на зачем? Перед первым обращением к виртуальным методам вызываем конструктор Init, как самый обычный метод. В результате вызывается _ObjSetup и инициализируется VMT. Что ещё нужно-то?
> StriderMan
> tesseract
Добрый совет: почитайте справку по object types. Для общего, так сказать, развития.
tesseract (2006-07-31 15:54:00) [76]
> если constructor init заменить на procedure то все вызывается
> и работает
А если лобъект создан, зачем ему ещё один вызов конструктора?
tesseract (2006-07-31 15:53:00) [77]
> Собственно во фрипаскале указаным в первом посте методом
> конструктор вызывается, а дельфи на нем вылетает
Ну разумеется, Delphi не Pascal , да и пока не Free тоже.
В delphi у объектов коструктор называется create.
и создание его : MyObject:=TMyObject.Create;
ЗЫ: А почему ещё не в начинающих???
zamtmn (2006-07-31 15:51:00) [78]>> type
>> testobj=object
>> constructor init;
>> end;
>> SimpleProcOfObj=procedure of object;
>в последней строчке не тот object, который во второй
если constructor init заменить на procedure то все вызывается и работает
Игорь Шевченко (2006-07-31 15:46:00) [79]
> type
> testobj=object
> constructor init;
> end;
> SimpleProcOfObj=procedure of object;
в последней строчке не тот object, который во второй
zamtmn (2006-07-31 15:43:00) [80]ну если в 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. Собственно во фрипаскале указаным в первом посте методом конструктор вызывается, а дельфи на нем вылетает