为什么我不能宣布一个通用形式

时间:2015-02-02 14:09:19

标签: delphi delphi-xe2

我试图做的是基本上宣布一个这样的形式:

TFormCRUDBase<T : class> = class(TFormLayoutBase, MVP.Intf.CRUD.ICRUDView<T>)
{ ... }
end;

如果允许或不允许此功能,编译器不会指责任何错误或警告消息,但是当我尝试在设计器中添加一些控件时我会收到此消息

Declaration of class TFormCRUDBase is missing or incorrect.

所以问题是为什么语法允许我使用,IDE只是踢我。

事先提前

2 个答案:

答案 0 :(得分:3)

简而言之,表单设计器不支持泛型类型。

编译器适用于泛型类型。您可以使用运行时代码构建UI,添加控件等。但表单设计器不支持泛型类型。

答案 1 :(得分:2)

你要求工作了。 solurion很简单,但不优雅。你必须在强类型课程中进行制作,并使你从那里成长。

首先我制作一些虚拟类型:

type
  ICRUDView<T> = Interface
   function GetObject : T;
  end;

  TMyObject = class
    function Time: String;
  end;

和一个简单的实现:

{ TMyObject }

function TMyObject.Time: String;
begin
  Result := TimeToStr(now);
end;

procedure TForm5.FormCreate(Sender: TObject);
begin
  Caption := Self.GetObject.Time;
end;

然后你必须继承的强类型:

type
  TMyClassForm = class(TForm, ICRUDView<TMyObject>)
  strict private
    InternalObject: TMyObject;
  public
    function GetObject: TMyObject;
  end;

及其实施:

{ TMyClassForm }

function TMyClassForm.GetObject: TMyObject;
begin
  if (InternalObject = nil) then
    InternalObject := TMyObject.Create;

  Result := InternalObject;
end;

最后,您将从新创建的课程中获取表单:

  TForm5 = class(TMyClassForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

并在表单中使用

procedure TForm5.FormCreate(Sender: TObject);
begin
  Caption := Self.GetObject.Time;
end;

这很有效但不优雅!