Использование классов с RemObjects PascalScript (Эта статья является моим вольным переложением статьи PS02 - Using Classes with RemObjects PascalScript с сайта RemObjects Software. Внесены изменения в текст и иллюстрации в связи с использованием моего собственного примера - Снег Север). В этой статье объясняется, как использовать существующие классы в RemObjects Pascal Script. Создадим новый проект с необходимыми компонентами (sample06). Затем добавим в проект новый модуль и создадим в нем свой класс, наподобие этого: unit MyClass; interface type TMySetItems = (msa, msb, msc); TMyset = set of TMySetItems; TmyClass = class private FData :string; FMySet :TMySet; public property Data :string read FData write FData; published property MySet :TMySet read FMySet write FMySet; end; implementation end. Откроем затем файл MyClass.pas с помощью программы Unit Import tool, которая сгенерирует для нас модуль импорта для нашего класса (эта программа находится в "...\RemObjects Software\Pascal Script for Delphi\Bin\PSUnitImporter.exe"):
Нажимаем кнопку "Go" и добавляем сгенерированный модуль uPSI_MyClass.pas в ваш проект. Теперь выбираем главную форму и создаем обработчик для события OnCreate:
В событии Create мы создаем экземпляр TPSImport_MyClass (класса, сгенерированного программой импорта) и добавляем его в список плагинов скриптового движка:
Если вы намерены использовать этот плагин во многих проектах, вы можете добавить его в пакет и установить в палитру компонентов. Теперь можно использовать ваш класс в скриптах:
Использование существующего TMyClass в скриптовом движке Можно также использовать существующие переменные типа TMyClass из скриптового движка. Для этого добавим переменную FMyClass: TMyClass к классу нашей формы и создадим экземпляр класса:
Теперь в событии OnCompile неабходимо дать скриптовому движку знать об этой новой переменной. Для этого есть два пути: AddRegisteredVariable and AddRegisteredPtrVariable. Различие между ними в том, что AddRegisteredPtrVariable будет вносить изменения непосредственно в переменную, так что если вы освобождаете переменную FMyClass и создаете ее заново, скриптовый движок начнет использовать новую переменную. AddRegisteredPTRVariable имеет два параметра – имя и тип. Добавим следующий код в событие скриптового движка OnCompile: procedure TMainForm.ceCompile(Sender: TPSScript); begin Sender.AddMethod(Self, @TMainForm.Writeln, 'procedure Writeln(const s: string)'); Sender.AddRegisteredVariable('Self', 'TForm'); Sender.AddRegisteredVariable('Application', 'TApplication');
Sender.AddRegisteredPTRVariable('MyClass', 'TMyClass'); end;
Теперь компилятор знает об этой переменной, но модуль времени выполнения не знает где эта переменная. Чтобы дать ему об этом знать, используем событие OnExecute. Метод SetPointerToData может присваивать значение переменной скрипта, добавленной с помощью AddRegisteredPTRVariable. Первый параметр – это имя переменной, второй – адрес экземпляра переменной, которая передается в скрипт, последний параметр – требуемый тип переменной (обычно вы будете использовать здесь ce.FindNamedType('nameoftype')). procedure TMainForm.ceExecute(Sender: TPSScript); begin ce.SetVarToInstance('SELF', Self); ce.SetVarToInstance('Application', Application);
ce.SetPointerToData('MyClass', @FMyClass, ce.FindNamedType('TMyClass')); end;
(sample07) Конечный результат запуска скрипта:
|