使用 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 上执行相同的操作,它将结束该过程。
我环顾四周,要么没有问正确的问题,要么除了我之外没有人有这个问题,或者隐藏/显示切换表单不是正确的方法,但我的总体问题是这样的:
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();
}
现在,备份窗体具有"完全控制",因为它显示为模式窗体。关闭备份表单后,您可以再次显示主窗体(如上例所示),也可以关闭主窗体。
- GTK 最大化表单 C++
- win 表单应用程序字符串^ 到 int
- 结构化绑定初始值设定项表单 { 赋值表达式 } 对于 clang 上的数组类型失败
- 可以在JSON文件的帮助下在Qt中创建UI表单
- C++ 如何编写单进程named_mutex?
- 表单未显示在凭据提供程序中
- 表单显示对话框函数错误,并且不执行下面的语句
- 如何从 winapi 中的编辑表单获取文本?
- 在 cout 中将线条表单文件与自定义文本组合时出现问题
- 从 dll 调用 opencv 垫到 Windows 表单,图像出现故障
- 如何在不使用任何数据库的情况下制作动态注册表单?
- 家庭作业帮助 - 检查表单按钮上的数据
- C++ 在给定像素数据数组的表单上绘制矩形
- 复制初始化表单 '= {}'
- 如何创建第二个 QT .ui 表单
- 如何将变量从一个表单传递到另一个表单
- 如何从另一个Qt Widget表单类调用MainWindow类
- 在表单 QT 上的小部件内绘制
- 使用 VCL 的 C++:关闭辅助表单不会结束进程
- 父进程不读取管道表单