如何创建 class 的动态实例

How to create dynamic instances of a class

我希望能够创建 class 的实例,而不必将它们分别声明为对象。 一个简单的例子。我有一个程序可以为狗展注册狗。每次用户单击添加时,它都应该创建一个新的 TDog class 实例。我该怎么做?

我的静态尝试:

//clsDog_u
type
 TDog = class(TObject)
 private
  fName : string;
 public
  constructor Create(Name);
  function Get_Name():string;
end;

implementation
//I think you guys knows what goes here ;)

//------------Main Form---------------
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, clsDog;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    objDog: tDog;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  Name: string;
begin
  name := InputBox('', 'please enter in name:', 'Doggo1');
  objDog := tDog.Create(name);
  ShowMessage(objDog.Get_Name + ' has been added to the dog show.');

end;

end.

这是使用 TObjectList<TDog> 的好时机。

首先,您可以让此对象成为 class:

形式的字段
type
  TDog = class
    Name: string;
    Breed: string;
    Born: TDateTime;
    constructor Create(const AName, ABreed: string; const ABorn: TDateTime);
  end;

type
  TDogSimForm = class(TForm)
    btnAddDog: TButton;
    eName: TEdit;
    eBreed: TEdit;
    dtpBorn: TDateTimePicker;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure btnAddDogClick(Sender: TObject);
  private
    FDogs: TObjectList<TDog>;
  public
  end;

procedure TDogSimForm.btnAddDogClick(Sender: TObject);
begin
  FDogs.Add(
    TDog.Create(eName.Text, eBreed.Text, dtpBorn.DateTime)
  )
end;

procedure TDogSimForm.FormCreate(Sender: TObject);
begin
  FDogs := TObjectList<TDog>.Create;
end;

procedure TDogSimForm.FormDestroy(Sender: TObject);
begin
  FreeAndNil(FDogs);
end;

{ TDog }

constructor TDog.Create(const AName, ABreed: string; const ABorn: TDateTime);
begin
  Name := AName;
  Breed := ABreed;
  Born := ABorn;
end;