Delphi 从类参数创建的更好方法?

Delphi 从类参数创建的更好方法?,delphi,Delphi,在TApplication.CreateForm中(不确定是否允许在此处粘贴代码。如果somemone确认,我将这样做),这似乎是一种通过使用派生表单的类和指向表单的变量来创建TForm子体实例的方法。两者都是CreateForm的参数 procedure TApplication.CreateForm(InstanceClass: TComponentClass; var Reference); 如果我想有一个方法来创建一个派生控件,只使用一些参数作为它是什么类和它将使用的变量的指示器,那么

TApplication.CreateForm
中(不确定是否允许在此处粘贴代码。如果somemone确认,我将这样做),这似乎是一种通过使用派生表单的类和指向表单的变量来创建TForm子体实例的方法。两者都是
CreateForm
的参数

procedure TApplication.CreateForm(InstanceClass: TComponentClass; var Reference);
如果我想有一个方法来创建一个派生控件,只使用一些参数作为它是什么类和它将使用的变量的指示器,那么有没有更好甚至更简单的方法(可能代码更少)来完成
CreateForm
中所做的事情呢


编辑:我希望有一个方法来创建我在项目中使用的控件。该方法还将执行一些与控件相关的附加代码,这就是该方法的原因。我不想重复额外的工作,该方法将被多次调用。我可以用与
CreateForm
相同的方法实现代码,但我想知道是否有一种方法可以在更少或更简单的代码中实现相同的功能。你可以发布你自己的代码,但是关于版权属于其他人的代码——这有点复杂。我相信它属于美国的“合理使用”原则。例如,您可以发布一段VCL源代码来批评或演示某些内容,但不能将其复制粘贴到另一个项目中,也只能发布少量的VCL代码,这是出于“合理使用”的目的

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

  MyFormVariable := TMyFormClass.Create( Application );
这也增加了类型安全性,即
CreateForm
中的非类型化
var引用

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


我猜(只是猜测)在过去的
TApplication.CreateForm添加了一些额外的必需设置,而创建表单的“组件方式”无法做到这一点,至少在VCL开始使用
应用程序之前是这样。运行
调用。或者可能有一些类型的
t应用程序
,而AFAIR则有5种类型用于不同的项目,它们不是从
t组件
?但无论如何,我认为今天的限制——如果有的话——不再适用了。你可以发布你自己的代码,但是关于版权属于其他人的代码——这有点复杂。我相信它属于美国的“合理使用”原则。例如,您可以发布一段VCL源代码来批评或演示某些内容,但不能将其复制粘贴到另一个项目中,也只能发布少量的VCL代码,这是出于“合理使用”的目的

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

  MyFormVariable := TMyFormClass.Create( Application );
这也增加了类型安全性,即
CreateForm
中的非类型化
var引用

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

我猜(只是猜测)在过去的
TApplication.CreateForm添加了一些额外的必需设置,而创建表单的“组件方式”无法做到这一点,至少在VCL开始使用
应用程序之前是这样。运行
调用。或者可能有一些类型的
t应用程序
,而AFAIR则有5种类型用于不同的项目,它们不是从
t组件
?但无论如何,我认为今天的限制——如果有的话——不再适用了

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

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

MyForm := TMyForm.Create(Owner);
function CreateForm(FormClass: TFormClass; Owner: TComponent): TForm;
begin
  Result := FormClass.Create(Owner);
end;
class function TFormCreator.CreateForm<T>(Owner: TComponent): T;
begin
  Result := T(TFormClass(T).Create(Owner));
end;
MyForm := TFormCreator.CreateForm<TMyForm>(Owner);
不要被
Application.CreateForm
中的所有代码所拖累。该代码执行许多任务,其原理是分配
Application.MainForm
变量。IDE喜欢鼓励您使用
Application.CreateForm
,但实际上您只需要调用它一次,即创建主表单

如果您死心塌地地想把它变成一种方法,那么它会是这样的:

MyForm := TMyForm.Create(Owner);
function CreateForm(FormClass: TFormClass; Owner: TComponent): TForm;
begin
  Result := FormClass.Create(Owner);
end;
class function TFormCreator.CreateForm<T>(Owner: TComponent): T;
begin
  Result := T(TFormClass(T).Create(Owner));
end;
MyForm := TFormCreator.CreateForm<TMyForm>(Owner);
调用此函数时,需要强制转换返回的值:

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

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

type
  TFormCreator = class
  public
    class function CreateForm<T: TForm>(Owner: TComponent): T; static;
  end;
我想有一个方法,它创建一个派生控件,其中只有一些参数作为它是什么类以及它将使用的变量的指示器

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

MyForm := TMyForm.Create(Owner);
function CreateForm(FormClass: TFormClass; Owner: TComponent): TForm;
begin
  Result := FormClass.Create(Owner);
end;
class function TFormCreator.CreateForm<T>(Owner: TComponent): T;
begin
  Result := T(TFormClass(T).Create(Owner));
end;
MyForm := TFormCreator.CreateForm<TMyForm>(Owner);
不要被
Application.CreateForm
中的所有代码所拖累。该代码执行许多任务,其原理是分配
Application.MainForm
变量。IDE喜欢鼓励您使用
Application.CreateForm
,但实际上您只需要调用它一次,即创建主表单

如果您死心塌地地想把它变成一种方法,那么它会是这样的:

MyForm := TMyForm.Create(Owner);
function CreateForm(FormClass: TFormClass; Owner: TComponent): TForm;
begin
  Result := FormClass.Create(Owner);
end;
class function TFormCreator.CreateForm<T>(Owner: TComponent): T;
begin
  Result := T(TFormClass(T).Create(Owner));
end;
MyForm := TFormCreator.CreateForm<TMyForm>(Owner);
调用此函数时,需要强制转换返回的值:

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

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

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

“DavidHeffern No.更少代码或替代代码,你会认为这是更好的代码。那么更少的代码呢?也许我不明白你的意思,但我问是否有更少的代码或更简单的代码比什么是在CytFrand中使用。不,你的编辑极大地帮助。Thanks@DavidHeffernan更少的代码或替代代码,你会认为更好的鳕鱼