为什么我不能声明通用形式

why i can't declare a generic form

我想做的基本上是声明一个这样的表单:

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

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

Declaration of class TFormCRUDBase is missing or incorrect.

所以问题是为什么语法允许我使用而 IDE 只是把我踢走了。

提前谢谢

简单地说,表单设计器不支持泛型。

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

您要求变通。 solurion 很简单,但并不优雅。你必须做强类型class,并让你从中继承。

首先我做了一些虚拟类型:

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;

最后你让你的表单继承了你新建的 class:

  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;

它可以工作,但不够优雅!