如何在Delphi中显示退出时的最终表单?

如何在Delphi中显示退出时的最终表单?,delphi,forms,exit-code,Delphi,Forms,Exit Code,这应该是一个简单的一个人。我就是不知道怎么做 退出我的程序后,我想隐藏主窗体并自行显示最后一个“谢谢”窗体,如下所示: procedure TMainForm.ExitExecute(Sender: TObject); begin MainForm.Visible := false; ThankYouForm.Show; MainForm.Close; end; begin Application.Initialize; Application.CreateForm(TMa

这应该是一个简单的一个人。我就是不知道怎么做

退出我的程序后,我想隐藏主窗体并自行显示最后一个“谢谢”窗体,如下所示:

procedure TMainForm.ExitExecute(Sender: TObject);
begin
  MainForm.Visible := false;
  ThankYouForm.Show;
  MainForm.Close;
end;
begin
  Application.Initialize;
  Application.CreateForm(TMainForm, MainForm);
  Application.Run;
  TThankYouForm.Execute;
end.
但当我这么做时,我得到了一个例外:

EInvalid操作:无法更改OnShow或OnHide中的可见内容

那么,在Delphi中退出程序时,如何显示最终窗体,同时隐藏主窗体呢


结论:Mghie证实了我所尝试的是正确的,应该是有效的。这表明我在退出和关闭表单的过程中有一个bug,导致了这个异常

既然我知道了这一点,我很快就会发现并解决这个问题


发现了问题:我从ThankYouForm中关闭了我的主表单,然后不知何故,它又回到了ExitExecute,然后,好吧,它就被阻塞了

但一切都好起来了。在ThankYouForm.ShowModal之前隐藏main form.Hide可以完美地工作


再次感谢各位。

您可以在主窗体的
OnClose
处理程序中执行此操作。请确保
showmodel
另一个表单,否则当主表单的关闭终止应用程序时,它将立即关闭:

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Hide;
  with TThankYouForm.Create(nil) do try
    ShowModal;
  finally
    Free;
  end;
  Action := caFree;
end;
甚至

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Hide;
  with TThankYouForm.Create(Application) do
    ShowModal;
  Action := caFree;
end;
而且一定要让这种行为成为可选的——当用户关闭应用程序时,他们已经完成了它,并且不是每个人都对那些不愿意离开的程序感到满意

编辑:


好的,在试用期结束时展示这样的表格确实有意义。虽然我不能真正说明代码引发异常的原因,但您应该能够通过使用debug DCU进行编译、在引发异常的行上设置断点并检查堆栈跟踪来找出原因。我假设表单属性和您的代码的某种组合会导致堆栈上层的
Visible
属性的另一个变化,您需要找出它是什么,并纠正它。上面的代码应该真的有效。

不要试图将某些内容塞进主窗体,而是转到您知道其他所有内容都已完成运行的地方:Application.Run返回的位置。创建一个创建、显示和销毁告别表单的新过程,然后在DPR文件中调用它,如下所示:

procedure TMainForm.ExitExecute(Sender: TObject);
begin
  MainForm.Visible := false;
  ThankYouForm.Show;
  MainForm.Close;
end;
begin
  Application.Initialize;
  Application.CreateForm(TMainForm, MainForm);
  Application.Run;
  TThankYouForm.Execute;
end.
显示功能可以是以下几行:


我将把(尝试)上面提供的任何代码放在主窗体的OnCloseQuery事件中。确保can close:=false,直到您准备好关闭主窗体。

这可能是由于方法调用顺序与消息处理程序处理顺序之间的差异造成的。在您的方法完成之后,操作系统队列中仍然有消息,并且它们正在被VCL调度和处理

不,该代码给出了与我上面提到的相同的异常。是把“Hide;”放在那里导致了它。然后是你的代码中的一些东西,我真的无法评论。上面的代码在一个测试应用程序中工作,试试吧。目的是在一个人的试用期结束并且他们最后一次关闭程序后使用它。它会弹出一个盒子,感谢他们,并询问他们是否有任何反馈或希望延长试验。如果你已经在测试应用程序中验证了它正常工作,那么我同意是我。我将设法找出我的问题。谢谢,谢谢你,罗伯。这是始终显示最终表单的好方法。实际上,我是基于main表单中的IsLastRun变量有条件地执行ThankYouForm,这会使这个方法有点混乱,所以请将您的条件存储到其他地方。