2

Delphi で、次のような (かなり簡略化された) シグネチャを持つメソッドがあるとします。

procedure abc( const prop1:string; const arg1:TValue; const prop2:string; 
  out arg2:TValue );

提供されたパラメーターを使用して、このようなレコードの TList<PPropValPair> を構築しています。

type
  TPVPType = (ptIn, ptOut);
  PPropValPair = ^TPropValPair;
  TPropValPair = record
    io   : TPVPType;
    prop : string;     // property name
    iVal : TValue;     // input value
    oVar : Variant;    // <-- how to save for later use???  Variant? TValue? 
  end;

(一見すると、この例はばかげているように見えます。繰り返しますが、問題を伝えるためだけに非常に単純化されています。)

実行時に、すべての入力値 ival (ここで io=ptIn) をクラスの各パブリック プロパティ 'prop' に詰め込み、クラス メソッドを呼び出してから、すべてのパブリック プロパティ 'prop' (ここでio=ptOut) を oVar に挿入します。

入力側は RTTI を使用して正常に動作しています。

ただし、クラス メソッドが呼び出された後に関連付けられたプロパティの値を保存できるように、何らかの方法で REFERENCE を oVar の出力変数に保存する必要があります。

arg2 に直接何も割り当てていません。むしろ、arg2 への参照を保存し、後で間接的に値を代入しています。

秘訣は... abc(...) の出力パラメーターに追加の注釈を付けたくないということです。

C++ では、先頭に「&」を付けることで、パラメータを「参照」として宣言できます。したがって、C++ の用語では、これは大まかに次のように定義できます。

procedure abc( arg1 : TValue; &arg2 : TValue );

後で &arg2 を参照できますが、オブジェクトへの POINTER を使用しています。ただし、関数を呼び出すときは、次のように言うだけです。

abc( somevar1, somevar2 );

somevar1 は値で渡され、somevar2 は参照で渡されます。関数内で somevar2 を参照 var に保存し、後で &arg2ref = 'abc' と言って、ポインタ (文字列の場合) を介してそれに値を割り当てることができます。

Delphi では、Variant を oVar 型として使用するか、RTTI などを使用して、これを行う方法があると思います。私はまだピースの魔法の組み合わせを理解していません. (私は Delphi ではあまりポインタを使用しません。)

たぶん、生のポインターをタイプ (oType など) と共に oVar に保存し、ポインターを介して値をキャストして、プロパティの値を保存する必要がありますか?

ここに誰かが明確なアイデアを持っていることを願っています。

ところで、私は Delphi XE3 を使用しています。

4

1 に答える 1