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

时间:2017-02-22 17:41:56

标签: c++ c++builder vcl

我还在学习使用vcl表单的c ++,所以请原谅我,如果我要求的结果比看起来更简单。作为参考,我在Windows环境中使用c ++ builder 10.1 berlin。

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

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

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

TLDR: 是否有方法/方法/等。检测在辅助表单上按下“关闭窗口”按钮,然后关闭应用程序,结束它的进程而不必在任务管理器中将其终止?

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

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

Main(Function?Application?)我的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(); 
}

1 个答案:

答案 0 :(得分:1)

首先自动创建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(); 
    }