Instrukcje i operatory
Instrukcje DelphiScript
Instrukcja w DelphiScript jest uznawana za „prostą”, gdy nie zawiera żadnych innych instrukcji. Przykładami prostych instrukcji są instrukcje przypisania oraz wywołania procedur.
Simple statements:
X := Y + 10; // assignment
ShowMessage('Hello World!'); // procedure call
Instrukcja złożona składa się z wielu instrukcji.
Compound statements:
Begin
If A > B Then ShowMessage('A is bigger');
Else ShowMessage('B is bigger');
A := 0;
B := 0;
End;
Instrukcje warunkowe
DelphiScript ma instrukcje sterujące, które wpływają na przepływ wykonywania w skrypcie. Najczęściej używaną instrukcją sterującą jest If..Then instrukcja warunkowa.
Instrukcja If Then
Instrukcja If..Then służy do sterowania warunkowego. Składnia jest następująca:
If Condition Then
Begin
// code here
End
Else
Begin
// code here
End;
Instrukcja Case Of
Aby uniknąć złożonego zestawu instrukcji If, często można je zastąpić instrukcjami Case. Instrukcja case w wyrażeniu służy do wyboru wartości, listy możliwych wartości lub zakresu wartości.
W instrukcji Case można używać dowolnych typów, ponieważ DelphiScript jest językiem nietypowanym. Instrukcje Case mogą zawierać część Else, która jest wykonywana, jeśli żadna z etykiet nie odpowiada wartości selektora (w warunku 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;
Instrukcja With
Instrukcja With to skrót w DelphiScript. Podczas odwoływania się do zmiennej typu rekordowego (lub obiektu) można użyć instrukcji „with” zamiast każdorazowego powtarzania jej nazwy.
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;
Pętla For To Do
Instrukcja For..To..Do zapewnia metodę wielokrotnego wykonywania bloku kodu (jednej lub wielu linii kodu). Podstawowa składnia jest następująca:
For counter := start To end Do
Begin
// code here
End;
ForPętle For..To..Do są często używane do inicjalizacji tablicy. Kierunek zliczania w pętli For..To..Do można kontrolować, używając alternatywnie słowa kluczowego DownTo, aby dekrementować pętlę. DelphiScript udostępnia instrukcję Break/Exit, aby przedwcześnie zakończyć pętlę For..To..Do.
Pętla Repeat Until
Instrukcja Repeat jest wykonywana wielokrotnie, aż wyrażenie boolowskie będzie prawdziwe. Instrukcja Repeat jest zawsze wykonywana co najmniej raz.
Example:
Repeat
Write('Enter a value (0..9): ');
ShowMessage(IntToStr(I));
Until (I >= 0) and (I <= 9);
Pętla While Do
Instrukcja While jest podobna do instrukcji Repeat, z tą różnicą, że warunek sterujący jest oceniany przed pierwszym wykonaniem sekwencji instrukcji. W związku z tym, jeśli warunek jest fałszywy, sekwencja instrukcji nie zostanie wykonana ani razu.
Example:
Randomize;
I := 0;
While I < 1000 do
Begin
I := I + Random (100);
Add ('Random Number: ' + IntToStr (I));
End;
Instrukcja Continue
Instrukcja Continue pomija ciało pętli, podobnie jak instrukcja Goto. Instrukcja continue powoduje przejście wykonywanego skryptu do następnej iteracji w bieżącej pętli For, While lub 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;
Instrukcja Goto Label
Instrukcja Goto ma postać Goto label, która przenosi wykonywanie skryptu do instrukcji oznaczonej podaną etykietą. Aby oznaczyć instrukcję, etykieta musi zostać najpierw zadeklarowana, a następnie instrukcja docelowa poprzedzona etykietą i dwukropkiem: label: statement
Etykieta (Label) może być dowolnym poprawnym identyfikatorem. Deklaracja Label oraz instrukcja Goto muszą należeć do tego samego bloku kodu w skrypcie. Dlatego nie jest możliwe przeskoczenie do wnętrza procedury lub funkcji ani wyskoczenie z niej.
Example:
Label StartHere;
// code
StartHere: Beep;
Goto StartHere;
Instrukcja Exit
Instrukcja Exit natychmiast wraca z funkcji lub procedury. Jeśli wywołasz Exit wewnątrz bloku Try..Finally, część Finally zostanie wykonana przed powrotem z podprogramu. Jeśli procedura Exit zostanie wywołana z głównej części skryptu, wykonywanie skryptu zostanie zakończone.
Example:
Begin
Server := SchServer;
If Server = Nil Then
Begin
ShowError('No SchServer started');
Exit;
End;
Instrukcja Break
Instrukcja Break powoduje, że wykonywany skrypt wychodzi z bieżącej pętli For, While lub Repeat. Wykonywanie skryptu jest kontynuowane od kolejnej wykonywalnej linii po bieżącej pętli.
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;
Operatory wyrażeń DelphiScript
Ogólnie rzecz biorąc, wyrażenie jest poprawną kombinacją stałych, zmiennych, wartości literałowych, operatorów oraz wyników funkcji. Wyrażenia służą do określenia wartości przypisywanej do zmiennej, do obliczenia parametru funkcji lub do sprawdzenia warunku. Wyrażenia mogą zawierać wywołania funkcji.
DelphiScript ma szereg operatorów logicznych, arytmetycznych, boolowskich i relacyjnych. Operatory te są pogrupowane według kolejności priorytetów (patrz poniżej), która różni się od kolejności priorytetów używanych w Basic, C itd. Na przykład operatory AND i OR mają priorytet w porównaniu z operatorami relacyjnymi.
Jeśli napiszesz a<b and c<d, DelphiScript najpierw wykona operację AND, co spowoduje błąd. Aby zapobiec temu problemowi i zdefiniować priorytet, każde wyrażenie < należy ująć w nawiasy: (a<b) and (c<d);
Obsługiwane operatory DelphiScript wymienione poniżej są pokazane według kolejności priorytetów.
Operatory pogrupowane według priorytetu
Zwróć uwagę, że operatory jednoargumentowe (unarne) mają najwyższy priorytet.
|
Boolowskie lub bitowe NOT. |
Multiplicative and Bitwise Operators
* |
Mnożenie arytmetyczne. |
|
Dzielenie zmiennoprzecinkowe. |
|
Dzielenie całkowite. |
|
modulo (reszta z dzielenia całkowitego). |
|
Boolowskie lub bitowe AND. |
|
Przesunięcie bitowe w lewo. |
|
Przesunięcie bitowe w prawo. |
Additive Operators
|
Dodawanie arytmetyczne, konkatenacja łańcuchów. |
- |
Odejmowanie arytmetyczne. |
|
Boolowskie lub bitowe OR |
|
Boolowskie lub bitowe EXCLUSIVE OR. |
Relational and Comparison Operators (lowest precedence)
|
Test równości. |
|
Test nierówności. |
|
Test „mniejsze niż”. |
|
Test „większe niż”. |
|
Test „mniejsze lub równe”. |
|
Test „większe lub równe”. |
Zwróć też uwagę, że operatory ^ i @ nie są obsługiwane przez DelphiScript.