Передача объекта в PascalScript

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Ответить
krab22
новенький
Сообщения: 17
Зарегистрирован: 24.01.2013 06:52:43

Передача объекта в PascalScript

Сообщение krab22 »

Добрый день господа!

Вопрос по PascalScript.
Подскажите можно ли (и если можно, то как) передать объект из приложения запускающего скрипт в выполняемый скрипт?
Именно имплементированный объект - не класс.

А массив объектов?

Заранее благодарен за ответ!
CynicRus
постоялец
Сообщения: 106
Зарегистрирован: 28.06.2012 14:31:11

Сообщение 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!
krab22
новенький
Сообщения: 17
Зарегистрирован: 24.01.2013 06:52:43

Сообщение 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 обязателен?
CynicRus
постоялец
Сообщения: 106
Зарегистрирован: 28.06.2012 14:31:11

Сообщение CynicRus »

krab22 писал(а):У вас передается рекорд?
А с объектами, например, типа TCollection и т.п. таким же образом действовать?

Добавлено спустя 1 минуту 10 секунд:
Тип вызова extdecl обязателен?


Да всё равно что передавать, хотите класс, хотите рекорд, хотите простой тип.

Код: Выделить всё

{$MACRO ON}
{$ifdef PS_SafeCall}
  {$define extdecl := safecall}
{$else}
  {$define extdecl := register}
{$endif}


вот мой extdecl, насчёт обязательности - я не уверен.
krab22
новенький
Сообщения: 17
Зарегистрирован: 24.01.2013 06:52:43

Сообщение krab22 »

Все, в общем то, понятно.
Просто смутила строчка:

Код: Выделить всё

'record int1,int2,int3,int4,int5,int6,int7,int8,int9,int10,int11,int12,int13,int14,int15,int16:integer; end;'

Типа объявление самого рекорда. Вот и спросил про класс.
Спасибо за ответы.
Где то дока вразумительная по данному чуду(PascalScript) есть? Не подскажите? Или научный тык рулит? :D
CynicRus
постоялец
Сообщения: 106
Зарегистрирован: 28.06.2012 14:31:11

Сообщение CynicRus »

krab22 писал(а):Все, в общем то, понятно.
Просто смутила строчка:

Код: Выделить всё

'record int1,int2,int3,int4,int5,int6,int7,int8,int9,int10,int11,int12,int13,int14,int15,int16:integer; end;'

Типа объявление самого рекорда. Вот и спросил про класс.
Спасибо за ответы.
Где то дока вразумительная по данному чуду(PascalScript) есть? Не подскажите? Или научный тык рулит? :D


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

PS: ну а начальное можно почерпнуть вот тут:
https://github.com/remobjects/pascalscript/wiki/Using-RemObjects-Pascal-Script
krab22
новенький
Сообщения: 17
Зарегистрирован: 24.01.2013 06:52:43

Сообщение krab22 »

Ок. Спасибо!
На GitHub я уже смотрел...

Добавлено спустя 21 час 45 минут 21 секунду:
Извините за назойливость.... :)
А нужно описывать интерфейс класса при его регистрации в PascalScript?
CynicRus
постоялец
Сообщения: 106
Зарегистрирован: 28.06.2012 14:31:11

Сообщение 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;


Ну а дальше по аналогии с предыдущим примером.
krab22
новенький
Сообщения: 17
Зарегистрирован: 24.01.2013 06:52:43

Сообщение krab22 »

таким образом
весь публичный интерфейс необходимо регистрировать - описывать

Если достаточно сложный класс надо зарегистрировать - достаточно большой гемор

А если метод или свойство возвращает другой объект/класс его(другой класс) перед этим тоже надо регистрить - беда!!!
И так всю иерархию?
CynicRus
постоялец
Сообщения: 106
Зарегистрирован: 28.06.2012 14:31:11

Сообщение CynicRus »

Ну...для этого есть утилита Unit Importer, чтобы руками не геморроиться. Но после неё всё равно придётся руками подправлять.
krab22
новенький
Сообщения: 17
Зарегистрирован: 24.01.2013 06:52:43

Сообщение krab22 »

Ну, на сей раз, наверное, окончательное спасибо! :D
Ответить