Передача объекта в PascalScript
Модератор: Модераторы
Передача объекта в PascalScript
Добрый день господа!
Вопрос по PascalScript.
Подскажите можно ли (и если можно, то как) передать объект из приложения запускающего скрипт в выполняемый скрипт?
Именно имплементированный объект - не класс.
А массив объектов?
Заранее благодарен за ответ!
Вопрос по PascalScript.
Подскажите можно ли (и если можно, то как) передать объект из приложения запускающего скрипт в выполняемый скрипт?
Именно имплементированный объект - не класс.
А массив объектов?
Заранее благодарен за ответ!
Не совсем понял, что имеется ввиду. Свой созданный экземпляр - в скрипт из программы запихнуть можно. Например - зарегистрировав свой тип и написав враппер, по которому функция вернёт в скрипт необходимый экземпляр оного.
например:
1) Добавляем тип:
2) Пишем враппер, возвращающий необходимый нам экземпляр:
3) Регистрируем этот враппер в скрипт:
4) В скрипте:
Proffit!
например:
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!
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 обязателен?
krab22 писал(а):У вас передается рекорд?
А с объектами, например, типа TCollection и т.п. таким же образом действовать?
Добавлено спустя 1 минуту 10 секунд:
Тип вызова extdecl обязателен?
Да всё равно что передавать, хотите класс, хотите рекорд, хотите простой тип.
Код: Выделить всё
{$MACRO ON}
{$ifdef PS_SafeCall}
{$define extdecl := safecall}
{$else}
{$define extdecl := register}
{$endif}вот мой extdecl, насчёт обязательности - я не уверен.
Все, в общем то, понятно.
Просто смутила строчка:
Типа объявление самого рекорда. Вот и спросил про класс.
Спасибо за ответы.
Где то дока вразумительная по данному чуду(PascalScript) есть? Не подскажите? Или научный тык рулит?
Просто смутила строчка:
Код: Выделить всё
'record int1,int2,int3,int4,int5,int6,int7,int8,int9,int10,int11,int12,int13,int14,int15,int16:integer; end;'Типа объявление самого рекорда. Вот и спросил про класс.
Спасибо за ответы.
Где то дока вразумительная по данному чуду(PascalScript) есть? Не подскажите? Или научный тык рулит?
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
Ок. Спасибо!
На GitHub я уже смотрел...
Добавлено спустя 21 час 45 минут 21 секунду:
Извините за назойливость....
А нужно описывать интерфейс класса при его регистрации в PascalScript?
На GitHub я уже смотрел...
Добавлено спустя 21 час 45 минут 21 секунду:
Извините за назойливость....
А нужно описывать интерфейс класса при его регистрации в PascalScript?
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;
Ну а дальше по аналогии с предыдущим примером.
таким образом
весь публичный интерфейс необходимо регистрировать - описывать
Если достаточно сложный класс надо зарегистрировать - достаточно большой гемор
А если метод или свойство возвращает другой объект/класс его(другой класс) перед этим тоже надо регистрить - беда!!!
И так всю иерархию?
весь публичный интерфейс необходимо регистрировать - описывать
Если достаточно сложный класс надо зарегистрировать - достаточно большой гемор
А если метод или свойство возвращает другой объект/класс его(другой класс) перед этим тоже надо регистрить - беда!!!
И так всю иерархию?
Ну...для этого есть утилита Unit Importer, чтобы руками не геморроиться. Но после неё всё равно придётся руками подправлять.
Ну, на сей раз, наверное, окончательное спасибо! 
