iduoスクリプトは配列をサポートしています。
そのためには変数内容を動的メモリで割り当てる必要があり、
それに伴い開放も都度必要になります。
つまりクラスのようにインスタンスがあると考えてください。
変数はTVar型で表現されます。これは構造型で、キー名と変数タイプと、値を格納します。
TVar = record
Key: string;
Value: Pointer;
VarType: TVarType;
end;
変数タイプVarTypeによって、保持する値の内容が変わります。
TVarTypeは二つの値をとり、vtValue(値), vtArray(配列)があります。
vtValueの場合、ValueにはVariant型へのポインタが入ります。
vtArrayの場合、ValueにはTVarArray型へのポインタが入ります。
つまり変数の実際のデータへアクセスするには、これらを判別しなければなりません。
これらの処理を行うのに便利な関数がiduoResourceに定義されているので紹介します。
function MakeVar(Key: string; Value: variant): TVar;
指定したキーと値の内容の変数データを作成します。
function MakeVarArray(Key: string; Value: TVarArray): TVar;
指定したキーと値の内容の配列変数データを作成します。
procedure SetVar(var Dest: TVar; const Src: TVar); overload;
Srcの値をDestへコピーします。
procedure SetVar(var Dest: TVar; Src: variant); overload;
変数の値を代入します。
procedure CopyVar(var Dest: TVar; const Src: TVar);
Srcの内容をキーも一緒にコピーします。
function AddArrayElement(var content: TVar; Key: string=''): PVar;
配列変数の要素を一つ追加します。それが配列で無い場合は配列化します。
Keyを指定しなかった場合は、そのKeyにゼロから数えたインデックスが与えられます。
function ArrayElementOf(const content: TVarArray; Key: string): PVar;
配列変数の指定キーの要素を検索して返します。
procedure FreeVar(var content: TVar);
変数を開放します。
function MakeNullVar(): TVar;
空の変数データを作成します。
function GetVarValue(content: TVar; def: variant): variant;
変数の値を取り出します。
内容が配列もしくは割り当てられていない場合はdefで指定された値を返します。
function GetVarArray(content: TVar): TVarArray;
変数の配列を取り出します。
内容が配列でない、もしくは割り当てられていない場合は長さ0の配列を返します。