8.24.3 バリアント型変数
バリアント・コンポーネント・クラスの#PRIM_VARを使用してバリアント・コンポーネント変数を作ることができます。バリアント・コンポーネント変数には、どのようなタイプのデータでも格納することができます(文字列、整数、小数、ブール値、コンポーネント)。
バリアント・コンポーネントには、コンポーネントによって入れられた値の種類を検査するプロパティがあります。その値は、数値、文字列、またはブール値などの変換された形式で取得することができます。
バリアントを使えば、コンポーネントは、静的に判別不可能なタイプの値にアクセスできるようになります。例えば、グリッド内のセルの値を静的に定義することはできません。それはセルの列のタイプに依存するからです。グリッド制御はバリアントを戻すことでセル値へのアクセスを可能にします。宣言された値のタイプに関するコンパイル・エラーは発生しません。もちろん、この場合は、グリッドの値のタイプを識別できるようにプログラムを記述することが必要です。
バリアントは動的プログラミングにも使用されます。コンパイル時にコンポーネントのタイプ情報を決定できない場合(特にActiveX)があります。この場合、実行時に処理する必要があります。バリアントを使用する場合、Visual LANSAコンパイラはメソッドやプロパティの解決を試みません。バリアントに保管されるコンポーネントのタイプがわからないためです。このすべての情報を解決するには実行時まで待つ必要があります。この手法により、ActiveX制御は不明なタイプのコンポーネントを提供することができます。そして、このコンポーネントが呼び出された時にだけ、タイプ情報が要求されます。
以下のステートメントでは、#MYVARIANTと呼ばれるバリアント型変数を定義しています。
Define_Com Class(#PRIM_VAR) Name(#MYVARIANT)
バリアント型変数には、そのValueプロパティを使用して値を割り当てることができます(この場合、値のタイプは不明なタイプです)。
Set Com(#myvariant) Value(#XYZ)
また、変数の文字列、整数、ブール値、小数、コンポーネント・プロパティを使用して、明示的に値のタイプを割り当てる方法もあります。
Set Com(#myvariant) Integer(#XYZ)
明示的に値のタイプを割り当てる方法が必要なのは、RDMLコマンドでこの変数を使用する場合だけです。RDMLXではタイプを不明とすることができます。
変数の値を読み取るときに、値は自動的に値を受け取るフィールドのタイプに変換されます。
Set Com(#Out_INTEGER) Value(#myvariant)
また、値のタイプを明示的に指定することもできます。
Set Com(#Out_INTEGER) Value(#myvariant.Integer)
バリアントの値がサポート可能なタイプかどうかを確認するには、変数のValueTypeプロパティを使用します。
IF Cond('#myvariant.ValueType = VarInteger')
Set Com(#Out_INTEGER) Value(#myvariant)
ELSE
Set Com(#Out_INTEGER) Value(0)
ENDIF
このチェックが実行されず、実行時に値が変換できない場合は、実行時エラーになります。
ValueTypeプロパティは列挙型です。値は以下のいずれかの記号になります。
· varNull
· varEmpty
· varInteger
· varDouble
· varString
· varDecimal
· varBoolean
· varComponent