目前在我的程序中,我有一个Startup表单和一个Main表单。启动表单显示一两秒。
现在,我在计时器中有以下代码:
frmStartup.Destroy;
frmMain := TfrmMain.Create(Self);
frmMain.Show;
现在,我不确定这是否是正确的方法..它有效,但在调用application.Terminate();
时
我收到一条访问违规消息,导致我相信我在破坏启动表单时做错了什么..
如果有人能够展示出我想做的正确程序(非模态),我们将不胜感激。
提前致谢,
编辑:
感谢所有反馈,我通过简单地添加代码修复了访问冲突:
Action := caFree;
进入frmStartup.formClose方法。
答案 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
关于单位(仅供参考,FormStyle
为fsStayOnTop
且Position
为poScreenCenter
):
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;