2011-10-12 71 views
1

我的問題是如何訪問一個在其他單位的類?舉一個例子:Delphi GetClass

program Project1; 

{$APPTYPE CONSOLE} 

uses 
    SysUtils, 
    Classes, 
    System, 
    StrUtils, 
    Math, 
    TypInfo, 
    Data in 'Data.pas'; 

var 
    Str, name, value      : string; 
    List, tmpList       : TStringList; 
    i          : Integer; 
    Obj         : TObject; 
    CRef         : TPersistentClass; 
    d          : TData; 
begin 
    d := TData(GetClass('Data.TData').Create); 
    Writeln(Format('%s', [d.Name])); 
    Readln; 
    Readln; 
end. 

和數據單位:

unit Data; 

interface 
uses 
    SysUtils, 
    Classes; 
type 
    TData = class(TObject) 
    FName : string; 
    published 
    property Name : string read FName write FName; 
    end; 
type 
    TIn = class(TObject) 
    FName : string; 
    published 
    property Name : string read FName write FName; 
    end; 
implementation 

end. 

的問題是,該方法返回的getclass我始終爲零。 我知道有這樣的問題,但他們不幫助我。

在此先感謝!

+0

這不是一個內部類。看起來你需要改善你的問題。 –

回答

5

如果您使用的是以後的Delphi版本,您可以使用RTTI單元。

uses RTTI; 
.. 
    var 
    R : TRttiContext; 
    begin 
    R.FindType('Data.TData') 
... 

在您的例子錫是不是一個內部類,但內部類也可以像這樣訪問:

R.FindType('Data.TData.TIn') 
+0

好的,但我可以用TypInfo單元? –

+0

您使用的是哪個版本的Delphi? RTTI-unit與Delphi中最接近的Java Reflection。 –

+0

我使用Delphi 7 IDE –

5

鑑於d被定義爲TData,你不能簡單地使用d := TData.Create()

無論如何,如果你想從它的名字創建的類,你必須(看this link)使用GetClass或類將不被認可之前調用RegisterClass,你會得到一個nil

+0

是的我可以,但問題是我必須從字符串中的類的名稱創建一個實例。 –

+0

@Jordan Borisov:看看我編輯的帖子。 – Marco

+0

是的,我必須使用RegisterClass方法,但對於類我只有字符串中的名稱。如果我只有字符串中的名字,我該如何註冊類? –

4

您沒有註冊類。您需要致電RegisterClass

如果我只有字符串中的名稱,我該如何註冊類?

通常情況下,您會在聲明類的初始化部分單元中調用RegisterClass

當您來人來電RegisterClass你會發現,這個類需要從TPersistent得出:

procedure RegisterClass(AClass: TPersistentClass); 
+0

我知道問題是我只有字符串類型的類的名字! –

+0

@Jordan如果你想使用'GetClass',你需要調用'RegisterClass'。你爲什麼不這樣做? –

+0

嗯,不是真的感受到今天的愛..... –

2

請閱讀GetClass documentation。它只適用於註冊的持久類。所以,你必須按順序使用它改變的第一件事就是從TPersistent下降,即

type 
    TData = class(TPersistent) 
    FName : string; 
    published 
    property Name : string read FName write FName; 
    end; 

,然後你必須確保類是registred,即你必須調用RegisterClasses,也許在初始化部分的單位

initialization 
    RegisterClasses([TData]);