gpt4 book ai didi

带有 vcl 的 C++ : closing secondary form does not end process

转载 作者:行者123 更新时间:2023-11-28 05:17:10 24 4
gpt4 key购买 nike

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

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

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

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

TLDR: 有什么办法/方法/等等。检测在辅助窗体上按下的“关闭窗口”按钮并随后关闭应用程序,结束它的进程而不必在任务管理器中终止它?

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

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

Main(函数?应用程序?)由我的 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;
}

在“MainForm”中按下“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();
    }

关于带有 vcl 的 C++ : closing secondary form does not end process,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42398644/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com