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;
4

1 回答 1

1

我会将类引用存储在一个数组中。然后为了语法上的方便,使用索引属性

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;

说了这么多,所有这些脚手架真的有必要吗?使用数组属性不仅更容易吗?

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]。使用数组属性为您提供了更大的灵活性,因为您可以使用变量对它们进行索引,从而在运行时而不是编译时决定您所指的是哪个对象。

于 2013-03-28T12:04:37.293 回答