Ошибки Fastscript 1.92.
В 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;
Как вернуть нормальное поведение скриптера?
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;
Как вернуть нормальное поведение скриптера?
Комментарии
А он не компилироваться не прятать ошибки не должен
var q : TLabel;
begin
q.DatabaseName := 'DBTEMP1';
ShowMessage('e');
end.
Вот этот выполняется и выдает ошибку конвертации String в double (где это тут double?)
var q : TStringList;
begin
q.Name := 'DBTEMP';
q.Name := '';
end.
Хотя если проинициализировать q := TLabel.Create(nil), то не будет...
Еще есть над чем работать репортовцам...
Одну проблему (Вызов методов не созданного объекта ) исправили а вторая (более важная осталась)
Вот этот скрипт компилируется а не должен. Ведь нет у 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.
1.Сказать что в скрипте ошибка, было бы не правильно. Но оставить так как есть - безхозяйственно. Я как-то переменные насоздавал. И если они внутри пустые, то работать нельзя. Я по первости внутрь писал их собственное имя, думал, что оно будет восприниматься как текст. Я же без кавычек писал. К моему удивлению получил при печати отчёта переполнение стека. Я думаю, что рекурсивное переполнение стека надо создавать когда:
Естественно, что всё не предусмотреть, но я бы EStackOverflow заменил на Exception.Create('Invalid variable expression');
2. И ещё ребята объясните пожалуйста для чего нужны функции ValidInt ValidFloat и т.д.? Они мне кажется что по названию и по смыслу походят на стандартную паскалевскую функцию - Val. Эта функция была ещё на роботроновском паскале. Она стандарт и сейчас. Давайте посмотрим:
Когда значение нельзя переварить я ловлю экзепшены в отладке, которые мне в общем то и отлаживать не надо. Так зачем они тогда нужны?
Я бы написал это так (и оно работало бы даже на роботроне )) )
Например:
if not ValidInt(Edit1.Text) then begin
ShowMessage('Неправильно введён номер документа');
Exit;
end;
Все верно, так и было задумано, чтобы можно было работать с объектами, которые на момент компиляции скрипта не существуют... По другому не сделать, представьте конструкцию
Form1.Button1.Caption := 'sdfsdf';
Если на момент компиляции скрипта объект Form1, который загружается из ресурса вместе с дочерними компонентами, не существует, скрипт и понятия не имеет о других объектах принадлежащих Form1 и их свойствах. Если переменная From1 объявлена как var Form1: TForm;, здесь еще можно прочитать RTTI для TForm, но что из себя представляет Button1, станет известно только на стадии исполнения скрипта, если все поправить, в скрипте невозможно удет ипользовать объекты, которые загружаются из ресурса...
В отличии от ВБ, недокументированных q.BlaBla мы не имеем, а вот в оле байсик сколь угодно. Если мы пишем не в окне офиса, то вообще ничего неизвестно.
Резюме - мне это свойство нравится и долго будет вполне устраивать. Я вот недавно зарегистрировал константы Graphics.clWebXXX цветов. Инспектор и скрипт их чуют. Только один нюанс. Для наследника дизайнера колоров нельзя сделать Register. Тогда инспектор глючит на вкладке событий. А вот так работает:
--
Силин Р.