Операторы и выражения
Операторы DelphiScript
Оператор в DelphiScript считается «простым», если он не содержит никаких других операторов. Примерами простых операторов являются операторы присваивания и вызовы процедур.
Simple statements:
X := Y + 10; // assignment
ShowMessage('Hello World!'); // procedure call
Составной оператор состоит из нескольких операторов.
Compound statements:
Begin
If A > B Then ShowMessage('A is bigger');
Else ShowMessage('B is bigger');
A := 0;
B := 0;
End;
Условные операторы
В DelphiScript есть управляющие операторы, которые влияют на ход выполнения скрипта. Наиболее распространённый управляющий оператор — условный оператор If..Then.
Оператор If Then
Оператор If..Then используется для условного управления. Синтаксис:
If Condition Then
Begin
// code here
End
Else
Begin
// code here
End;
Оператор Case Of
Чтобы избежать сложного набора операторов If, их часто можно заменить операторами Case. Оператор case в выражении используется для выбора значения, списка возможных значений или диапазона значений.
В операторе Case можно использовать любые типы, поскольку DelphiScript — нетипизированный язык. Операторы Case могут содержать ветку Else, которая выполняется, если ни одна из меток не соответствует значению селектора (в условии Case Of).
Example 1:
Case Char of
'+' : Text := 'Plus sign';
'-' : Text := 'Minus sign';
'*', '/': Text := 'Multiplication or division';
'0'..'9': Text := 'Number';
'a'..'z': Text := 'Lowercase character';
'A'..'Z': Text := 'Uppercase character';
else
Text := 'Unknown character';
End;
Example 2:
Case UserName of
'Jack', 'Joe' : IsAdministrator := true;
'Fred' : IsAdministrator := false;
else
Raise('Unknown User');
End;
Оператор With
Оператор With — это сокращённая форма в DelphiScript. При обращении к переменной типа record (или объекту) можно использовать оператор with вместо повторения её имени каждый раз.
Normal version:
Form.Canvas.Pen.Width := 2;
Form.Canvas.Pen.Color := clSilver;
Version using With:
With Form.Canvas.Pen do
Begin
Width := 2;
Color := clSilver;
End;
Цикл For To Do
Оператор For..To..Do предоставляет способ многократно выполнять блок кода (одну или несколько строк кода). Базовый синтаксис:
For counter := start To end Do
Begin
// code here
End;
ForЦиклы часто используются для инициализации массива. Направление счётчика в цикле For..To..Do можно управлять, альтернативно используя ключевое слово DownTo для декремента цикла. DelphiScript предоставляет оператор Break/Exit для преждевременного выхода из цикла For..To..Do.
Цикл Repeat Until
Оператор Repeat выполняется повторно до тех пор, пока булево выражение не станет истинным. Оператор Repeat всегда выполняется как минимум один раз.
Example:
Repeat
Write('Enter a value (0..9): ');
ShowMessage(IntToStr(I));
Until (I >= 0) and (I <= 9);
Цикл While Do
Оператор While похож на оператор Repeat, за исключением того, что управляющее условие вычисляется до первого выполнения последовательности операторов. Следовательно, если условие ложно, последовательность операторов не выполняется ни разу.
Example:
Randomize;
I := 0;
While I < 1000 do
Begin
I := I + Random (100);
Add ('Random Number: ' + IntToStr (I));
End;
Оператор Continue
Оператор Continue пропускает тело цикла, аналогично оператору Goto. Оператор continue заставляет выполняемый скрипт перейти к следующей итерации в текущем цикле For, While или Repeat.
Example:
var
F: File;
i: Integer;
Begin
For i := 0 to (FileListBox1.Items.Count - 1) do
Begin
Try
If FileListBox1.Selected[i] Then
Begin
If not FileExists(FileListBox1.Items.Strings[i]) then
Begin
MessageDlg('File: ' + FileListBox1.Items.Strings[i] + 'not found', mtError, [mbOk], 0);
Continue;
End;
AssignFile(F, FileListBox1.Items.Strings[i]);
Reset(F, 1);
ListBox1.Items.Add(IntToStr(FileSize(F)));
CloseFile(F);
End;
Finally
{ do something here }
End;
End;
End;
Оператор Goto Label
Оператор Goto имеет форму Goto label, которая передаёт выполнение скрипта оператору, помеченному указанной меткой. Чтобы пометить оператор, метку нужно сначала объявить, а затем целевой оператор должен быть предварён меткой и двоеточием: label: statement
Метка (Label) может быть любым допустимым идентификатором. Объявление Label и оператор Goto должны принадлежать одному и тому же блоку кода в скрипте. Поэтому невозможно выполнить переход внутрь или наружу процедуры или функции.
Example:
Label StartHere;
// code
StartHere: Beep;
Goto StartHere;
Оператор Exit
Оператор Exit немедленно возвращает управление из функции или процедуры. Если вызвать Exit внутри блока Try..Finally, то часть Finally будет выполнена перед возвратом из подпрограммы. Если процедура Exit вызывается из основного тела скрипта, выполнение скрипта будет завершено.
Example:
Begin
Server := SchServer;
If Server = Nil Then
Begin
ShowError('No SchServer started');
Exit;
End;
Оператор Break
Оператор Break заставляет выполняемый скрипт выйти из текущего цикла For, While или Repeat. Выполнение скрипта продолжается со следующей исполняемой строки после текущего цикла.
Example:
Var
S: string;
Begin
While True do
Begin
ReadLn(S);
Try
if S = '' then Break;
WriteLn(S);
Finally
{ do something for all cases }
End;
End;
End;
Операторы выражений DelphiScript
В общем случае выражение — это корректная комбинация констант, переменных, литеральных значений, операторов и результатов функций. Выражения используются для определения значения, присваиваемого переменной, для вычисления параметра функции или для проверки условия. Выражения могут включать вызовы функций.
В DelphiScript есть ряд логических, арифметических, булевых и реляционных операторов. Эти операторы сгруппированы по порядку приоритета (см. ниже), который отличается от порядка приоритета, используемого в Basic, C и т. п. Например, операторы AND и OR имеют приоритет по сравнению с реляционными.
Если вы напишете a<b and c<d, DelphiScript сначала выполнит операцию AND, что приведёт к ошибке. Чтобы избежать этой проблемы и задать приоритет, каждое выражение < нужно заключать в круглые скобки: (a<b) and (c<d);
Поддерживаемые операторы DelphiScript, перечисленные ниже, показаны в порядке убывания приоритета.
Операторы, сгруппированные по приоритету
Обратите внимание, что унарные операторы имеют наивысший приоритет.
|
Булево или побитовое NOT. |
Multiplicative and Bitwise Operators
* |
Арифметическое умножение. |
|
Деление с плавающей точкой. |
|
Целочисленное деление. |
|
modulus (остаток от целочисленного деления). |
|
Булево или побитовое AND. |
|
Побитовый сдвиг влево. |
|
Побитовый сдвиг вправо. |
Additive Operators
|
Арифметическое сложение, конкатенация строк. |
- |
Арифметическое вычитание. |
|
Булево или побитовое OR |
|
Булево или побитовое ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR). |
Relational and Comparison Operators (lowest precedence)
|
Проверка на равенство. |
|
Проверка на неравенство. |
|
Проверка «меньше». |
|
Проверка «больше». |
|
Проверка «меньше или равно». |
|
Проверка «больше или равно». |
Также обратите внимание, что операторы ^ и @ не поддерживаются DelphiScript.