使用 VCL 的 C++:关闭辅助表单不会结束进程

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

本文关键字:表单 进程 结束 VCL C++ 使用      更新时间:2023-10-16

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

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

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

我环顾四周,要么没有问正确的问题,要么除了我之外没有人有这个问题,或者隐藏/显示切换表单不是正确的方法,但我的总体问题是这样的:

TLDR:有没有办法/方法/等来检测在辅助表单上按下的"关闭窗口"按钮,然后关闭应用程序,结束其进程而不必在任务管理器中杀死它?

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

此外,如果需要,我可以发布更多代码,但我不确定什么实际上会有所帮助。 以下是我的一些内容:

主要(功能?应用?由我的 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":

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

您的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(); 
    }
    

这是正常行为。这两个表单都是自动创建的,因此关闭第二个表单不会终止应用程序...主形态还活着。 您可以通过多种方式解决此问题。这是快速的:

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

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

现在,备份窗体具有"完全控制",因为它显示为模式窗体。关闭备份表单后,您可以再次显示主窗体(如上例所示),也可以关闭主窗体。