带有vcl的c ++:关闭辅助表单不会结束进程

c++ with vcl: closing secondary form does not end process

我仍在学习使用 vcl 形式的 c++,所以如果我问的问题比看起来更简单,请原谅我。作为参考,我在 Windows 环境中使用 c++ builder 10.1 berlin。

我有一个包含两种形式的程序(我们称它们为 "MainForm" 和 "BackupForm")。我在 MainForm 中接受用户输入,然后当用户单击特定按钮 ("DoSomething") 时,该操作会设置一些变量,然后调用 BackupForm->Show(); 然后 MainForm->Hide(); 切换到第二种形式做更多的事情。

我遇到的问题是:如果用户单击右上角通常关闭程序的 "X",它只会关闭 BackupForm 而不会结束进程。如果我在 MainForm 上执行相同的操作,它会结束该过程。

我环顾四周,要么没有问正确的问题,要么没有人问我这个问题,或者 hiding/showing 切换表单可能不是解决问题的正确方法,但我的总体问题是这样的:

TLDR: 有没有way/method/etc。检测在辅助表单上按下的 "close window" 按钮并随后关闭应用程序,结束它的进程而不必在任务管理器中终止它?

如果有更好的方法来切换我不知道的形式,我也不介意为此提出建议。

此外,如果需要,我可以 post 更多代码,但我不确定哪些代码真正有用。以下是我的一些资料:

主要(功能?应用程序?)由我预先生成 IDE:

#include <vcl.h>
#pragma hdrstop
#include <tchar.h>
//------------------------------------------------------------------------
USEFORM("BackupFormCode.cpp", BackupForm);
USEFORM("UserBackupProgram.cpp", MainForm);
//----------------------------------------------------------------------
int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
    try
    {
        Application->Initialize();
        Application->MainFormOnTaskBar = true;
        Application->CreateForm(__classid(TMainForm), &MainForm);
        Application->CreateForm(__classid(TBackupForm), &BackupForm);
        Application->Run();
    }
    catch (Exception &exception)
    {
        Application->ShowException(&exception);
    }
    catch (...)
    {
        try
        {
            throw Exception("");
        }
        catch (Exception &exception)
        {
            Application->ShowException(&exception);
        }
    }
    return 0;
}

按钮 "DoSomething" 在 "MainForm" 中按下:

void __fastcall TMainForm::ExecuteCopyClick(TObject *Sender)
{
    //Setting variables.... 
    //Then:
    BackupForm->Show();
    MainForm->Hide(); 
}

这是正常行为。两种形式都是自动创建的,所以关闭第二种形式不会终止应用程序......主形式仍然存在。 您可以通过多种方式解决此问题。这是快速的:

将第二种形式显示为模态:

void __fastcall TMainForm::ExecuteCopyClick(TObject *Sender)
      {
      this->Hide();
      BackupForm->ShowModal();
      this->Show();
      }

现在,BackupForm 具有 "full control",因为它显示为模式窗体。 BackupForm 关闭后,您可以再次显示主窗体(如上例所示),或关闭主窗体。

首先自动创建您的 MainForm,因此它被设置为 Application->MainForm

Application->MainForm 实际关闭时,它调用 Application->Terminate(),导致 Application->Run() 退出,从而允许 WinMain() 退出并终止进程。

当您显示 BackupForm 时,您只是 隐藏 MainForm,而不是 关闭 它。所以 Application->Terminate() 没有被调用。

如果您希望进程在 BackupForm 关闭时终止,您需要:

  • Close() Application->MainForm:

    void __fastcall TBackupForm::FormClose(TObject *Sender, TCloseAction &Action)
    {
        Application->MainForm->Close(); 
    }
    

    或者:

    void __fastcall TMainForm::ExecuteCopyClick(TObject *Sender)
    {
        //Setting variables.... 
        //Then:
        Hide(); 
        BackupForm->ShowModal();
        Close();
    }
    
  • 直接调用Application->Terminate()即可:

    void __fastcall TBackupForm::FormClose(TObject *Sender, TCloseAction &Action)
    {
        Application->Terminate(); 
    }