3

在我的问题中: 如何一次将“Sender”参数与“As”运算符一起用于一个以上的类

我选择 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,后来我尝试设置一个普通的字符串。

如何使用 GetPropInfo 访问 SQL.Text? 是否存在具有 SQL 属性的 TIBQuery 和 TZQuery 的共同祖先,所以我可以更改为,而不是函数参数中的 TDataSet?

4

1 回答 1

9

在 Delphi 2006 中无法通过 RTTI 访问该TStrings.Text属性。即使是,您也不需要使用 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 回答