Delphi 为什么我不能声明泛型表单

Delphi 为什么我不能声明泛型表单,delphi,delphi-xe2,Delphi,Delphi Xe2,我想做的基本上是声明这样一个表单: TFormCRUDBase<T : class> = class(TFormLayoutBase, MVP.Intf.CRUD.ICRUDView<T>) { ... } end; 所以问题是,为什么语法允许我使用IDE,而IDE却把我踢开了 thx-advanced简单地说,表单设计器不支持泛型类型 编译器可以处理泛型类型。您可以使用运行时代码构建UI、添加控件等。但是表单设计器不支持泛型类型 简单地说,表单设计器不支持泛型类型 编

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

TFormCRUDBase<T : class> = class(TFormLayoutBase, MVP.Intf.CRUD.ICRUDView<T>)
{ ... }
end;
所以问题是,为什么语法允许我使用IDE,而IDE却把我踢开了


thx-advanced

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


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

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


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

你要求在附近工作。索里翁很简单,但并不优雅。你必须在强型班上取得成功,并从中获得内在动力

首先,我创建一些虚拟类型:

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

  TMyObject = class
    function Time: String;
  end;
然后是您必须从中继承的强类型:

type
  TMyClassForm = class(TForm, ICRUDView<TMyObject>)
  strict private
    InternalObject: TMyObject;
  public
    function GetObject: TMyObject;
  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;

这是工作,但它不优雅

你要求在附近工作。索里翁很简单,但并不优雅。你必须在强型班上取得成功,并从中获得内在动力

首先,我创建一些虚拟类型:

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

  TMyObject = class
    function Time: String;
  end;
然后是您必须从中继承的强类型:

type
  TMyClassForm = class(TForm, ICRUDView<TMyObject>)
  strict private
    InternalObject: TMyObject;
  public
    function GetObject: TMyObject;
  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;


这是工作,但它不优雅

类的声明必须是end关键字。可能我不清楚,类中添加了更多的东西,比如字段和方法,我只是把它放在这里声明。我修改了表单,使其更清晰。正如Davis所说:表单设计器不支持泛型类型。但是您可以通过让表单继承非泛型类来创建一个wotk arround。如果你愿意,我可以给你一个解决方案want@JensBorrisholt是的,你能帮我解释一下吗?这个类的声明必须是closed be end关键字。也许我不清楚,这个类增加了更多的东西,比如字段和方法,我只是把声明放在这里。我修改了表单,使其更清晰。正如Davis所说:表单设计器不支持泛型类型。但是您可以通过让表单继承非泛型类来创建一个wotk arround。如果你愿意,我可以给你一个解决方案want@JensBorrisholt是的,你能告诉我吗?天哪,这太令人沮丧了,有时候我真的不懂德尔菲。为什么他们提供这样一个特征,但不处理它需要在IDE中进行的更改,这样的特性是兼容的。我想,设计者认为TFED子孙不是使用泛型的主要候选。这可能是合理的。我想,让.dfm文件支持泛型需要做很多工作。我认为设计师们权衡了利弊,决定把精力花在其他地方。让你感到沮丧。我同意他们决定把effors放在其他地方的事实,我完全不同意编译器x IDE之间的差异,我的意思是,在这种情况下IDE应该警告我不允许或不支持,并且不要抛出一些模糊的通用异常。所以最后我有一个编译器说一切正常,而另一方面IDE说一切都不正常。@kabstergo-开发者在不需要的时候使用它很可能是不正确的。专业的软件开发不是一些随机开发人员一时兴起的事情。在这种情况下,我怀疑没有多少客户要求在IDE设计器中支持表单中的泛型…@kabstergo:这并不是太方便意味着懒惰,但通常情况下,实施这一点并不划算,因为这可能需要很多时间和/或几乎没有任何需求。换句话说,不是做所有可能的事情,而是只做有商业意义的事情,这通常是一个可靠的商业决策。想想雅格尼,天哪,这太令人沮丧了,有时候我真的不懂德尔菲。为什么他们提供这样一个特征,但不处理它需要在IDE中进行的更改,这样的特性是兼容的。我想,设计者认为TFED子孙不是使用泛型的主要候选。这可能是合理的。我想,让.dfm文件支持泛型需要做很多工作。我认为设计师们权衡了利弊,决定把精力花在其他地方。让你感到沮丧。我同意他们决定把effors放在其他地方的事实,我完全不同意编译器x IDE之间的差异,我的意思是,在这种情况下IDE应该警告我不允许或不支持,并且不要抛出一些模糊的通用异常。所以最后我有一个编译器说一切正常,而另一方面IDE说一切都不正常。@kabstergo-开发者在不需要的时候使用它很可能是不正确的。专业的软件开发是不会发生的事情
在一些随机开发的突发奇想下。在这种情况下,我怀疑没有多少客户要求在IDE设计器中支持表单中的泛型…@kabstergo:这并不意味着太方便就意味着懒惰,但通常实现这一点并不划算,因为这可能需要很多时间和/或几乎没有任何需求。换句话说,不是做所有可能的事情,而是只做有商业意义的事情,这通常是一个可靠的商业决策。想想雅格尼。