2015-04-29 73 views
0

當我在這樣定義一個類德爾福7的ClassInfo功能在Delphi 7

TPerson = class(TObject) 
    private 
    FLName: string; 
    FFName: string; 
    FAge: integer; 
    FBDate: TDate; 
    public 
    published 
    property FName: string read FFName write FFName; 
    property LName: string read FLName write FLName; 
    property Age: integer read FAge write FAge; 
    property BDate: TDate read FBDate write FBDate; 
    end; 

procedure ListComponentProperties(AObject: TObject; Strings: TStrings); 
var 
    Count, Size, I: Integer; 
    List: PPropList; 
    PropInfo: PPropInfo; 
    PropValue: string; 
begin 
    Count := GetPropList(AObject.ClassInfo, tkAny, List); 
    Size := Count * SizeOf(Pointer); 
    GetMem(List, Size); 
    try 
    Count := GetPropList(AObject.ClassInfo, tkAny, List); 
    for I := 0 to Count - 1 do 
    begin 
     PropInfo := List^[I]; 
     PropValue := VarToStr(GetPropValue(AObject, PropInfo^.Name)); 
    end; 
    finally 
    FreeMem(List); 
    end; 
end; 

,我想它的出版性質與ListComponentProperties的錯誤信息會displayed.The錯誤列表是關係到下面的命令和AObject.ClassInfo

Count := GetPropList(AObject.ClassInfo, tkAny, List); 

任何幫助將不勝感激。

+1

將來,當您提出有關錯誤消息的問題時,請在您的問題中包含錯誤消息,逐字引用。 –

回答

2

您必須爲該類型啓用RTTI。默認情況下,它未啓用。申報類型如下:

type 
    {$M+} 
    TPerson = class(TObject) 
    .... 
    end; 
    {$M-} 

您最初致電GetPropList也是錯誤的。它必須是:

Count := GetPropList(AObject.ClassInfo, tkAny, nil); 

如果啓用了警告,編譯器會告訴您,您傳遞的是未初始化的變量。

我還沒有檢查任何更多的代碼。可能會有更多的錯誤。

+0

謝謝,是否有可能在應用程序級別啓用RTTI一勞永逸? – Mohamad

+0

不可以,你可以做的最好來自$ M +類型 –

2

除了使用$M編譯器指令外,還可以從任何啓用了RTTI信息的類中派生類。

其中一個這樣的類是TPersistent,它應該用作任何需要分配和流功能的類的基類。

TPersistent封裝共同 到可分配到其他對象的所有對象的行爲,並且能夠 讀寫它們的屬性和從表單文件(.xfm或.DFM 文件)。

不要創建TPersistent的實例。聲明不是組件的對象時,使用TPersistent作爲 基類,但需要將 保存到流或將其屬性分配給 其他對象。

在實踐中,這意味着,如果你想使用TPerson類的一些組件,可以在IDE通過Object Inspector中進行編輯和出版財產流形成的文件(.dfm)您的類必須有TPersistent的祖先在它的類層次結構。

type 
    TPersonComponent = class(TComponent) 
    protected 
    FPerson: TPerson; 
    procedure SetPerson(AValue: TPerson); 
    public 
    constructor Create(AOwner: TComponent); override; 
    destructor Destroy; override; 
    published 
    property Person: TPerson read FPerson write SetPerson; 
    end; 

constructor TPersonComponent.Create(AOwner: TComponent); 
begin 
    inherited; 
    FPerson := TPerson.Create; 
end; 

destructor TPersonComponent.Destroy; 
begin 
    FPerson.Free; 
    inherited; 
end; 

procedure TPersonComponent.SetPerson(AValue: TPerson); 
begin 
    FPerson.Assign(AValue); 
end; 

如果使用類聲明爲在上面的例子中TPerson = class(TObject),它的性能(即使公佈,並與RTTI信息打開)時TPersonComponent在Object Inspector中編輯將不會被保存到.dfm文件。