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 に答える