2010-06-21 115 views
1

我在下面的代碼問題:德爾福2010 RTTI和指針字段

program Project4; 

{$APPTYPE CONSOLE} 

uses 
    SysUtils, RTTI; 

type 

    TRecord2 = record 
    c: integer; 
    d: integer; 
    end; 

    TClass1 = class 
    public 
    FRecord: record 
     a: integer; 
     b: integer; 
    end; 
    FRecord2: TRecord2; 
    FPointRecord3: ^TRecord2; 

    constructor Create; 
    end; 

constructor TClass1.Create; 
begin 
    FPointRecord3 := nil; 
end; 

var 
    lContext: TRttiContext; 
    lType: TRttiType; 
    lFields: TArray<TRttiField>; 
    i: integer; 
begin 
    try 
    { TODO -oUser -cConsole Main : Insert code here } 
    lContext := TRttiContext.Create; 

    lType := lContext.GetType(TClass1); 

    lFields := lType.GetFields; 
    for i := 0 to Length(lFields) - 1 do 
    begin 
     write('Name = '+lFields[i].Name+', '); 
     if lFields[i].FieldType <> nil then 
     writeln('Type = '+lFields[i].FieldType.ToString) 
     else 
     writeln('Type = NIL!!!'); 
    end; 
    lContext.Free; 
    except 
    on E: Exception do 
     Writeln(E.ClassName, ': ', E.Message); 
    end; 
end. 

輸出:

Name = FRecord, Type = :TClass1.:1 
Name = FRecord2, Type = TRecord2 
Name = FPointRecord3, Type = NIL!!! 

lFields [I] .FieldType返回NIL 如何獲得與RTTI類型的指針類型的字段?

回答

3

它不會創建任何類型信息,因爲您從未實際爲其定義類型。您只是將字段定義爲指向定義類型的指針,因此編譯器會即時爲其創建臨時「類型」,但不會生成RTTI。

如果你想它的工作,像這樣做:

type 

    TRecord2 = record 
    c: integer; 
    d: integer; 
    end; 
    PRecord2 = ^TRecord2; 

    TClass1 = class 
    public 
    FRecord: record 
     a: integer; 
     b: integer; 
    end; 
    FRecord2: TRecord2; 
    FPointRecord3: PRecord2; 

    constructor Create; 
    end; 
+1

我有同樣的代碼,你只落後2秒:-) – 2010-06-21 16:13:51

+0

謝謝。有用。 – Mielofon 2010-06-22 04:20:31