Ple*_*rds 3 delphi rtti delphi-2006
在我的问题: 如何使用"发件人"参数与"As"运算符一次超过一个类
我选择了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;
Run Code Online (Sandbox Code Playgroud)
示例:我有一个TIBQuery,我想更新SQL属性的文本.但是SQL属性是一个TStrings类,所以我必须使用SQL.Text.在上面的代码中,它将引发错误"无效的属性类型",因为我有一个TStrings,后来我尝试设置一个普通的字符串.
如何使用GetPropInfo访问SQL.Text? 是否有TIBQuery和TZQuery的共同祖先具有SQL属性,所以我可以更改为,而不是函数参数中的TDataSet?
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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2200 次 |
| 最近记录: |