2013-03-28 98 views
0

你好我有一個問題是可能的我在Delphi中創建子類的循環?我看到一些關於RTTI,但我不能找到如何在運行時創建屬性的類德爾福在屬性中創建子類運行時間

爲例

謝謝

Type 
    TclassX = class 
    private 
    public 
    X1 : integer; 
    X2 : String; 
end; 

Type 

    TRecord = class 
    ID : TClassX; 
    NAME : TClassX; 
    private 
    public 
    contructor Create(); 
    property ID : TClassX read FY1 write SetY1; 
    property NAME : TClassX read FY2 write SetY2; 
end; 

implementation 

constructor TRecord.Create; 
begin 
    ///HERE I WHANT MAKE A LOOP AND DON'T MAKE ONE BY ONE 
    // property[0] := ID; 
    // property[1] := NAME; 
    // FOR I:= 0 TO 1 DO BEGIN 
    // ***PROPERTY[i] := TClassX.Create; ---*** not correct just exemple 
    // END; 

    ID := TClassY.Create; 
    NAME := TClassY.Create; 
end; 
+0

所以你想在'TRecord'類中有一個'TClassX'對象的集合,並通過一些索引屬性來訪問它?而且,你有哪個版本的Delphi? – TLama

+0

你知道索引屬性嗎? – MBo

+0

我有德爾福XE3 –

回答

1

我將存儲在陣列中的類引用。然後對語法方便,使用indexed property

type 
    TMyClass = class 
    private 
    FY: array [1..2] of TClassX; 
    function GetY(Index: Integer): TClassX; 
    procedure SetY(Index: Integer; const Value: TClassX); 
    public 
    constructor Create; 
    property Y1: TClassX index 1 read GetY write SetY; 
    property Y2: TClassX index 2 read GetY write SetY; 
    end; 

function TMyClass.GetY(Index: Integer): TClassX; 
begin 
    Result := FY[Index]; 
end; 

procedure TMyClass.SetY(Index: Integer; const Value: TClassX); 
begin 
    FY[Index] := Value; 
end; 

然後,你可以簡單地遍歷FY實例化對象。

constructor TMyClass.Create; 
var 
    i: Integer; 
begin 
    inherited; 
    for i := low(FY) to high(FY) do begin 
    FY[i] := TClassY.Create; 
    end; 
end; 

說了這麼多,這一切腳手架真的是必要的。使用array property不僅更簡單嗎?

type 
    TMyClass = class 
    private 
    FY: array [1..2] of TClassX; 
    function GetY(Index: Integer): TClassX; 
    procedure SetY(Index: Integer; const Value: TClassX); 
    public 
    constructor Create; 
    property Y[Index: Integer]: TClassX read GetY write SetY; 
    end; 

然後,而不是寫Y1你寫Y[1]。使用數組屬性爲您提供了更大的靈活性,因爲您可以使用變量爲它們編制索引,並在運行時決定,而不是編譯時間引用的對象。

+0

Tks大衛這是完美的我的情況! –

+0

但是!如果我只需要一個領域的專屬!索引屬性的示例Y1在讀取之前需要更改相同的值我需要使用if或case? –

+0

我不太瞭解那條評論。我想我回答了你問的問題。 –