Я хочу иметь возможность создавать экземпляры класса без необходимости объявлять их как объекты. Простой пример. У меня есть программа, которая регистрирует собак для выставок. Каждый раз, когда пользователь нажимает кнопку «Добавить», он должен создавать новый экземпляр класса TDog. Как мне это сделать?
Моя попытка статически:
//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.
Самый очевидный способ: поместить всех собак в Array
— очень базовую концепцию программирования. Еще больше комфорта дает известный TList
Delphi.
Самое время использовать TObjectList<TDog>.
Для начала вы можете сделать этот объект полем класса формы:
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;
Используйте
TObjectList<TDog>
.