2010-11-06 75 views
1

請幫助我。RTTI:如何將動態數組的值聲明爲類屬性

我找了存在的問題,並沒有發現我怎麼能得到動態數組項(聲明爲類)的所有公佈的財產在delphi類(我使用Delphi 7 IDE(我不能使用其他版本))

我有這樣的代碼:

TObjectList = array of TObject; 
    TSubClass = class(TObject) 
    private 
    FFirstName: string; 
    FLastName: string; 
    FDOB: TDateTime; 
    FArray : TObjectList; 
    published 
    property FirstName: string read FFirstName write FFirstName; 
    property LastName: string read FLastName write FLastName; 
    property DOB: TDateTime read FDOB write FDOB; 
    property MyArray : TObjectList read FArray write FArray ; 
    end; 

    TListSubClass = array of TSubClass; 

    TPersonList = class(TObject) 
    private 
    FSubClasses: TListSubClass; 
    public 
    constructor Create(AOwner: TComponent); override; 
    destructor Destroy; override; 
    published 
    property SubClasses: TListSubClass read FSubClasses write FSubClasses; 
    end; 

我有鏈接TPersonList類的ELEM(MyVariable的:TPersonList)。

我如何使用RTTI獲取我的FSubClasses和FArray數組項的所有已發佈屬性的數據?

如何使用RTTI將新數據設置爲FSubClasses?

謝謝, 謝爾蓋。

回答

0

看看和GetPropList單元TypInfo

GetDynArrayProp返回指向底層數組的指針,然後可以將其轉換爲正確的數組類型。

GetPropList返回一個指針的屬性信息數組你把類的所有屬性。

TPropInfo記錄,你從GetPropList回到對與相關的getter和setter方法的地址信息一個屬性,你可以使用它們分別調用getter或setter。

一般來說,你應該有TypInfo單元上的深入研究一下在你的Delphi幫助或聯機文檔:

http://docwiki.embarcadero.com/VCL/en/TypInfo

+0

謝謝您的回答,但是當我通過這種方式獲取數組的項目時,爲什麼項目沒有classinfo信息?此屬性爲零。 – 2010-11-07 10:40:39

+0

你對「沒有classinfo信息」有什麼意思,你可以用你到目前爲止嘗試過的代碼編輯你的問題嗎? – 2010-11-07 11:19:52

+0

我的意思是什麼時,我得到數組形式GetDynArrayProp項目不包括classInfo信息。在我的研究之後,我發現我需要獲得物品屬性的部分解決方案。 GetDynArrayProp - 工作,如果我的父類是TPersistent。 PS對不起,我的英語 - 我還是學生^ _ ^「 – 2010-11-08 04:46:53

1

你叫什麼?「動態數組」並不是所謂的「動態陣列「在德爾福世界。 「動態數組」被定義爲MyVar:例如整型數組。在你的課堂上,你只有TList的後代。這些TList後代是某種動態存儲,但它被稱爲TList(或TObjectList),而不是「動態數組」。

所以只需使用TypInfo單元。

  • GetPropList將爲您提供所有屬性的列表。
  • 然後爲每個映射類的PPropInfo項調用GetObjectProp,並檢索每個屬性的實例。
  • 調用GetStrProp檢索字符串發佈屬性的內容;
  • 調用GetOrdProp檢索整數發佈屬性的內容。
  • 調用GetFloatProp獲取浮點值,如TDateTime。

如果類已發佈屬性,在調用GetObjectProp之後,根據其類(TObjectList或TListSubClass)檢查返回的實例類型並枚舉其內容。

這是我們在開源ORM中使用的一種方法(我們專門爲屬性訪問指定了一些面向對象類,所以我們不需要typinfo單元)。請參閱http://synopse.info/fossil/finfo?name=SQLite3/SQLite3Commons.pas

+2

實際上他不使用TList,再看看類型聲明他們確實是動態數組。 – 2010-11-07 13:24:10

+0

確實!所以你只需使用GetDynArrayProp並將返回的指針轉換爲TObjectList類型,以便像常規動態數組那樣訪問它:for i:= 0 to high(TObjectList(aPointer))do ... TObjectList(aPointer) [0] ... – 2010-11-07 17:49:44

+0

謝謝你的回答。我應該怎麼做才能將數組保存到屬性中?因爲當我寫SetDynArrayProp(MyVariable,'SubClasses',PointerToNewArrayWithNewLenght);我只能在Property數組中的第一項:(爲什麼? – 2010-11-08 04:59:36