我有一个简单的程序,有两个表单,一个主表单和一个设置表单。显然,设置表单允许用户更改设置。我有一个设置单元,其初始化部分从文件中读取设置。
首次安装并首次启动程序时,设置将为空,如果是,我想显示设置表单。问题是在哪里放置检查和调用代码。
我的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()
吗?
我不确定何时我的设置类型会被实例化。
我是否有任何想法,指南设计模式或其他材料可用于确定我的检查空位设置的位置?
答案 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)