Instruções e Operadores
Instruções DelphiScript
Uma instrução em DelphiScript é considerada «simples» quando não contém quaisquer outras instruções. Exemplos de instruções simples são as instruções de atribuição e as chamadas de procedimento.
Simple statements:
X := Y + 10; // assignment
ShowMessage('Hello World!'); // procedure call
Uma instrução composta consiste em várias instruções.
Compound statements:
Begin
If A > B Then ShowMessage('A is bigger');
Else ShowMessage('B is bigger');
A := 0;
B := 0;
End;
Instruções condicionais
O DelphiScript tem instruções de controlo que afetam o fluxo de execução dentro de um script. A instrução de controlo mais comum é a instrução condicional If..Then.
Instrução If Then
A instrução If..Then é usada para controlo condicional. A sintaxe é:
If Condition Then
Begin
// code here
End
Else
Begin
// code here
End;
Instrução Case Of
Para evitar um conjunto complexo de instruções If, estas podem muitas vezes ser substituídas por instruções Case. Uma instrução case numa expressão é usada para selecionar um valor, uma lista de valores possíveis ou um intervalo de valores.
Quaisquer tipos podem ser usados numa instrução Case, porque o DelphiScript é uma linguagem sem tipos. As instruções Case podem ter uma instrução Else que é executada se nenhum dos rótulos corresponder ao valor do seletor (dentro da condição 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;
Instrução With
A instrução With é uma forma abreviada do DelphiScript. Ao referir-se a uma variável do tipo registo (ou a um objeto), pode ser usada uma instrução 'with' em vez de repetir o respetivo nome de cada vez.
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;
Ciclo For To Do
A instrução For..To..Do fornece um método para percorrer repetidamente um bloco de código (uma ou mais linhas de código). A sintaxe básica é:
For counter := start To end Do
Begin
// code here
End;
ForOs ciclos são frequentemente usados para inicializar um array. A direção do contador num ciclo For..To..Do pode ser controlada usando em alternativa a palavra-chave DownTo para decrementar o ciclo. O DelphiScript fornece a instrução Break/Exit para sair prematuramente de um ciclo For..To..Do.
Ciclo Repeat Until
A instrução Repeat é executada repetidamente até que a expressão booleana seja verdadeira. A instrução Repeat é sempre executada pelo menos uma vez.
Example:
Repeat
Write('Enter a value (0..9): ');
ShowMessage(IntToStr(I));
Until (I >= 0) and (I <= 9);
Ciclo While Do
Uma instrução While é semelhante a uma instrução Repeat, exceto que a condição de controlo é avaliada antes da primeira execução da sequência de instruções. Assim, se a condição for falsa, a sequência de instruções nunca é executada.
Example:
Randomize;
I := 0;
While I < 1000 do
Begin
I := I + Random (100);
Add ('Random Number: ' + IntToStr (I));
End;
Instrução Continue
A instrução Continue salta o corpo de um ciclo, de forma semelhante à instrução Goto. A instrução continue faz com que o script em execução passe para a iteração seguinte no ciclo atual For, While ou 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;
Instrução Goto Label
A instrução Goto tem a forma Goto label que transfere a execução do script para a instrução marcada pelo rótulo especificado. Para marcar uma instrução, o rótulo tem primeiro de ser declarado e depois a instrução de destino deve ser precedida pelo rótulo e por dois-pontos: label: statement
Um Label pode ser qualquer identificador válido. A declaração Label e a instrução Goto devem pertencer ao mesmo bloco de código dentro de um script. Por isso, não é possível saltar para dentro de um procedimento ou função, nem sair deles através de salto.
Example:
Label StartHere;
// code
StartHere: Beep;
Goto StartHere;
Instrução Exit
A instrução Exit regressa imediatamente de uma função ou procedimento. Se chamar Exit a partir de dentro de um bloco Try..Finally, a parte Finally é executada antes de a subrotina regressar. Se o procedimento Exit for chamado a partir do corpo principal do script, a execução do script termina.
Example:
Begin
Server := SchServer;
If Server = Nil Then
Begin
ShowError('No SchServer started');
Exit;
End;
Instrução Break
A instrução Break faz com que o script em execução saia do ciclo atual For, While ou Repeat. A execução do script continua a partir da linha executável seguinte após o ciclo atual.
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;
Operadores de expressões DelphiScript
Em geral, uma expressão é uma combinação válida de constantes, variáveis, valores literais, operadores e resultados de funções. As expressões são usadas para determinar o valor a atribuir a uma variável, para calcular o parâmetro de uma função ou para testar uma condição. As expressões podem incluir chamadas de função.
O DelphiScript tem vários operadores lógicos, aritméticos, booleanos e relacionais. Estes operadores são agrupados pela ordem de precedência (ver abaixo), que é diferente das ordens de precedência usadas em Basic, C, etc. Por exemplo, os operadores AND e OR têm precedência em relação aos operadores relacionais.
Se escrever a<b and c<d, o DelphiScript executará primeiro a operação AND, resultando num erro. Para evitar este problema e definir a prioridade, cada expressão < tem de ser colocada entre parênteses: (a<b) and (c<d);
Os operadores DelphiScript suportados listados abaixo são apresentados pela sua ordem de precedência.
Operadores agrupados por precedência
Note que os operadores unários têm a precedência mais elevada.
|
NOT booleano ou bit a bit. |
Multiplicative and Bitwise Operators
* |
Multiplicação aritmética. |
|
Divisão em vírgula flutuante. |
|
Divisão inteira. |
|
módulo (resto da divisão inteira). |
|
AND booleano ou bit a bit. |
|
Deslocamento bit a bit para a esquerda. |
|
Deslocamento bit a bit para a direita. |
Additive Operators
|
Adição aritmética, concatenação de strings. |
- |
Subtração aritmética. |
|
OR booleano ou bit a bit |
|
OU EXCLUSIVO booleano ou bit a bit. |
Relational and Comparison Operators (lowest precedence)
|
Testa se é igual ou não. |
|
Testa se é diferente ou não. |
|
Testa se é menor que ou não. |
|
Testa se é maior que ou não. |
|
Testa se é menor ou igual a ou não. |
|
Testa se é maior ou igual a ou não. |
Note também que os operadores ^ e @ não são suportados pelo DelphiScript.