関数


関数の種類

関数はスクリプト内でも定義することができます。
ですので、関数はプログラム内で定義したものと二つの種類があることになります。

そして関数の登録先も二つあり、一つはiduo内全体で有効(グローバル)な関数、
もう一つは実行中のスクリプト内だけで有効な関数です。
後者はスクリプトの実行が終了すると自動的に登録が解除されます。

つまり、動的に別のファイルから持ってきたスクリプトの関数をインポートすることや、
モジュール別に定義したプログラムの関数を動的に追加したりすることが可能です。

新しい関数の定義

関数の実行関数は次のように定義します。

TFunctionArgument = array of TVar; procedure func(Args: TFunctionArgument; var return: TVar);
Args は引数の内容が入ります。
returnに関数の戻り値をセットします。

例:
// メッセージボックスを表示する
procedure MsgBox(Args: TFunctionArgument; var return: TVar);
var
  text, title: string;
begin
  text:=GetVarValue(Args[0], '');
  title:=GetVarValue(Args[1], '');
  Application.MessageBox(PChar(text), PChar(title), MB_ICONINFORMATION);
end;
まずグローバル関数として登録する方法を示します。
iduoConstsユニットのFunctionsという関数リストのメソッドを呼び出して登録します。
procedure EntryFunction(Name: string; ArgCount: integer; Proc: TFunctionProc);
Name: 関数の識別子
ArgCount: 引数の数
Proc: 実行時に呼び出す関数

例:
// 関数を定義する
Functions.EntryFunction('MsgBox', 2, MsgBox); 
実行中スクリプト内だけで有効にしたい場合は、TIduo内にあるFuncsに登録してください。

外部スクリプトで定義した関数を登録する

実行したいスクリプトとは別に用意したスクリプト内に定義した関数を実行できるようにしたい場合は、次の関数を呼び出して行います。

procedure RegisterFunctions(code: widestring; funcs: TFunctions);
funcsに追加先の関数リストを指定し、codeに対象スクリプトを指定します。

例:
with TIduo.Create(nil) do
begin
  RegisterFunctions(Memo1.Text, Funcs);
  ...
end;