在 Delphi 中重新创建 TForm 的函数

Function to recreate a TForm in Delphi

我需要一个重新创建表单的程序。

原因是我有包含许多不同组件的表单。这些组件值(编辑框文本、复选框是否选中等)保存在 onhide 中,并在 isnide onshow 中再次加载。这确保在程序运行之间保留所有用户设置。

当他们(有意或无意地)做出导致问题的改变时,问题就来了。我希望能够在首次安装应用程序时将表单“重置”回默认设置。

我可以创建一个运行此代码的重置按钮

 FormName.free;
 DeleteFile('FormNameSettings.ini');
 FormName:=TFormName.Create(Application);
 FormName.show;
 

这就是所要求的。关闭表单,清除设置文件(因此状态不会在再次显示时恢复),然后重新创建表单。表单现在具有原始默认设置。

我的问题是试图将该代码放入一个我可以从多种形式轻松调用的函数中。

procedure ResetForm(form:tform;filename:string);
begin
    form.free;
    if fileexists(filename)=true then deletefile(filename);
    <what goes here to recretae the form by the passed tform?>
end;

任何人都可以帮助使 ResetForm 程序正常工作吗?最新 Delphi 11.

为了return新创建的表单我们实际上需要表单的var参数,但是单独这样做并不是很优雅,因为不能将派生表单class传递给表单的var参数输入 TForm 并且必须进行强制转换才能取悦编译器。即使使用 returns TForm 的函数也不会好多少,因为结果很可能被分配给派生形式的变量 class 并且这也会被编译器拒绝。

感谢泛型,我们可以编写一些代码来克服这些限制。由于 Delphi 不支持独立的通用过程或函数,我们将其包装在记录声明中:

type
  TFormUtils = record
  public
    class procedure ResetForm<T: TForm>(var form: T; const filename: string); static;
  end;

我们还需要保存一些关于表格的信息以备后用:

  • 表单的所有者
  • 是当前显示的表格

这允许重新创建表单。

class procedure TFormUtils.ResetForm<T>(var form: T; const filename: string);
begin
  var formOwner := form.Owner;
  var formShowing := form.Showing;
  form.free;
  if fileexists(filename) then
    deletefile(filename);
  form := T.Create(formOwner);
  if formShowing then
    form.Show;
end;