在我的问题中:如何同时为多个类使用“Sender”参数和“As”操作符
我选择了Remy Lebeau的答案,因为它是最适合这种情况的最动态的技术。它使用了RTTI TypInfo类。
但是当我使用这个类时,又遇到了另一个问题:如何设置子属性值?
例子: 我有一个TIBQuery,我想要更新SQL属性的文本。 但是SQL属性是一个TStrings类,所以我必须使用SQL.Text。 在上面的代码中,它会引发一个“无效的属性类型”错误,因为我得到了一个TStrings,后来我尝试设置一个普通的字符串。
如何使用GetPropInfo访问SQL.Text? 是否有一个TIBQuery和TZQuery的共同祖先,它具有SQL属性,这样我就可以改变函数参数中的TDataSet?
但是当我使用这个类时,又遇到了另一个问题:如何设置子属性值?
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? 是否有一个TIBQuery和TZQuery的共同祖先,它具有SQL属性,这样我就可以改变函数参数中的TDataSet?
SQLstrings := TStringList.Create
,然后执行SQLstrings.Text := SQL
,最后将SQLstrings
传递给SetPropValue
吗? - David HeffernanTStrings(GetObjectProp(DataSet, 'SQL'))
来获取SQL
实例。你确定需要使用GetPropInfo
吗?这将是一段难以阅读的代码。 - TLamaString
而不是PPropInfo
请求属性,如果找不到该属性,则会引发异常。 - Remy LebeauSetObjectProp()
。SetPropValue()
不支持对象。 - Remy Lebeau