AddClass и AddObject
Уважаемые форумчане
Помогите, плз, разобраться с FastScript
В хелпе написано, что при добавлении своего класса через AddClass автоматически становятся доступны из скрипта все published свойства класса. На деле делаю так:
TSprite=class(TObject)
published
function Name: string;
public
end;
var
Sprite: TSprite;
begin
Sprite:=TSprite.Create;
fsScript1.AddClass(TSprite,'TObject');
fsScript1.AddObject('Sender',Sprite);
fsScript1.Parent:=fsGlobalUnit;
if not fsScript1.Compile then ShowMessage(fsScript1.ErrorMsg);
fsScript1.Execute;
end;
В скрипте делается вызов "Sender.Name", а на самом деле вылетает ошибка, типа "Undeclared identifier: Name".
Может кто сталкивался с такой проблемой?
P.S.: FastScript 1.6
Заранее благодарен.
Помогите, плз, разобраться с FastScript
В хелпе написано, что при добавлении своего класса через AddClass автоматически становятся доступны из скрипта все published свойства класса. На деле делаю так:
TSprite=class(TObject)
published
function Name: string;
public
end;
var
Sprite: TSprite;
begin
Sprite:=TSprite.Create;
fsScript1.AddClass(TSprite,'TObject');
fsScript1.AddObject('Sender',Sprite);
fsScript1.Parent:=fsGlobalUnit;
if not fsScript1.Compile then ShowMessage(fsScript1.ErrorMsg);
fsScript1.Execute;
end;
В скрипте делается вызов "Sender.Name", а на самом деле вылетает ошибка, типа "Undeclared identifier: Name".
Может кто сталкивался с такой проблемой?
P.S.: FastScript 1.6
Заранее благодарен.
Комментарии
Это метод. А методы надо добавлять вручную через функции обертки.
Или попробуй парсер на
http://www.aquapack.com/fastscript/
Ссылку посмотрел, но мне нужна немного броле низкая универсальность. Скажем, внедрять отдельный класс из всего модуля... Или как, копировать его во внешний модуль, там обрабатывать этим скриптом и обратно потом вставлять результат?
И еще. Я так понял, property пока не обрабатываются?
Это пример их стандартной справки к FastScript
type
TMyClass = class(TObject)
...
end;
fsScript1.AddClass(TMyClass, ’TObject’);
Это сделает все published свойства данного класса доступными.
fsGlobalUnit.AddClass(TSprite,'TObject');
по поводу TPersistent - точно не помню, возможно я что-то путаю.
Грустно, грустно...
Заработает он, если наследоваться от TPersistent. Тогда published свойтсва будут доступны. Если наследоваться от TPersistent не получается, то надо каждое св-во реализовывать вручную:
with fsGlobalUnit.AddClass(TMyObject, 'TObject') do
AddProperty('Prop', 'Integer', GetProp, SetProp);
подробнее - в документации.
А для public property RTTI не генерируется и их приходится добавлять вручную.
Так, что property нормально обрабатываются. А если не хочется наследоваться от TPersistent попробуй использовать {$M+}. (Директиву пишу по памяти, проверить сейчас не где. Если действительно это оно, то думаю надо в HELP включить).
А на счет парсера... Чтобы "внедрять отдельный класс из всего модуля" я подумаю. Это будет несложно добавить. А пока можно руками удалять из сгенерированого модуля экспорт лишних классов :-). Главное не забывайте метками {START}...{END}. указывать парсеру экспортируемые методы.
Но новая беда пришла...
Требуется выполнять скрипт весьма часто, причем при каждом запуске в качестве како-го нибудь объекта (Например, тот же "Sender") будет выступать другой объект. Приведу пример:
Т.е. при первым выполнении скрипта хочется вывести имя первого объекта (с этим проблем нет), а при втором выполнении - уже имя второго объекта. На деле повторное AddObject никакого эффекта не производит (Делал по аналогии с paxScript, где переопределение объектов разрешено). Более того, при втором "Run" скрипт выполняется как будно дважды, т.е. два раза дапустил - а ShowMessage в скрипте отработало три раза...
Может что посоветуете? Особенно важен момент переопределения объектов...
begin
ShowMessage(Sender.ObjectName);
end.
begin
end.
Дальше найти в helpe к FS как вызывать скриптовую функцию...
procedure ShowName ( Sender: TSprite);
begin
ShowMessage(Sender.ObjectName);
end.
begin
end.
А программно там все таки удобнее внедрение пользовательских функций (не нужно делать функцию-обработчик). Еще все таки Exe'шник больше на 150Kb по сравнению с использующим FastScript (там много левых библиотек ненужных прицеплялось).
Интересно разработчики ФС намереваются "смотреть" в эту сторону???
также следует отметить не кривой uses..
Ну а главны же минусом paxScript'a как было сказано уже выше является цена )
.....
(только разве разбирать как работает classes.pas)