为什么我不能声明通用形式
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;
它可以工作,但不够优雅!
我想做的基本上是声明一个这样的表单:
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;
它可以工作,但不够优雅!