AddClass и AddObject

отредактировано 10:40 Раздел: FastScript
Уважаемые форумчане ;)

Помогите, плз, разобраться с 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

Заранее благодарен.

Комментарии

  • Vlad MatvienkoVlad Matvienko Mariupol
    отредактировано 10:40
    IMHO function Name: string; это не свойство...
    Это метод. А методы надо добавлять вручную через функции обертки.
    Или попробуй парсер на
    http://www.aquapack.com/fastscript/

  • отредактировано July 2004
    Да я пробовал уже и "property Name: string read GetName" ;) . Результат один...

    Ссылку посмотрел, но мне нужна немного броле низкая универсальность. Скажем, внедрять отдельный класс из всего модуля... Или как, копировать его во внешний модуль, там обрабатывать этим скриптом и обратно потом вставлять результат?

    И еще. Я так понял, property пока не обрабатываются?
  • отредактировано 10:40
    published свойства могут быть только у наследников TPersistent.
  • отредактировано 10:40
    Хм... TSprite=class(TPersistent) ?

    Это пример их стандартной справки к FastScript

    type
    TMyClass = class(TObject)
    ...
    end;
    fsScript1.AddClass(TMyClass, ’TObject’);

    Это сделает все published свойства данного класса доступными.
  • отредактировано 10:40
    Кроме того, классы надо добавлять в fsGlobalUnit, а не в экземпляр скрипта:

    fsGlobalUnit.AddClass(TSprite,'TObject');

    по поводу TPersistent - точно не помню, возможно я что-то путаю.
  • отредактировано 10:40
    Не, добавление в fsGlobalUnit никак не повлияло... ;)
    Грустно, грустно...
  • отредактировано July 2004
    Следующий код работать не будет:
    type
      TMyObject = class(TObject)
      private
        FProp: Integer;
      published
        property Prop: Integer read FProp write FProp;
      end;
    
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      fsGlobalUnit.AddClass(TMyObject, 'TObject');
      fsScript1.Parent := fsGlobalUnit;
      fsScript1.Lines.Text := 'var o: TMyObject; begin o := TMyObject.Create; o.Prop := 1; ShowMessage(o.Prop) end.';
      fsScript1.Run;
    end;
    

    Заработает он, если наследоваться от TPersistent. Тогда published свойтсва будут доступны. Если наследоваться от TPersistent не получается, то надо каждое св-во реализовывать вручную:

    with fsGlobalUnit.AddClass(TMyObject, 'TObject') do
    AddProperty('Prop', 'Integer', GetProp, SetProp);

    подробнее - в документации.
  • отредактировано 10:40
    Ok, спасибо, буду пробовать ;) Если опять буду в тупике - вернусь ;)
  • Vlad MatvienkoVlad Matvienko Mariupol
    отредактировано 10:40
    Terminus написал:
    Да я пробовал уже и "property Name: string read GetName" ;) . Результат один...

    Ссылку посмотрел, но мне нужна немного броле низкая универсальность. Скажем, внедрять отдельный класс из всего модуля... Или как, копировать его во внешний модуль, там обрабатывать этим скриптом и обратно потом вставлять результат?

    И еще. Я так понял, property пока не обрабатываются?
    Как я понимаю FastScript получает доступ к published property на основе RTTI. Для того, что бы для класса компилятором генерировалась RTTI информация необходимо указывать при объявлении классов дерективу {$M+} или наследовать классы от TPersistent.
    А для public property RTTI не генерируется и их приходится добавлять вручную.

    Так, что property нормально обрабатываются. А если не хочется наследоваться от TPersistent попробуй использовать {$M+}. (Директиву пишу по памяти, проверить сейчас не где. Если действительно это оно, то думаю надо в HELP включить).

    А на счет парсера... Чтобы "внедрять отдельный класс из всего модуля" я подумаю. Это будет несложно добавить. А пока можно руками удалять из сгенерированого модуля экспорт лишних классов :-). Главное не забывайте метками {START}...{END}. указывать парсеру экспортируемые методы.
  • отредактировано 10:40
    ДА, унаследовал от TPersistent, все заработало. ;)
    Но новая беда пришла...

    Требуется выполнять скрипт весьма часто, причем при каждом запуске в качестве како-го нибудь объекта (Например, тот же "Sender") будет выступать другой объект. Приведу пример:
    //Текст скрипта
    begin
      ShowMessage(Sender.ObjectName);
    end.
    
    //Текст основной программы
    procedure TForm1.Button1Click(Sender: TObject);
    var
      Sprite,Sprite2: TSprite;
    begin
      Sprite:=TSprite.Create;
      Sprite2:=TSprite.Create;
      Sprite.ObjectName:='Первый объект';
      Sprite2.ObjectName:='Второй объект';
      fsScript1.Parent:=fsGlobalUnit;
      fsGlobalUnit.AddClass(TSprite,'TObject');
      fsScript1.AddObject('Sender',Sprite);
      fsScript1.Run;
      fsScript1.AddObject('Sender',Sprite2);
      fsScript1.Run;
    end;
    
    Т.е. при первым выполнении скрипта хочется вывести имя первого объекта (с этим проблем нет), а при втором выполнении - уже имя второго объекта. На деле повторное AddObject никакого эффекта не производит (Делал по аналогии с paxScript, где переопределение объектов разрешено). Более того, при втором "Run" скрипт выполняется как будно дважды, т.е. два раза дапустил - а ShowMessage в скрипте отработало три раза... :/

    Может что посоветуете? Особенно важен момент переопределения объектов...
  • Vlad MatvienkoVlad Matvienko Mariupol
    отредактировано 10:40
    procedure ShowName ( object: TSprite);
    begin
    ShowMessage(Sender.ObjectName);
    end.

    begin
    end.

    Дальше найти в helpe к FS как вызывать скриптовую функцию...
  • Vlad MatvienkoVlad Matvienko Mariupol
    отредактировано 10:40
    Точнее будет...

    procedure ShowName ( Sender: TSprite);
    begin
    ShowMessage(Sender.ObjectName);
    end.

    begin
    end.
  • отредактировано 10:40
    Огромное спасибо ;) . А то я уж испугался было, что прийдется париться с перекомпиляцией, удалением и повторным добавлением объектов...
  • отредактировано 10:40
    Отлично ;) . Только что переписал все с paxScript под FastScript. Получилось на удивление быстро и удобно ;) . Авторам респект.
  • отредактировано 10:40
    А интереса ради - чем pax не понравился?
  • отредактировано 10:40
    Ну, во первых, регистрация стоит 195 у.е., а FastScript - 19. Но хотя сейчас нет ни того, ни другого; при наших планах зарегистрировать через некоторое время весь "мелкий" софт (компоненты точнее), сделать это проще с FastScript ;) . А trial версия paxScript не дает запускать скрипт слишком часто. Если, например, поставить в цикл выполнение 10 скриптов подряд, вылетит "Unregistered version" или что-то в этом роде... Вот такие дела...

    А программно там все таки удобнее внедрение пользовательских функций (не нужно делать функцию-обработчик). Еще все таки Exe'шник больше на 150Kb по сравнению с использующим FastScript (там много левых библиотек ненужных прицеплялось).
  • отредактировано 10:40
    одним из основаных плюсов paxScript это возможность создания соих классов..

    Интересно разработчики ФС намереваются "смотреть" в эту сторону???


    также следует отметить не кривой uses..

    Ну а главны же минусом paxScript'a как было сказано уже выше является цена ;) )
  • отредактировано 10:40
    Нет, классы делать не собираемся. Uses в последней версии не кривее других ;)
  • отредактировано 10:40
    да, если честно, я сам слабо представляю как можно создавать классы с помощью скрипта, (в этом плане в делфях всё поурезано)
    .....
    (только разве разбирать как работает classes.pas)

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.