正确的方法来破坏一个表单,并在Delphi中显示另一个

时间:2012-02-13 18:48:51

标签: forms delphi procedure creation destruction

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

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

  frmStartup.Destroy;

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

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

如果有人能够展示出我想做的正确程序(非模态),我们将不胜感激。

提前致谢,

编辑:

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

  Action := caFree;

进入frmStartup.formClose方法。

4 个答案:

答案 0 :(得分:8)

请勿使用frmStartup创建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.

答案 1 :(得分:4)

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

这正是我们在应用程序中所做的,其中我们将“关于”对话框重新用作启动画面,然后在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.

答案 2 :(得分:1)

TFrmMain.Create(自拍)???什么是“自我”?你是从frmStartup里面做的吗?如果是这样,。使用TFrmMain.Create(NIL)。

使用frmStartup.Release释放frmStartup,如果你发送的所有代码都在frmStartup的方法中,你需要将该行放在方法的 bottom

答案 3 :(得分:0)

将frmMain设置为主窗体

在frmMain.FormCreate

frmStartup := TfrmStartup.Create(nil);
try
  frmStartup.ShowModal;
finally
  frmStartup.Free;
end;