gpt4 book ai didi

delphi - 如何使用 TypInfo RTTI 方法为子属性项设置值?

转载 作者:行者123 更新时间:2023-12-03 15:43:46 25 4
gpt4 key购买 nike

在我的问题中: How to use “Sender” parameter with “As” operator for more then one class at a time

我选择 Remy Lebeau 的答案,因为它是大多数情况下最具活力的技术。它使用 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?TIBQuery 和 TZQuery 是否有一个具有 SQL 属性的共同祖先,因此我可以更改为,而不是函数参数中的 TDataSet?

最佳答案

在 Delphi 2006 中,TStrings.Text 属性无法通过 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;

关于delphi - 如何使用 TypInfo RTTI 方法为子属性项设置值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11728068/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com