Câu lệnh & Toán tử
Các câu lệnh trong DelphiScript
Một câu lệnh trong DelphiScript được xem là 'đơn' khi nó không chứa bất kỳ câu lệnh nào khác. Ví dụ về câu lệnh đơn là câu lệnh gán và lời gọi thủ tục.
Simple statements:
X := Y + 10; // assignment
ShowMessage('Hello World!'); // procedure call
Một câu lệnh ghép bao gồm nhiều câu lệnh.
Compound statements:
Begin
If A > B Then ShowMessage('A is bigger');
Else ShowMessage('B is bigger');
A := 0;
B := 0;
End;
Câu lệnh điều kiện
DelphiScript có các câu lệnh điều khiển ảnh hưởng đến luồng thực thi trong một script. Câu lệnh điều khiển phổ biến nhất là câu lệnh điều kiện If..Then.
Câu lệnh If Then
Câu lệnh If..Then được dùng để điều khiển theo điều kiện. Cú pháp là:
If Condition Then
Begin
// code here
End
Else
Begin
// code here
End;
Câu lệnh Case Of
Để tránh một tập hợp phức tạp các câu lệnh If, chúng thường có thể được thay thế bằng các câu lệnh Case. Câu lệnh case trong một biểu thức được dùng để chọn một giá trị, một danh sách các giá trị có thể có hoặc một khoảng giá trị.
Bất kỳ kiểu dữ liệu nào cũng có thể được dùng trong câu lệnh Case vì DelphiScript là ngôn ngữ không định kiểu. Câu lệnh Case có thể có câu lệnh Else, được thực thi nếu không có nhãn nào tương ứng với giá trị của bộ chọn (trong điều kiện 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;
Câu lệnh With
Câu lệnh With là một cách viết tắt trong DelphiScript. Khi tham chiếu đến một biến kiểu bản ghi (hoặc một đối tượng), có thể dùng câu lệnh 'with' thay vì lặp lại tên của nó mỗi lần.
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;
Vòng lặp For To Do
Câu lệnh For..To..Do cung cấp một phương pháp để lặp đi lặp lại qua một khối mã (một hoặc nhiều dòng mã). Cú pháp cơ bản là:
For counter := start To end Do
Begin
// code here
End;
For thường được dùng để khởi tạo một mảng. Hướng đếm trong vòng lặp For..To..Do có thể được điều khiển bằng cách dùng từ khóa DownTo để giảm dần vòng lặp. DelphiScript cung cấp câu lệnh Break/Exit để thoát sớm khỏi vòng lặp For..To..Do.
Vòng lặp Repeat Until
Câu lệnh Repeat được thực thi lặp lại cho đến khi biểu thức Boolean là true. Câu lệnh Repeat luôn được thực thi ít nhất một lần.
Example:
Repeat
Write('Enter a value (0..9): ');
ShowMessage(IntToStr(I));
Until (I >= 0) and (I <= 9);
Vòng lặp While Do
Câu lệnh While tương tự như câu lệnh Repeat, ngoại trừ điều kiện điều khiển được đánh giá trước lần thực thi đầu tiên của chuỗi câu lệnh. Vì vậy, nếu điều kiện là false, chuỗi câu lệnh sẽ không bao giờ được thực thi.
Example:
Randomize;
I := 0;
While I < 1000 do
Begin
I := I + Random (100);
Add ('Random Number: ' + IntToStr (I));
End;
Câu lệnh Continue
Câu lệnh Continue bỏ qua phần thân của một vòng lặp, tương tự như câu lệnh Goto. Câu lệnh continue làm cho script đang chạy chuyển sang lần lặp tiếp theo trong vòng lặp For, While hoặc Repeat hiện tại.
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;
Câu lệnh Goto Label
Câu lệnh Goto có dạng Goto label, dùng để chuyển việc thực thi script đến câu lệnh được đánh dấu bằng nhãn chỉ định. Để đánh dấu một câu lệnh, trước tiên nhãn phải được khai báo, sau đó câu lệnh đích phải được đặt trước bởi nhãn và dấu hai chấm: label: statement
Một Label có thể là bất kỳ định danh hợp lệ nào. Khai báo Label và câu lệnh Goto phải thuộc cùng một khối mã trong script. Do đó, không thể nhảy vào hoặc nhảy ra khỏi một thủ tục hoặc hàm.
Example:
Label StartHere;
// code
StartHere: Beep;
Goto StartHere;
Câu lệnh Exit
Câu lệnh Exit ngay lập tức trả về từ một hàm hoặc thủ tục. Nếu bạn gọi Exit từ bên trong một khối Try..Finally, phần Finally sẽ được thực thi trước khi chương trình con trả về. Nếu thủ tục Exit được gọi từ trong phần thân chính của script, thì việc thực thi script sẽ kết thúc.
Example:
Begin
Server := SchServer;
If Server = Nil Then
Begin
ShowError('No SchServer started');
Exit;
End;
Câu lệnh Break
Câu lệnh Break làm cho script đang thực thi thoát khỏi vòng lặp For, While hoặc Repeat hiện tại. Việc thực thi script tiếp tục từ dòng lệnh thực thi kế tiếp sau vòng lặp hiện tại.
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;
Toán tử biểu thức trong DelphiScript
Nói chung, một biểu thức là sự kết hợp hợp lệ của hằng số, biến, giá trị literal, toán tử và kết quả hàm. Biểu thức được dùng để xác định giá trị gán cho biến, để tính tham số của một hàm hoặc để kiểm tra một điều kiện. Biểu thức có thể bao gồm lời gọi hàm.
DelphiScript có một số toán tử logic, số học, Boolean và quan hệ. Các toán tử này được nhóm theo thứ tự ưu tiên (xem bên dưới), khác với thứ tự ưu tiên được dùng trong Basic, C, v.v. Ví dụ, các toán tử AND và OR có độ ưu tiên cao hơn toán tử quan hệ.
Nếu bạn viết a<b and c<d, DelphiScript sẽ thực hiện phép toán AND trước, dẫn đến lỗi. Để tránh vấn đề này và xác định độ ưu tiên, mỗi biểu thức < cần được đặt trong dấu ngoặc đơn: (a<b) and (c<d);
Các toán tử DelphiScript được hỗ trợ được liệt kê bên dưới theo thứ tự ưu tiên.
Các toán tử được nhóm theo thứ tự ưu tiên
Lưu ý rằng các toán tử một ngôi có độ ưu tiên cao nhất.
|
NOT Boolean hoặc theo bit. |
Multiplicative and Bitwise Operators
* |
Phép nhân số học. |
|
Phép chia số thực. |
|
Phép chia số nguyên. |
|
phép lấy modulo (phần dư của phép chia số nguyên). |
|
AND Boolean hoặc theo bit. |
|
Dịch trái theo bit. |
|
Dịch phải theo bit. |
Additive Operators
|
Phép cộng số học, nối chuỗi. |
- |
Phép trừ số học. |
|
OR Boolean hoặc theo bit |
|
EXCLUSIVE OR Boolean hoặc theo bit. |
Relational and Comparison Operators (lowest precedence)
|
Kiểm tra có bằng hay không. |
|
Kiểm tra có khác hay không. |
|
Kiểm tra có nhỏ hơn hay không. |
|
Kiểm tra có lớn hơn hay không. |
|
Kiểm tra có nhỏ hơn hoặc bằng hay không. |
|
Kiểm tra có lớn hơn hoặc bằng hay không. |
Ngoài ra, cũng lưu ý rằng các toán tử ^ và @ không được DelphiScript hỗ trợ.