2017-02-22 2 views
0

저는 여전히 vcl 형식으로 C++을 배우므로, 제가 묻는 것은 그것이 보이는 것보다 더 단순한 것으로 판명되면 용서할 수 있습니다. 참고로 Windows 환경에서 C++ 빌더 10.1 베를린을 사용하고 있습니다.C++ with vcl : 보조 양식을 닫지 않아도 프로세스가 종료되지 않습니다.

두 가지 형식의 프로그램이 있습니다 ("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; 
} 

버튼 "해봐요" "MainForm"누르면 :

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

답변

1

MainForm이 자동으로 생성되므로 Application->MainForm으로 설정됩니다. Application->MainForm 실제로 폐쇄

, 그것은 따라서 WinMain() 종료하고 프로세스를 종료 할 수 있도록 종료 Application->Run() 원인 Application->Terminate()를 호출합니다.

당신이 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(); 
    } 
    
    로 전화 직접: 도움을

    void __fastcall TBackupForm::FormClose(TObject *Sender, TCloseAction &Action) 
    { 
        Application->Terminate(); 
    } 
    
+0

감사합니다! 어떤 이유로, 두 개의'FormClose' 메소드를 추가하는 것이 내 코드에서 작동하지 않았지만'ShowModal '을 가진 두 번째 솔루션은 정상적으로 작동하는 것처럼 보였다. – RisaAudr

+0

'FormClose()'메소드를 코드에 추가하는 것만으로는 충분하지 않습니다. 실제로 그것들을'OnClose' 이벤트에 할당해야합니다. 올바르게 사용할 경우 잘 작동합니다. –

+0

FormClose 메서드를 OnClose 이벤트에 어떻게 할당합니까? 나는 어떻게하는지에 대한 문서를 찾기 위해 고심 중이다 ... – RisaAudr

0

정상적인 행동입니다. 두 양식 모두 자동 작성되므로 두 번째 양식을 닫으면 응용 프로그램이 종료되지 않습니다 ... 기본 양식은 아직 살아 있습니다. 여러 가지 방법으로 문제를 해결할 수 있습니다. 여기에 빠른 하나입니다 모달로

쇼 두 번째 양식 :이 모달 형태로 표시 있기 때문에

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

는 이제 BackupForm는 "모든 권한"을 가지고있다. BackupForm을 닫은 후에는 위의 예와 같이 기본 양식을 다시 표시하거나 기본 양식을 닫을 수 있습니다.