TFormCRUDBase<T : class> = class(TFormLayoutBase, MVP.Intf.CRUD.ICRUDView<T>)
{ ... }
end;
如果允许或不允许此功能,编译器不会指责任何错误或警告消息,但是当我尝试在设计器中添加一些控件时我会收到此消息
Declaration of class TFormCRUDBase is missing or incorrect.
所以问题是为什么语法允许我使用,IDE只是踢我。
事先提前答案 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;
这很有效但不优雅!