Страница 1 из 1
Передача объекта в PascalScript
Добавлено: 30.03.2016 09:03:37
krab22
Добрый день господа!
Вопрос по PascalScript.
Подскажите можно ли (и если можно, то как) передать объект из приложения запускающего скрипт в выполняемый скрипт?
Именно имплементированный объект - не класс.
А массив объектов?
Заранее благодарен за ответ!
Re: Передача объекта в PascalScript
Добавлено: 30.03.2016 09:11:08
CynicRus
Не совсем понял, что имеется ввиду. Свой созданный экземпляр - в скрипт из программы запихнуть можно. Например - зарегистрировав свой тип и написав враппер, по которому функция вернёт в скрипт необходимый экземпляр оного.
например:
1) Добавляем тип:
Код: Выделить всё
AddTypeS('TTarget','record int1,int2,int3,int4,int5,int6,int7,int8,int9,int10,int11,int12,int13,int14,int15,int16:integer; end;');
2) Пишем враппер, возвращающий необходимый нам экземпляр:
Код: Выделить всё
function ps_GetTarget(): TTarget;extdecl;
begin
result := MyApp.GetMyTarget();
end;
3) Регистрируем этот враппер в скрипт:
Код: Выделить всё
AddFunction(@ps_GetTarget,'function GetTarget(): TTarget');
4) В скрипте:
Код: Выделить всё
var
t: TTarget;
begin
t:= GetTarget;
DoSomething();
end.
Proffit!
Re: Передача объекта в PascalScript
Добавлено: 30.03.2016 10:15:13
krab22
CynicRus писал(а):1) Добавляем тип:
Код: Выделить всё
AddTypeS('TTarget','record int1,int2,int3,int4,int5,int6,int7,int8,int9,int10,int11,int12,int13,int14,int15,int16:integer; end;');
Proffit!
У вас передается рекорд?
А с объектами, например, типа TCollection и т.п. таким же образом действовать?
Добавлено спустя 1 минуту 10 секунд:Тип вызова extdecl обязателен?
Re: Передача объекта в PascalScript
Добавлено: 30.03.2016 11:12:19
CynicRus
krab22 писал(а):У вас передается рекорд?
А с объектами, например, типа TCollection и т.п. таким же образом действовать?
Добавлено спустя 1 минуту 10 секунд:
Тип вызова extdecl обязателен?
Да всё равно что передавать, хотите класс, хотите рекорд, хотите простой тип.
Код: Выделить всё
{$MACRO ON}
{$ifdef PS_SafeCall}
{$define extdecl := safecall}
{$else}
{$define extdecl := register}
{$endif}
вот мой extdecl, насчёт обязательности - я не уверен.
Re: Передача объекта в PascalScript
Добавлено: 30.03.2016 11:39:19
krab22
Все, в общем то, понятно.
Просто смутила строчка:
Код: Выделить всё
'record int1,int2,int3,int4,int5,int6,int7,int8,int9,int10,int11,int12,int13,int14,int15,int16:integer; end;'
Типа объявление самого рекорда. Вот и спросил про класс.
Спасибо за ответы.
Где то дока вразумительная по данному чуду(PascalScript) есть? Не подскажите? Или научный тык рулит?

Re: Передача объекта в PascalScript
Добавлено: 30.03.2016 12:01:53
CynicRus
krab22 писал(а):Все, в общем то, понятно.
Просто смутила строчка:
Код: Выделить всё
'record int1,int2,int3,int4,int5,int6,int7,int8,int9,int10,int11,int12,int13,int14,int15,int16:integer; end;'
Типа объявление самого рекорда. Вот и спросил про класс.
Спасибо за ответы.
Где то дока вразумительная по данному чуду(PascalScript) есть? Не подскажите? Или научный тык рулит?

Только ковыряние исходников оного, как таковой вменяемой документации я не встречал. До всего приходилось доходить самому, вдумчиво медитируя в тонны кода

PS: ну а начальное можно почерпнуть вот тут:
https://github.com/remobjects/pascalscript/wiki/Using-RemObjects-Pascal-Script
Re: Передача объекта в PascalScript
Добавлено: 31.03.2016 10:34:03
krab22
Ок. Спасибо!
На GitHub я уже смотрел...
Добавлено спустя 21 час 45 минут 21 секунду:Извините за назойливость....
А нужно описывать интерфейс класса при его регистрации в PascalScript?
Re: Передача объекта в PascalScript
Добавлено: 01.04.2016 08:57:56
CynicRus
krab22 писал(а):Ок. Спасибо!
На GitHub я уже смотрел...
Добавлено спустя 21 час 45 минут 21 секунду:Извините за назойливость....
А нужно описывать интерфейс класса при его регистрации в PascalScript?
Не совсем понял, что имеется ввиду. На всякий случай приведу пример регистрации класса:
1) Описываем класс
Код: Выделить всё
MyClass = class
public
Constructor Create;
procedure MyProcedure;
function MyFunction(): integer;
end;
2) Регистрируем в компиляторе
Код: Выделить всё
procedure SIRegister_MyClass(CL: TPSPascalCompiler);
begin
with CL.AddClassN(CL.FindClass('TMyClass'),'TObject') do
begin
RegisterMethod('Constructor Create;');
RegisterMethod('procedure MyProcedure;');
RegisterMethod('Function MyFunction() : integer;');
end;
end;
Ну а дальше по аналогии с предыдущим примером.
Re: Передача объекта в PascalScript
Добавлено: 01.04.2016 10:36:47
krab22
таким образом
весь публичный интерфейс необходимо регистрировать - описывать
Если достаточно сложный класс надо зарегистрировать - достаточно большой гемор
А если метод или свойство возвращает другой объект/класс его(другой класс) перед этим тоже надо регистрить - беда!!!
И так всю иерархию?
Re: Передача объекта в PascalScript
Добавлено: 01.04.2016 12:04:26
CynicRus
Ну...для этого есть утилита Unit Importer, чтобы руками не геморроиться. Но после неё всё равно придётся руками подправлять.
Re: Передача объекта в PascalScript
Добавлено: 01.04.2016 12:13:38
krab22
Ну, на сей раз, наверное, окончательное спасибо!
