6

目前在我的程序中,我有一个启动表单和一个主表单。启动表格显示一两秒钟。

现在,我在计时器中有以下代码:

  frmStartup.Destroy;

  frmMain := TfrmMain.Create(Self);
  frmMain.Show;

现在,我不确定这是否是正确的方法。它有效,但是在调用时application.Terminate(); 我收到访问冲突消息,导致我相信我在破坏启动表单时做错了。 .

如果有人可以展示做我想做的事情的正确程序(非模态),将不胜感激。

提前致谢,

编辑:

感谢所有反馈,我通过简单地添加代码来修复我的访问冲突:

  Action := caFree;

进入 frmStartup.formClose 方法。

4

4 回答 4

8

不要创建frmStartupusing Application.CreateForm。在那里创建的第一个表单成为您的应用程序的主要表单,如果那是frmStartup您在Application知识之外破坏它。

相反,请在项目源 (.dpr) 文件中使用普通的 Form.Create:

var
  frmStartup: TfrmStartup;

begin
  Application.Initialize;
  Application.MainFormOnTaskBar := True;
  frmStartup := TfrmStartup.Create(nil);  // No owner assigned here!
  frmStartup.Show;
  frmStartup.Update;

  Application.CreateForm(TfrmMain, frmMain); // Let Application have this for main form
  // Delay here if needed
  frmfrmStartup.Free;
  Application.Run;
end.
于 2012-02-13T18:54:43.670 回答
4

您可能希望尽早显示启动画面,因此理想情况下应该在初始化阶段完成,然后仅在 MainForm 准备好接管时才会消失。

这正是我们在应用程序中所做的,我们将 About 对话框重新用作启动屏幕,然后在 MainForm 窃取焦点时释放它。

在 dpr 中,在所需的 VCL/RTL 单元之后的 uses 子句中尽可能高:

  f_adtDlgAbout in 'f_adtDlgAbout.pas' {frmDlgAbout}, // ASAP to be used as a Splash screen

关于单位(仅供参考,FormStylefsStayOnTopPositionpoScreenCenter):

unit f_adtDlgAbout;

[...]

type
  TfrmDlgAbout = class(TForm)

[...]

procedure TfrmDlgAbout.SplashFormDeactivate(Sender: TObject);
begin
  Release;
end;

initialization
  // Use it as a Splash screen
  with TfrmDlgAbout.Create(nil) do begin
    AlphaBlend := True;
    AlphaBlendValue := 208;
    BorderStyle := bsNone;
    btnOK.Visible := False;
    OnDeactivate := SplashFormDeactivate;
    Show;
    Update;
  end;
end.
于 2012-02-13T21:31:45.920 回答
1

TFrmMain.Create(Self)??? 什么是“自我”?你是从 frmStartup 内部做的吗?如果是这样,不要。使用 TFrmMain.Create(NIL)。

使用frmStartup.Release释放frmStartup,如果你发送的所有代码都在frmStartup的一个方法中,你需要把那一行放在方法的底部

于 2012-02-13T18:55:00.520 回答
0

将 frmMain 设置为主窗体

在 frmMain.FormCreate

frmStartup := TfrmStartup.Create(nil);
try
  frmStartup.ShowModal;
finally
  frmStartup.Free;
end;
于 2013-09-06T15:51:03.447 回答