带有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();
}
我仍在学习使用 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(); }