2010-04-28 35 views
4

我在一個字符串列表中有類名。例如,它可能是'TPlanEvent','TParcel','TCountry'等 如何將類名轉換爲字符串類?

現在我想通過循環列表找出大小。

它的工作原理有:

Size := TCountry.InstanceSize; 

但我想它是這樣的:

for i := 0 to ClassList.Count - 1 do 
    Size := StringToClass(ClassList[i]).InstanceSize; 

顯然,我的問題是如何寫的,而不是方法StringToClass的字符串轉換爲一個類。

回答

10

由於您使用的是StringList的,你可以存儲類在那裏,太:

var 
    C: TClass; 

    StringList.AddObject(C.ClassName, TObject(C)); 

...

for I := 0 to StringList.Count - 1 do 
    Size := TClass(StringList.Objects[I]).InstanceSize; 

...

+1

+ 1。比FindClass解決方案更簡單。 :-) – 2010-04-28 08:51:48

+1

這當然只適用,如果OT自己填充列表,而不是如果該列表是例如從文件或類似的東西中讀取...... – 2010-04-28 10:06:19

2
  1. 您必須使用FindClass通過名稱來查找類引用。如果沒有找到類,則會引發異常。
  2. 或者,您必須爲您的類調用RegisterClass,如果它們未在代碼中明確引用。
6

德爾福2010年,你可以使用:

function StringToClass(AName: string): TClass; 
var 
    LCtx: TRttiContext; 
    LTp: TRttiType; 
begin 
    Result := nil; 

    try 
    LTp := LCtx.FindType(AClassName); 
    except 
    Exit; 
    end; 

    if (LTp <> nil) and (LTp is TRttiInstanceType) then 
    Result := TRttiInstanceType(LTp).Metaclass; 
end; 

一個說明。由於只保留列表中的類名,因此TRttiContext.FindType需要完全限定的類型名稱(例如uMyUnit.TMyClass),因此此方法不起作用。修復方法是將這些類存儲在循環或列表中的單元。

+0

不幸的是我使用德爾福2007年 – 2010-04-28 09:04:49