Delphi使用泛型类来管理组件

时间:2016-10-08 23:59:25

标签: delphi generics

我制作了一个用泛型进行一些测试的程序。它看起来像这样:

enter image description here

基本上,您可以使用下面的2个按钮添加按钮或编辑,它们将显示当前日期。我没有为按钮和编辑创建两个不同的类,而是认为我可以创建一个这样的泛型类:

type
 TGeneric<T: class, constructor> = class(TObject)
  private
   item: T;
   date: TDateTime;
   function getTime: string;
  public
   constructor Create;
   destructor Destroy; override;
   procedure showLife(Sender: TObject);
   property time: string read getTime;
   property myObj: T read item write item;
 end;

implementation

{ TGeneric<T> }

constructor TGeneric<T>.Create;
begin
 inherited;
 date := Now;
end;

destructor TGeneric<T>.Destroy;
begin
  inherited Destroy;
end;

function TGeneric<T>.getTime: string;
begin
  Result := FormatDateTime('c', date);
end;

上面的类名为UnitGeneric。我有另一个名为Unit1的单元,它包含这个实现:

procedure TForm3.Button1Click(Sender: TObject);
var a: TGeneric<TButton>;
begin

 a := TGeneric<TButton>.Create;
 try

  a.myObj := TButton.Create(Self);
  a.myObj.Parent := Self;
  a.myObj.SetBounds(aLeft, aTop, 200, 35);
  a.myObj.Caption := a.time;
  setTop(40);    
 finally
  a.Free;
 end;

end;

procedure TForm3.Button2Click(Sender: TObject);
var a: TGeneric<TEdit>;
begin

 a := TGeneric<TEdit>.Create;
 try
  a.myObj := TEdit.Create(Self);
  a.myObj.Parent := Self;
  a.myObj.SetBounds(aLeft, aTop, 200, 35);
  a.myObj.Text := a.time;
  setTop(40);
 finally
  a.Free;
 end;

end;

我有两个主要问题:

  1. 我是否以正确的方式创建组件(TEdits和TButton)?正如您所看到的,我在泛型类中声明了一个可以使用该属性访问的item: T变量。然后我直接在表单中管理对象的创建等。在其他地方(可能在泛型类的构造函数中)执行它会更好吗?

  2. 我知道当我为某个组件设置所有者时,&#34;父亲&#34;将摧毁所有的孩子。根据这个原因,如果我按照上面的方法创建一个对象(TEdit或TButton)并尝试使用try-finally,它是否安全?

  3. 注意:在1我特别要问这是否是管理Generic类中对象的正确方法

0 个答案:

没有答案