Ошибки Fastscript 1.92.

отредактировано January 2008 Раздел: FastScript
В FastScript 1.92 обнаружены две ошибки
1. При компиляции скрипта не проверяются на валидность названия методов и свойств.

т.е. можно написать такой код
var q : TQuery;
begin
q := TQuery.Create(nil);
q.BlaBla := 45;
q.Free;
end;

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

2. При выполнении скрипта не выдается exception если объект не создан в памяти, скрипт посто пропускает присвоение всех свойств

var q : TQuery;
begin
q.DatabaseName := 'DBTEMP'
q.BlaBla := 45;
q.Free;
end;




Как вернуть нормальное поведение скриптера?

Комментарии

  • отредактировано 16:22
    Попробовал в демо все работает, ругается на blabla и exception генерит...
  • отредактировано 16:22
    Вот этот код компилируется и выполняется без ошибки

    А он не компилироваться не прятать ошибки не должен

    var q : TLabel;
    begin
    q.DatabaseName := 'DBTEMP1';
    ShowMessage('e');
    end.

    Вот этот выполняется и выдает ошибку конвертации String в double (где это тут double?)

    var q : TStringList;
    begin
    q.Name := 'DBTEMP';
    q.Name := '';
    end.
  • отредактировано 16:22
    Точно первый код выполняется...
    Хотя если проинициализировать q := TLabel.Create(nil), то не будет...
    Еще есть над чем работать репортовцам...
  • отредактировано 16:22
    Поправлено, пока фикс входит только в сборку FR 4.5.20 .
  • отредактировано January 2008
    Проверил в версии 4_5_21.

    Одну проблему (Вызов методов не созданного объекта ) исправили а вторая (более важная осталась)


    Вот этот скрипт компилируется а не должен. Ведь нет у TLabel таких свойств и методов.

    var
    d : TLabel;
    begin
    d := TLabel.Create(nil);
    d.DatabaseName := 'e';
    d.LoadFromFile('c:\1.xml');
    d.XmlFormat := xfReadable;
    d.SaveToFile('c:\11.xml') ;
    d.Free;
    end.

    А вот этот скрипт

    Запускается и успевает показать 'Запустился'.

    var
    F: TForm;
    l:TLabel;
    begin
    F := TForm(nil);
    l := TLabel.Create(F);
    l.parent := f;
    ShowMessage('Запустился');
    F.l.Cabtion := '1';
    end.


  • отредактировано 16:22
    Ребят, а хотелось бы просьбу пожелание.

    1.Сказать что в скрипте ошибка, было бы не правильно. Но оставить так как есть - безхозяйственно. Я как-то переменные насоздавал. И если они внутри пустые, то работать нельзя. Я по первости внутрь писал их собственное имя, думал, что оно будет восприниматься как текст. Я же без кавычек писал. К моему удивлению получил при печати отчёта переполнение стека. Я думаю, что рекурсивное переполнение стека надо создавать когда:
    var
      v: TfsCustomVariable;
    begin
      v := Find(Index);
      if (v <> nil) and (Index <> v.Value) then ...
    

    Естественно, что всё не предусмотреть, но я бы EStackOverflow заменил на Exception.Create('Invalid variable expression');

    2. И ещё ребята объясните пожалуйста для чего нужны функции ValidInt ValidFloat и т.д.? Они мне кажется что по названию и по смыслу походят на стандартную паскалевскую функцию - Val. Эта функция была ещё на роботроновском паскале. Она стандарт и сейчас. Давайте посмотрим:
    function (fs_isysrtti)ValidInt(cInt: String): Boolean;
    begin
      Result := True;
      try
        StrToInt(cInt);
      except
        Result := False;
      end;
    end;
    
    function (SysUtils)StrToInt(const S: string): Integer;
    var
      E: Integer;
    begin
      Val(S, Result, E);
      if E <> 0 then ConvertErrorFmt(@SInvalidInteger, [S]);
    end;
    

    Когда значение нельзя переварить я ловлю экзепшены в отладке, которые мне в общем то и отлаживать не надо. Так зачем они тогда нужны?
    Я бы написал это так (и оно работало бы даже на роботроне )) )
    function (fs_isysrtti)ValidInt(cInt: String): Boolean;
    var
      R,E: Integer;
    begin
      Val(S, R, E);
      Result := E = 0;
    end;
    
  • Stalker4Stalker4 123
    отредактировано 16:22
    delover написал: »
    2. И ещё ребята объясните пожалуйста для чего нужны функции ValidInt ValidFloat и т.д.? Они мне кажется что по названию и по смыслу походят на стандартную паскалевскую функцию - Val. Эта функция была ещё на роботроновском паскале.
    Функции ValidInt, ValidFloat, ValidDate нужны для проверки строкового значения числа или даты без появления Exception. Это очень удобно, когда надо в скрипте проверить введённое пользователем в предпечатном диалоге значение.
    Например:

    if not ValidInt(Edit1.Text) then begin
    ShowMessage('Неправильно введён номер документа');
    Exit;
    end;

  • RikRik
    отредактировано 16:22
    написал: »
    В FastScript 1.92 обнаружены две ошибки
    1. При компиляции скрипта не проверяются на валидность названия методов и свойств.

    т.е. можно написать такой код
    var q : TQuery;
    begin
    q := TQuery.Create(nil);
    q.BlaBla := 45;
    q.Free;
    end;

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

    2. При выполнении скрипта не выдается exception если объект не создан в памяти, скрипт посто пропускает присвоение всех свойств

    var q : TQuery;
    begin
    q.DatabaseName := 'DBTEMP'
    q.BlaBla := 45;
    q.Free;
    end;
    Как вернуть нормальное поведение скриптера?

    Все верно, так и было задумано, чтобы можно было работать с объектами, которые на момент компиляции скрипта не существуют... По другому не сделать, представьте конструкцию
    Form1.Button1.Caption := 'sdfsdf';
    Если на момент компиляции скрипта объект Form1, который загружается из ресурса вместе с дочерними компонентами, не существует, скрипт и понятия не имеет о других объектах принадлежащих Form1 и их свойствах. Если переменная From1 объявлена как var Form1: TForm;, здесь еще можно прочитать RTTI для TForm, но что из себя представляет Button1, станет известно только на стадии исполнения скрипта, если все поправить, в скрипте невозможно удет ипользовать объекты, которые загружаются из ресурса...
  • отредактировано June 2008
    тот дубль. пост ниже
  • отредактировано 16:22
    написал: »
    ...
    1. При компиляции скрипта не проверяются на валидность названия методов и свойств.

    т.е. можно написать такой код
    ...
    q.BlaBla := 45;
    ...
    а ошибка возникнет не на этапе компиляции а только при выполнении скрипта,...
    Вообще-то программирование OLE вариантов типа эксел/ворд ВБ-скрипт точно такое же. Там тоже можно писать BlaBla. Я так и думал что Майкрософт были немного не добросовестны. ))) :)

    В отличии от ВБ, недокументированных q.BlaBla мы не имеем, а вот в оле байсик сколь угодно. Если мы пишем не в окне офиса, то вообще ничего неизвестно.

    Резюме - мне это свойство нравится и долго будет вполне устраивать. Я вот недавно зарегистрировал константы Graphics.clWebXXX цветов. Инспектор и скрипт их чуют. Только один нюанс. Для наследника дизайнера колоров нельзя сделать Register. Тогда инспектор глючит на вкладке событий. А вот так работает:
    for i:=0 to frxPropertyEditors.Count-1 do begin
        if frxPropertyEditors.Items[i].EditorClass <> TfrxColorProperty then continue;
        frxPropertyEditors.Items[i].EditorClass := TfrxWebColorProperty;
        end;
    

    --
    Силин Р.

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

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