从类参数创建的更好方法是什么?

时间:2016-07-21 07:39:11

标签: delphi

TApplication.CreateForm中(不确定是否允许在此处粘贴代码。如果有人确认,我会这样做)这似乎是一种通过使用派生形式的类来创建TForm后代实例的方法以及指向表单的变量。两者都是CreateForm;

的参数
procedure TApplication.CreateForm(InstanceClass: TComponentClass; var Reference);

如果我想要一个创建派生控件的方法,只有一些参数作为什么类的指标,那么是否有更好或更简单的方法(可能用更少的代码)来完成CreateForm中的操作是和它将使用的变量。

编辑:我想有一个方法来创建我在项目中使用的控件。该方法还将执行一些与控件相关的其他代码,因此这是该方法的原因。我不想复制那些额外的工作,并且该方法将被多次调用。我可以像CreateForm一样实现代码,但是想知道是否有一种方法可以在更少或更简单的代码中执行相同的操作。

2 个答案:

答案 0 :(得分:4)

  

我希望有一个方法可以创建一个派生控件,只使用一些参数作为指示它是什么类以及它将使用的变量。

你不需要一种方法。你可以这样写:

MyForm := TMyForm.Create(Owner);

不要被Application.CreateForm中的所有代码推迟。该代码执行许多任务,其原理是分配Application.MainForm变量。 IDE喜欢鼓励您使用Application.CreateForm,但实际上您只需要调用一次,这就是创建主窗体。

如果您已将其设置为方法,那么它将如下所示:

function CreateForm(FormClass: TFormClass; Owner: TComponent): TForm;
begin
  Result := FormClass.Create(Owner);
end;

调用此函数时,您需要转换返回的值:

MyForm := TMyForm(CreateForm(TMyForm, Owner));

MyForm := CreateForm(TMyForm, Owner) as TMyForm;

作为替代方案,您可以使用通用方法:

type
  TFormCreator = class
  public
    class function CreateForm<T: TForm>(Owner: TComponent): T; static;
  end;

像这样实施:

class function TFormCreator.CreateForm<T>(Owner: TComponent): T;
begin
  Result := T(TFormClass(T).Create(Owner));
end;

这样称呼:

MyForm := TFormCreator.CreateForm<TMyForm>(Owner);

非常荒谬不是吗?你想要做的就是实例化一个表格!因此,我强烈怀疑您对IDE使用Application.CreateForm感到困惑,并认为实例化表单的确比实际情况要多。我的直觉告诉我你实际上正在寻找这个:

MyForm := TMyForm.Create(Owner);

答案 1 :(得分:-1)

AS。您可以发布您自己的代码,但关于版权拥有其他人的代码 - 这有点复杂。我认为它属于美国“合理使用”原则。例如,您可以发布一个VCL源代码片段来批评或演示某些内容,但不能将其复制粘贴到另一个项目中,只能将其复制粘贴到VCL代码中 - 这是“合理使用”意图所需要的。

VCL表单是一个组件,因此它需要一个负责内存管理的所有者。因此,您可以使用典型的TComponent创建模式创建表单。

  MyFormVariable := TMyFormClass.Create( Application );

这也增加了var Reference中无类型CreateForm拒绝的类型安全性。

这种方式是否比使用Application.CreateForm更好或更差取决于您的口味。我个人更喜欢统一的方式,所以当我需要明确地创建一个表单或数据模块时,我通常采用“组件”方式而不是“应用程序”方式。

我猜(只是猜测)在过去TApplication.CreateForm中添加了一些额外的必需设置,即创建表单的“组件方式”无法做到,至少在Application.Run开始VCL之前不会这样做呼叫。或者也许有TApplication的类型 - 而AFAIR有5个用于不同的项目 - 这些不是来自TComponent?但无论如何,我认为今天的限制 - 如果有的话 - 不再适用 -