3

私の質問では: 一度に複数のクラスに対して「As」演算子で「Sender」パラメーターを使用する方法

私が Remy Lebeau's Answer を選んだのは、そのようなほとんどの状況で最もダイナミックな技術だったからです。RTTI TypInfo クラスを使用します。

しかし、このクラスを使用していると、別の問題が発生 しました。サブプロパティ値を設定するにはどうすればよいですか?

function TRemote.UpdateQuery(DataSet: TDataSet; SQL: String): Boolean;
var
  PropInfo: PPropInfo;
begin
{ atualiza o código SQL padrão de um dataSet de consulta tipo View }
  PropInfo := GetPropInfo(DataSet, 'SQL', []);
  if not Assigned(PropInfo) then
  begin
    Result := False;
    Exit;
  end;
  try
    DataSet.Close;
    SetPropValue(DataSet, PropInfo, SQL);
    DataSet.Open;
    Result := True;
  except
    Result := False;
  end;
end;

例: TIBQuery があり、SQL プロパティのテキストを更新したいと考えています。しかし、SQL プロパティは TStrings クラスなので、SQL.Text を使用する必要があります。上記のコードでは、TStrings を取得し、後で通常の文字列を設定しようとしたため、「Invalid Property Type」というエラーが発生します。

GetPropInfo を使用して SQL.Text に到達する方法は? SQL プロパティを持つ TIBQuery と TZQuery の共通の先祖があるので、関数パラメーターの TDataSet の代わりに変更できますか?

4

1 に答える 1

9

このTStrings.Textプロパティは、Delphi 2006 では RTTI 経由ではアクセスできません。アクセスできたとしても、RTTI を使用してアクセスする必要はありません。SQLプロパティがオブジェクトであることはわかっているので、プロパティTStringsから実際のオブジェクト ポインターを取得し、それをTStringsポインターに型キャストするだけで、そのオブジェクトに対して必要なことは何でも実行できます。

function TRemote.UpdateQuery(DataSet: TDataSet; SQL: String): Boolean; 
var 
  PropInfo: PPropInfo; 
  SQLObj: TStrings;
begin 
  Result := False; 
  try 
    PropInfo := GetPropInfo(DataSet, 'SQL', [tkClass]); 
    if not Assigned(PropInfo) then Exit; 
    SQLObj := TStrings(GetObjectProp(DataSet, PropInfo, TStrings));
    if not Assigned(SQLObj) then Exit; 
    DataSet.Close; 
    SQLObj.Text := SQL; 
    DataSet.Open; 
    Result := True; 
  except 
  end; 
end; 
于 2012-07-30T19:39:57.487 に答える