Как передать в скрипт переменные и объект

2»

Комментарии

  • отредактировано 18:15
    Есть приложение к которому надо присабачить поддержку скриптов. Приложение осуществляет сбор с плат АЦП, проводит мат обработку, осуществляет управление ЦАП и цифровыми выходами. НАписано оно на Visual C++. Мне надо сделать так чтобы эта программа всё делала по зарание написаному сценарию - некая циклонрамма. Так вот хочу попробывать присабачить сюда fastscript и писать скрипты на VBA. Но так как приложение написано на Visual то единственный способ прилепить к нему FastScript - это DLL. Поэтому и спрашиваю можно ли как то это сделать. Я к сожалению не очень силён в идеалогии VCL.
  • отредактировано 18:15
    Можете попробовать сделать обертку, но как это реализовать я незнаю.Почему бы вам не воспользоватся Windows Script Host.
  • отредактировано 18:15
    Спасибо за примерчик. А можешь что-нить похожее но только для своего класса

    class MyClass
    {
    char mas[10];
    public:
    void SetMas(char*);
    void GetMas(char*);
    }

    void MyClass :: SetMas(char* Str)
    {
    strcpy(mas, "Test");
    }

    void MyClass :: GetMas(char* Str)
    {
    strcpy(Str, mas);
    }


    Вот хотя бы что-то такое как передать в скрипт???
  • отредактировано 18:15
    Кстати, что-то у меня получается изменить только свойства самой передаваемой в скрип вормы. Т.е. например
    Form1.Caption = "brbrbr";
    а вот изменить свойства эдементов формы не получается. Есть у меня на форме кнопка Exit
    Form1.Exit.Caption = "brbrbrbr";
    Ругается что не знает он что такое Exit.
  • отредактировано 18:15
    написал:
    Спасибо за примерчик. А можешь что-нить похожее но только для своего класса

    class MyClass
    {
    char mas[10];
    public:
    void SetMas(char*);
    void GetMas(char*);
    }

    void MyClass :: SetMas(char* Str)
    {
    strcpy(mas, "Test");
    }

    void MyClass :: GetMas(char* Str)
    {
    strcpy(Str, mas);
    }


    Вот хотя бы что-то такое как передать в скрипт???
    Ваш класс должен быть наследником TObject(конечно если вам не нужен его интерфейс сделайте закрытое наследование) по другому не получится.
    В вашем случае придётся добавить:
    - новый класс (наследник TObject)
    - методы вашего класса.
    И только после этого передовать объект.
  • отредактировано 18:15
    написал:
    Кстати, что-то у меня получается изменить только свойства самой передаваемой в скрип вормы. Т.е. например
    Form1.Caption = "brbrbr";
    а вот изменить свойства эдементов формы не получается. Есть у меня на форме кнопка Exit
    Form1.Exit.Caption = "brbrbrbr";
    Ругается что не знает он что такое Exit.
    Нужно передовать все объекты,а затем в скрипте работать с ними по отдельности.
    Т.е. Form1.Caption и Exit.Caption.
  • отредактировано 18:15
    Понятно. НУ почему этого нет в инструкции... Эх... Настоящие программисты никогда не пишут инмтрукции...
    Спасибо за помощь
  • отредактировано 18:15
    У вас больше нет вопросов?
  • отредактировано 18:15
    Попозже будут :-)
  • отредактировано 18:15
    Появился....
    Точнее два.
    1. Можно ли описать функции в одном файле скрипта, а в другом пользоваться этими функциями (их вызывать)
    2. Мне надо выполнять скрипт по блокам... В блоке может быть вызвано несколдько функций. Можно ли как то такое сделать. Т.е. мне надо приостанавливать выполнение скрипта.
  • отредактировано 18:15
    написал:
    1. Можно ли описать функции в одном файле скрипта, а в другом пользоваться этими функциями (их вызывать)
    Да с помощью директивы uses (в руководстве по FS есть описание с.м."Использование директивы "uses""(стр. 66)).
    написал:
    2. Мне надо выполнять скрипт по блокам... В блоке может быть вызвано несколдько функций. Можно ли как то такое сделать. Т.е. мне надо приостанавливать выполнение скрипта.
    Так же можно найти в руководстве по FS "Отладка скрипта" (стр. 56).

    Вы вообше читаете документацию ;) ?
  • отредактировано 18:15
    Да читал я эту документацию...


    скрипт
    #include "unit2.cpp";

    {
    func();
    }

    файл unin2.cpp
    #language C++Script
    void func()
    {
    ShowMessage("Тест");
    }

    Выдаёт ошибку " '{' Expected "

    ?????
  • отредактировано 18:15
    написал:
    Да читал я эту документацию...


    скрипт
    #include "unit2.cpp";

    {
    func();
    }

    файл unin2.cpp
    #language C++Script
    void func()
    {
    ShowMessage("Тест");
    }

    Выдаёт ошибку " '{' Expected "

    ?????
    Нужно чтобы и в подключаемом модуле были скобки главной функции.
    скрипт 
    #include "unit2.cpp";
    
    {
    func();
    }
    
    файл unin2.cpp
    #language C++Script
    void func()
    {
    ShowMessage("Тест");
    }
    //--------Main function
    {
    
    }
    
  • отредактировано 18:15
    пробывал и скобки главной функции делать, пофиг. Ошибка таже самая
  • отредактировано 18:15
    Так в чём может быть глюк....
  • отредактировано 18:15
    Как я уже говорил "Нужно чтобы и в подключаемом модуле были скобки главной функции." и ещё уберите символ ";" после #include "unit2.cpp"
  • отредактировано 18:15
    На счёт приостановки выполнения скрипта ничег оне понял...
    Опишу то что мне надо.
    допустим есть такой код скрипта

    {
    for(int i=0;i<10;i++)
    {
    iValue = i;
    while(!bReplace)
    Sleep(100); //вот здесь бы мне уснуть... Да вот Sleep нету
    }
    }

    Короче здесь мне надо сменить 10 раз значение iValue (переменная передаётся в срипт из основной программы, так же как и bReplace). Причём сменить его надо в определённые моменты (определяется переменной bReplace).

    Вот как мне такую задачу решить?! Sleep то ведь использовать нельзя...
  • отредактировано 18:15
    Так сделайте класс с методом который вызывает функцию Sleep.
    Делаем так:

    1)Объявляем новый класс.
    class TmyTimer: public TObject
    {
    public:
    void __fastcall CallTime(int Interval);
    };
    

    2)К методам формы добавляем функцию обработчик:
    Variant __fastcall CallMethod(TObject *Object,TMetaClass *MetaClass,const AnsiString Name,Variant &Var);
    

    3)Делаем реализацию обоих методов:
    void __fastcall TmyTimer::CallTime(int Interval)
    {
    Sleep(Interval);
    }
    
    Variant __fastcall TForm1::CallMethod(TObject *Object,TMetaClass *MetaClass,const AnsiString Name,Variant &Var)
    {
    int * p;
    if (Name == "CALLTIME")
    {
    ((TmyTimer*)Object)->CallTime(Var.GetElement(0).intVal);
    }
    return 0;
    
    }
    

    4) Добавляем класс и метод в скрипт:
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
    fsScript1->Parent = fsGlobalUnit();
    fsScript1->AddClass(__classid(TmyTimer),"TObject")->AddMethod("procedure CallTime(Interval:integer)",Form1->CallMethod);
    fsScript1->Run();
    }
    

    5)Код скрипта:
    TmyTimer Timer;
    
    {
    Timer = new TmyTimer;
    Timer.CallTime(1000);
    ShowMessage("Time out");
    }
    

    Если не понятно посмотрите пример.
  • отредактировано October 2005
    Спасибо за примерчик...
    Наткнулся ещё на проблему...

    Есть, например, такой скрипт

    {
    MyTestFunc(70);
    ShowMessage("Задержка кончилаь1");

    MyTestFunc(70);
    ShowMessage("Задержка кончилаь2");

    MyTestFunc(70);
    ShowMessage("Задержка кончилаь3");
    }

    Описание MyTestFunc
    void TForm1 :: MyTestFunc(int i)
    {
    m_bPause = true;
    while(m_bPause)
    Sleep(i);
    }

    Функция MyTestFunc реализует паузу в скрипте.
    Хочу длину паузы определять сам.
    Для этого выполнение скрипта засунул в отдельный поток, а на форму положил кнопку, которой меняю значение m_bPause на false.

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    m_bPause = false;
    }

    Так вот при нахатии на эту кнопку возникает ошибка "Project Script.exe raised exception class EInvalidOperation with message 'Canvas does not allow drawing'. Process stopped. Use Step or Run to continue".

    Если же записать вот так

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    m_bPause = false;
    Sleep(100);
    }

    ТО вроде всё нормалаьно...
    Что за затык. Могу прислать своё творчество...
  • отредактировано 18:15
    Хотелось бы взглянуть на ваше творчество ;)
  • отредактировано 18:15
    А кудысь отправить то??? И сразу говорю, что это примкр-исследование, я в этой штуке только разбираюсь, так что чур не смеяться....
  • отредактировано April 2011
    Отправить можно сюда *********.
    Смеяться не буду :)
  • отредактировано 18:15
    Ну типа отправил.
  • отредактировано April 2011
    Почитал мануал, покурил форум...ничего не понял. сорри.

    Подскажите, плз:
    Есть форма frmReport с кнопкой btnPrint.
    Также на форме TfrxReport под названием frMy.
    в frMy в бенд ReportTitle кладу Picture Object. Называю его frImage1.


    Вопрос:
    как теперь с формы, перед построением отчета, в frImage1.FileLink передать необходимый мне путь к картинке?

    Заранее спасибо
  • отредактировано 18:15
    Bistriy написал: »
    Почитал мануал, покурил форум...ничего не понял. сорри.

    Подскажите, плз:
    Есть форма frmReport с кнопкой btnPrint.
    Также на форме TfrxReport под названием frMy.
    в frMy в бенд ReportTitle кладу Picture Object. Называю его frImage1.
    Вопрос:
    как теперь с формы, перед построением отчета, в frImage1.FileLink передать необходимый мне путь к картинке?

    Заранее спасибо

    Нашел. Извините за беспокойство.
    (frMy.FindObject('frImage1') as TfrxPictureView).FileLink := 'C:\sdsd.jpg';

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

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