你好我有一个问题可能我在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 :(得分: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]
。使用数组属性可以为您提供更大的灵活性,因为您可以使用变量对它们进行索引,因此在运行时决定而不是编译您指的是哪个对象。