3

次のような TObject 型のパラメータを期待するプロシージャがあります。

MyProcedure (const AValue : TObject);

次のようなプロシージャを呼び出すためにループしている Variant の配列があります。

  for i:=0 to High(myArray) do
    MyProcedure (myArray[i]);

コンパイラは、「互換性のない型: TObject と Variant」というエラーを返します。

これを回避するにはどうすればよいですか?

詳細:これまで、単純な型 (文字列、数値、日付) をバリアント配列で渡してきました (配列は通常、さまざまな型の組み合わせです。最終的には、データベース ストアド プロシージャにパラメーターとして渡します)。ここで、(場合によっては) TObject も渡す必要があります。

単純な型とオブジェクトの両方を保持できる、値を渡すのに最も適切なデータ型/構造は何ですか? 両方のフィールドを持つ独自の TParam 型を作成できると思いますが、正確な構文はわかりません。誰にもこの例がありますか?

4

4 に答える 4

8

Variant はオブジェクトを保持できません。整数や文字列などのプリミティブ型のみを含めることができます。

配列をバリアントではなく、必要なタイプに変更することをお勧めします。必要なオブジェクト タイプがわからない場合は、TObject の配列、または配列が保持するオブジェクトの可能な限り低い基本クラスを作成します。

于 2009-04-15T11:56:48.977 に答える
1

私の最初の反応は、TObjects をバリアントのリストに格納する理由を尋ねることですが、それには正当な理由があると仮定します!

最初に TObject インスタンスを Array に配置できた場合は、Tobject へのポインタを配置した可能性があります。その場合、Variant/Integer を TObject として型キャストする必要があります。

for i:=0 to High(myArray) do
    MyProcedure (TObject(myArray[i]));

これは機能するはずですが、型キャストと同様に、myArray[i] が実際に TObject インスタンスへのポインタであることを確認するのはあなた次第です。そうしないと、恐ろしいことが起こる可能性があります。

TListがあなたが望むことをしないと確信していますか。バリアントは、オブジェクトではなく、文字列、整数、浮動小数点数、ブール値などの基本的な型を格納するためのものです。

于 2009-04-15T11:50:29.057 に答える
0

Variant 変数と TOBject 変数を使用して TParam を作成するのは良い考えではないと思います。何かのようなもの:

Tobject = record
  prim: Variant;
  obj: TObject;
end

動作しますが、私には非常に面倒です。Pascal は動的に型付けされた言語ではありません。次のいずれかをお勧めします。

Variant を処理する別の関数を作成するだけでなく、

MyProcedure (const AValue : TObject);

も持っている

MyProcedure (const AValue : Variant);

データを個別に処理します。または、データ入力を定義するレコードを作成します。たとえば、TParam のバリアントとオブジェクトを次のようにする代わりに、次のようにします。

TStoredProcParm = record
  name: String;
  bought: TDateTime;
end;

等々。バリアント/オブジェクト ルートが最適であるほど多くの異なるデータを持っている可能性がありますが、メンテナンスの頭痛の種のように思えます。他のコードに Variant の配列が渡された場合、どのバリアントがどのバリアントであり、それぞれをどのように使用するかをどのように知ることができますか?あなたのストアドプロシージャにそれらの?

于 2009-04-15T12:25:19.220 に答える