2012-07-30 28 views
3

在我的問題: 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?

+0

難道你不能只是創建一個本地字符串列表,'SQLstrings:= TStringList.Create',然後做'SQLstrings.Text:= SQL',並最終將'SQLstrings'傳遞給'SetPropValue'? – 2012-07-30 19:30:55

+2

您可以簡單地通過TStrings(GetObjectProp(DataSet,'SQL'))''獲得'SQL'實例。你確定你需要使用'GetPropInfo'嗎?它將是*不可讀的*一段代碼。 – TLama 2012-07-30 19:36:44

+0

如果無法找到屬性,則通過'String'而不是'PPropInfo'請求屬性將引發異常。 – 2012-07-30 20:19:19

回答

9

在Delphi 2006中,無法通過RTTI訪問TStrings.Text屬性。即使是這樣,您也不需要使用RTTI來訪問它。既然你知道SQL屬性是TStrings對象,你可以簡單地retreive從屬性和實際的對象指針,類型轉換爲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; 
+2

+1; @EASI,我知道你已經特別提出這個問題,但你可以直接使用'GetObjectProp'。之前使用'GetPropInfo'沒有什麼好處(它在另一個'GetObjectProp'重載中被調用)。 – TLama 2012-07-30 19:52:18

+2

在GetObjectProp()之前調用'GetPropInfo()'可以避免在找不到屬性時引發的異常。另一個重載版本的'GetObjectProp()'不會給你這個選項,它會引發一個異常。在這種情況下,我認爲這是可以的,因爲'try/except',但是總的來說,如果你可以避免一個異常,你可以避免與之相關的開銷。 – 2012-07-30 20:17:56

+0

這太好了。我完全忘了看到'GetObjectProp'。這非常有教育意義! – PSyLoCKe 2012-07-30 21:10:15

相關問題