Lazarus中Form和其他对象创建的顺序是什么

时间:2013-08-15 13:53:17

标签: freepascal lazarus

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

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

我的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.FormCreate中进行此检查,假设在 SettingsForm完全初始化并准备好显示后,它只被称为?您可以在Show()中致电FormCreate()吗?

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

  • 我是否有任何想法,指南设计模式或其他材料可用于确定我的检查空位设置的位置?

2 个答案:

答案 0 :(得分: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。


一边说。您的设置完成块存在风险。如果Settings实例创建失败,则终结块将生成AV。你应该写:

finalization
  if Assigned(Settings) then
    Settings.SaveToFile();
  FreeAndNil(Settings);

答案 1 :(得分:1)

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

现在,如果我没有误会,您的表单是按照.dpr文件中列出的顺序创建的(请参阅project-> view source),其中列出的第一个表单将是您的主表单。

编辑:


ACTION

创建 - >显示 - >油漆 - >激活 - > ReSize - >油漆 - >关闭查询 - >关闭 - >停用 - >隐藏 - >破坏


EVENT

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

(引自here