如何创建 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;
我希望能够创建 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;