0

我有一个简单的程序,有两个表单,一个主表单和一个设置表单。显然,设置表单允许用户更改设置。我有一个设置单元,其初始化部分从文件中读取设置。

当程序首次安装并首次启动时,设置将为空,如果是这样,我想显示设置表单。问题是在哪里放置检查和调用代码。

我的 Application.lpr 包含

begin
  RequireDerivedFormResource := True;
  Application.Initialize;
  Application.CreateForm(TMainForm, MainForm);
  Application.CreateForm(TSettingsForm, SettingsForm);
  Application.Run;
end.                       

我的设置单元大致是这样的

uses
  Classes, SysUtils, INIFiles;

type
  TSettings = class
    public
      procedure LoadFromFile();
      procedure SaveToFile();
    ...
    end;

var
  Settings: TSettings;

implementation

{ TSettings }

...

initialization
  Settings := TSettings.Create;
  Settings.LoadFromFile();

finalization
  Settings.SaveToFile();
  FreeAndNil(Settings);

end.       

如果我在 MainForm.FormCreate 中检查空设置,我将无法显示设置表单,因为它尚未创建。

我看不到如何在 Application.lpr 中做到这一点,因为那里没有明显的变量来引用 SettingsForm 实例。无论如何,把它放在那里感觉不对。

  • 假设仅在SettingsForm 完全初始化并准备好显示后调用,我可以在 SettingsForm.FormCreate 中进行此检查吗?可以打电话Show()FormCreate()

  • 我不确定我的设置类型何时被实例化。

  • 是否有任何想法、指南设计模式或其他材料可以用来确定将我的空设置检查放在哪里?

4

2 回答 2

3

表单是按照在程序文件中创建的顺序创建的。直到 Application.Run 才会显示可见的表单。

完全没有理由不能从程序文件中驱动“首次运行”逻辑。例如,你可以写:

begin
  RequireDerivedFormResource := True;
  Application.Initialize;
  Application.CreateForm(TMainForm, MainForm);
  Application.CreateForm(TSettingsForm, SettingsForm);
  if SettingsForm.FirstTime then
    SettingsForm.ShowModal;
  Application.Run;
end.

就我个人而言,我会避免让全局变量保存表单实例。对于始终存在的主要形式是合理的。但对于其他形式,我只是按需创建它们。如果您切换到该方法,那么您可以从主表单构造函数进行第一次设置 UI。


一边。您的设置完成块是有风险的。如果设置实例创建失败,那么您的终结块将产生一个 AV。你应该写:

finalization
  if Assigned(Settings) then
    Settings.SaveToFile();
  FreeAndNil(Settings);
于 2013-08-15T14:37:25.120 回答
1

这是一个非常简单的 Delphi 表单创建顺序列表。

现在,如果我没记错的话,您的表单是按照它们在您的 .dpr 文件中列出的顺序创建的(请参阅项目->查看源代码),其中列出的第一个表单将是您的主表单。

编辑:


行动

创建 -> 显示 -> 绘制 -> 激活 -> 调整大小 -> 绘制 -> 关闭查询 -> 关闭 -> 停用 -> 隐藏 -> 销毁


事件

OnCreate -> OnShow -> OnPaint -> OnActivate -> OnResize -> OnPaint -> OnCloseQuery -> OnClose -> OnDeactivate -> OnHide -> OnDestroy

(引自这里

于 2013-08-15T14:08:22.673 回答