Как создавать динамические экземпляры класса

#delphi

#delphi

Вопрос:

Я хочу иметь возможность создавать экземпляры класса без необходимости объявлять их каждый как объекты. Простой пример. У меня есть программа, которая регистрирует собак для выставки собак. Каждый раз, когда пользователь нажимает кнопку добавить, он должен создавать новый экземпляр класса 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.
 

Комментарии:

1. Используйте TObjectList<TDog> .

2. Самый очевидный способ: поместить всех собак в Array очень базовую концепцию программирования. Больше комфорта благодаря хорошо известному Delphi TList .

Ответ №1:

Это прекрасное время для использования TObjectList<TDog> .

Для начала вы можете позволить этому объекту быть полем класса form:

 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;