Зацикливание в скрипте?

отредактировано 01:59 Раздел: FastScript
берем демку которая идет со скриптом
кидаем кнопку на клик вешаем обработчик который ниже.
ставим точку остановки на получения значения.
Запускаем и смотрим.

procedure TForm1.Button1Click(Sender: TObject);
var s :string;
res :Variant;
begin

s:= 'function __f__: Variant;const A = 10; B = 20; begin Result := A + B end; begin end.';
Memo.Lines.Text := s;
RunBtnClick(Nil);
Res := fsScript1.FindLocal('__f__').Value;

end;


как выполнить функцию (в скрипте) и получить значение этой функции в коде ??



пытаюсь по аналогии сделать
value:= 'function __f__: Variant;const A = 10; B = 20; begin Result := A + B end;

function Get_Func(const value: String): Variant;
var
SaveEvent: TfsRunLineEvent;
s:string;
begin
Result := Null;


fsScript1.ClearVariables;
fsScript1.Lines.Text := Value;
fsScript1.Parent := fsGlobalUnit;

SaveEvent := fsScript1.OnRunLine;

if fsScript1.Compile then
Result := fsScript1.FindLocal('__f__').Value;
fsScript1.OnRunLine := SaveEvent;
end;

Эфект тото же.

причем строка без кода выполняется нормально.
Что я делаю не так??



Комментарии

  • отредактировано 01:59
    Помоему тебе надо после компиляции сделать
    r := fsScript1.CallFunction('__f__', VarArrayOf([]));
    
    Должна возвратить результат функции "__f__"
  • отредактировано 01:59
    marvel написал:
    Помоему тебе надо после компиляции сделать
    r := fsScript1.CallFunction('__f__', VarArrayOf([]));
    
    Должна возвратить результат функции "__f__"
    if fsScript1.Compile then
    begin
    // Result := fsScript1.FindLocal('__f__').Value;
    Result := fsScript1.CallFunction('__f__', VarArrayOf([]));
    end;

    Сделал так.
    результат тотже - загрузка процесора на 100 %
    помогло только снятие задачи.

    Что не так??? Как сделать чтобы считалось??
  • отредактировано 01:59
    Напише пример как получить результат функции (со стоки которая в начале топика)
  • отредактировано 01:59
    Вот скрипт:
    function F:Integer;
    const A = 10; B = 20;
    begin
     Result := A + B;
    end;
    
    begin
    end.
    

    Вот обработчик OnClick кнопки:
    procedure TForm1.Button1Click(Sender: TObject);
    var V:Variant;
    begin
     fsScript1.Clear;
     fsScript1.Lines.Text := Memo1.Lines.Text;
     fsScript1.Parent := fsGlobalUnit;
    
     if fsScript1.Compile then
      begin
       V := fsScript1.CallFunction('F', VarArrayOf([]));
       ShowMessage('Result: ' + VarToStr(V));
      end
     else ShowMessage(fsScript1.ErrorMsg + ' at ' + fsScript1.ErrorPos);
    end;
    

    Все прекрассно работает!!!
  • отредактировано 01:59
    Спасибо!
    так заработало...

    но не понятно почему всеже подвисало, если был верхний код...

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

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