2

这对某人来说应该是一个简单的问题。我只是不知道该怎么做。

退出我的程序后,我想隐藏主表单并让最终的“谢谢”表单自行出现,如下所示:

procedure TMainForm.ExitExecute(Sender: TObject);
begin
  MainForm.Visible := false;
  ThankYouForm.Show;
  MainForm.Close;
end;

但是当我这样做时,我得到了异常:

EInvalid 操作:无法在 OnShow 或 OnHide 中更改 Visible

那么,如何在 Delphi 中退出程序时显示最终表单,同时隐藏主表单?


结论:Mghie 确认我的尝试是正确的并且应该有效。这表明我在退出和关闭表单的过程中的某个地方出现了一个错误,导致了这个异常。

现在我知道了,我很快就能找到并解决问题。


发现了问题:我正在从ThankYouForm 中关闭我的主表单,并且不知何故循环回到了ExitExecute 中,而且,它都搞砸了。

但一切又好了。ThankYouForm.ShowModal 之前的 MainForm.Hide 可以完美运行。

再次感谢各位。

4

4 回答 4

12

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

begin
  Application.Initialize;
  Application.CreateForm(TMainForm, MainForm);
  Application.Run;
  TThankYouForm.Execute;
end.

显示功能可以按照Mghie 的回答演示的内容:

class procedure TThankYouForm.Execute;
begin
  with Create(nil) do try
    ShowModal;
  finally
    Free;
  end;
end;
于 2009-11-18T06:39:09.317 回答
4

您可以在OnClose主窗体的处理程序中执行此操作。一定要ShowModal其他窗体,否则当关闭主窗体终止应用程序时它会立即关闭:

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;

并且一定要让行为可选——当用户关闭应用程序时,他们就完成了它,并不是每个人都对那些不愿离开的程序感到满意。

编辑:

OK,在试用期结束时显示这样的表格确实有道理。虽然我不能真正说出您的代码引发异常的原因 - 您应该能够通过使用调试 DCU 进行编译、在引发异常的行上设置断点并检查堆栈跟踪来找出答案。我假设表单属性和您的代码的某种组合会导致Visible堆栈更高的属性发生另一个变化,您需要找出它是什么并纠正它。上面的代码应该真的可以工作。

于 2009-11-18T05:58:43.673 回答
0

I would put (try) any of the code supplied above in the main form's OnCloseQuery event. Ensure that can close := false until you are ready to close the main form.

于 2009-11-18T14:34:41.573 回答
0

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

于 2009-11-20T03:47:47.753 回答