機能
DelphiScript 言語で使用される一般的な関数ステートメントを以下に示します。DelphiScript の関数は、FileIO ルーチン、Math ルーチン、String ルーチン、Extension ルーチンの各セクションに分けて説明します。
Evaluate 関数による式の計算
組み込み関数 Evaluate は、実行時に有効な数式を含む文字列を解釈し、結果を返します。たとえば、Evaluate(ProcNames[ProcIndex]); のようなスクリプトを書けば、ProcNames[ProcIndex] で指定されたプロシージャが呼び出されます。
このような式を計算するには、 Evaluate メソッドを使用します。ここで式は Expr パラメータで指定します。たとえば、次のような式を計算できます。
Evaluate('2+5');
Evaluate('((10+15)-5)/2*5');
Evaluate('sin(3.1415926/2)*10');
Evaluate('2.5*log(3)');
関数およびプロシージャへのパラメータの受け渡し
スクリプト内で定義した関数とプロシージャは、どちらもパラメータを受け取るように宣言できます。さらに、関数は値を返すように定義されます。プロシージャ/関数宣言におけるパラメータの型は無視されるため、省略できます。たとえば、次のコードは正しい記述です。
Function sum(a, b) : integer;
Begin
Result := a + b;
End;
プロシージャからの退出
DelphiScript には、プロシージャが自然に終了する前に強制的に退出させるための Exit および Break ステートメントが用意されています。たとえば、パラメータの値が適切でない場合、ユーザーに警告を出して終了したいことがあります。以下の例はそのケースを示しています。
Procedure DisplayName (s);
Begin
If s = '' Then
Begin
ShowMessage('Please enter a name');
Exit;
End;
ShowMessage(S + ' is shown');
End;
File IO ルーチン
DelphiScript には次の IO ルーチンがあります。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DelphiScript ではテキストファイルに情報を書き込めます。また DelphiScript は非型付け言語のため、すべての値は事前に文字列へ変換する必要があります。
ここで、Read と ReadLn ルーチンは等価です。どちらも次の行(改行)までを読み込みますが、次の行自体は含みません。Writeln(String) ルーチンは Write(S) および Write(LineFeed + CarriageReturn) ルーチンと等価です。
テキストファイルへ書き出すには、AssignFile、ReWrite、Writeln、CloseFile の各プロシージャを使用します。テキストファイルを読み込むには、AssignFile、Reset、Readln、CloseFile の各プロシージャを使用します。以下の例はテキストファイルへ書き込み、行末マーカーを追加します。IO 失敗時にスクリプトの安全性を確保するため、Try / Finally / End ブロックの使用が推奨されます 。
Example:
Var
InputFile : TextFile;
OutputFile : TextFile;
I : Integer;
Line : String;
Begin
AssignFile(OutputFile,eConvertedFile.Text);
Rewrite(OutputFile);
AssignFile(InputFIle,eOriginalFIle.Text);
Reset(InputFile);
Try
While not EOF(InputFile) do
Begin
Readln(InputFile,Line);
For I := 1 to Length(Line) Do
Line[I] := UpperCase(Line[I]);
Writeln(Outputfile, Line);
End;
Finally
CloseFile(InputFile);
CloseFile(OutputFile);
End;
End;
Math ルーチン
DelphiScript には次の math ルーチンがあります。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
String ルーチン
DelphiScript には、文字列や文字を操作できる次の string ルーチンがあります。以下の表には string ルーチンの一部のみを示します(DelphiScript で使用される string ルーチンの大半は、Embarcadero Delphi の SysUtils ユニットからインポートされています)。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DelphiScript でサポートされる not string ルーチンを以下の表に示します。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Extension ルーチン
Extension ルーチンは、スクリプト内でサーバープロセス(コマンドとは、必要に応じてパラメータを伴うパッケージ化されたサーバープロセスです)を扱う際に使用します。特に、プロセスのパラメータ用の文字列を抽出または設定する必要がある場合に有用です。ルーチンの一部を以下に示します。
スクリプト内でプロセスのパラメータを実行するには、次の関数が必要になる場合があります。
|
|
|
|
|
|
|
|
|
Useful functions:
|
|
|
|
|
|
|
|
|
Useful dialogs:
|
|
|
|
|
|
DelphiScript での Set の使用
Embarcadero Delphi の Set および In キーワード、ならびに set 演算子 +, -, *, <= と >= は DelphiScript ではサポートされません。等価な Set Operator キーワードを以下の表に示します。
DelphiScript には set 型がありません。DelphiScript スクリプトで set を使用するには、組み込み関数 MkSet、MkSetRange、InSet、SetUnion、SetDifference、SetIntersection、SubSet を使用します。これらの関数により、DelphiScript スクリプト内で set を操作できます。詳細は以下で説明します。
Set 演算子
Embarcadero Delphi Set Operator keyword |
Equivalent DelphiScript Set Operator keyword |
|---|---|
|
|
- |
|
* |
|
|
|
|
|
|
|
|
|
MkSet 関数
MkSet 関数は、可変個の引数を取る set コンストラクタです。例:
Font.Style = MkSet(fsBold,fsItalic);
ここで MkSet(fsBold,fsItalic) は、2 つの set 要素のみ、すなわち fsBold と fsItalic を表します。
MkSetRange 関数
MkSetRange 関数は、範囲指定の引数を取る set コンストラクタです。例:
LayerSet := MkSetRange(eTopLayer,eBottomLayer);
MkSetRange(eTopLayer,eBottomLayer) 関数は、eTopLayer から eBottomLayer までのレイヤー範囲を表します。
InSet 関数
この InSet 関数は、Delphi の In 演算子の代替として使用します。A in B は InSet(A, B) と等価です。
If InSet(A,B) then
ShowMessage('A is in B set')
Else
ShowMessage('A not in B set');
SetUnion 関数
SetUnion 関数は、Delphi の + 演算子の代替として使用します。A + B は SetUnion(A, B) と等価です。
ASet := BSet + CSet;
// should be changed to:
ASet := SetUnion(BSet,CSet);
// in order to achieve the desired script result.
SetDifference 関数
SetDifference 関数は、Delphi の - 演算子の代替として使用します。A - B は SetDifference(A, B) と等価です。
SetIntersection 関数
SetIntersection 関数は、Delphi の * 演算子の代替として使用します。A * B は SetIntersection(A, B) と等価です。
SubSet 関数
SubSet 関数は、Object Pascal の <= 演算子の代替として使用します。A <= B は SubSet(A, B) と等価です。
例外ハンドラの使用
Try キーワードは、Try-Except ステートメントまたは Try-Finally ステートメントを導入します。これら 2 つのステートメントは関連していますが、目的が異なります。
Try-Finally
Try-Finally では、Try ブロックで例外が発生した場合や、Exit または Break が発生した場合でも、Finally ブロック内のステートメントは常に実行されます。Try-Finally ブロックは、一時オブジェクトやその他のリソースの解放、およびクリーンアップ処理の実行に使用します。
通常、サブルーチン内で必要となる Try-Finally ステートメントは 1 つだけです。
Example:
Reset(F);
Try
// process file F
Finally
CloseFile(F);
End;
Try-Except
Try-Except は例外的なケースを処理するために使用します。たとえば、特定の例外を捕捉して、エラーログに記録したり、分かりやすいダイアログボックスを作成したりといった有用な処理を行えます。DelphiScript では On キーワードがサポートされないため、Except ブロック内では Raise ステートメントを使用します。
Example:
Try
X := Y/Z;
Except
Raise('A divide by zero error!');
End;
Raise
Raise キーワードは Try キーワードに関連します。Raise キーワードは、パラメータなしで使用すると直前の例外を再送出できます。また、文字列パラメータとともに使用して、特定のメッセージで例外を送出することもできます。
Example:
Raise(Format('Invalid Value Entered : %d', [Height]));
On キーワードはサポートされないため、 Exception オブジェクト(Embarcadro Delphi で利用可能)は使用できない点に注意してください。