在我的問題: How to use 「Sender」 parameter with 「As」 operator for more then one class at a time如何使用TypInfo RTTI方法將值設置爲子屬性項目?
我選擇了雷米勒博的答案,因爲它是爲像大多數情況下,最有活力的高科技。它使用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,後來我嘗試設置一個普通的String。
如何使用GetPropInfo訪問SQL.Text? 是否有TIBQuery和TZQuery具有SQL屬性的共同祖先,所以我可以更改爲,而不是函數參數中的TDataSet?
難道你不能只是創建一個本地字符串列表,'SQLstrings:= TStringList.Create',然後做'SQLstrings.Text:= SQL',並最終將'SQLstrings'傳遞給'SetPropValue'? – 2012-07-30 19:30:55
您可以簡單地通過TStrings(GetObjectProp(DataSet,'SQL'))''獲得'SQL'實例。你確定你需要使用'GetPropInfo'嗎?它將是*不可讀的*一段代碼。 – TLama 2012-07-30 19:36:44
如果無法找到屬性,則通過'String'而不是'PPropInfo'請求屬性將引發異常。 – 2012-07-30 20:19:19