2017-02-22 12 views
0

私はまだvclフォームでC++を勉強していますので、私が尋ねることがわかりやすい場合は私を許してください。参考までに、私はWindows環境でC++ builder 10.1 berlinを使用しています。C++ with vcl:クローズセカンダリフォームはプロセスを終了しません

私は2つのフォーム( "MainForm"と "BackupForm"と呼ぶ)を持つプログラムを持っています。私はMainFormでユーザー入力を受け入れています。次に、ユーザーが特定のボタン(DoSomething)をクリックすると、そのアクションがいくつかの変数を設定すると、BackupForm->Show();を呼び出して、MainForm->Hide();を呼び出してより多くのことを行う2番目のフォームに切り替えます。

問題は、ユーザーが通常はプログラムを閉じる右上の「X」をクリックすると、BackupFormが閉じられ、プロセスが終了しないという問題です。 MainFormで同じアクションを実行すると、プロセスは終了します。

私は周りを見回し、正しい質問をしていない人はいませんが、私はこの問題を抱えています。あるいは、フォームを切り替えるために隠れている/表示しているのが正しい方法ではありません。これは:

TLDR:方法/方法/等がありますか?セカンダリフォームで「閉じるウィンドウ」ボタンが押されたことを検出し、その後アプリケーションを終了し、タスクマネージャでそのアプリケーションを終了させることなくプロセスを終了しますか?

私が気づいていないフォームを切り替えるには、より良い方法がある場合は、その目的のための提案も気にしません。

また、必要に応じてさらにコードを投稿することができますが、実際に何が役立つかはわかりませんでした。以下は、私が持っているものの一部です:

メイン(機能用途?)私のIDEによって事前に生成された: "MainFormを" に押され

#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(); 
} 

答えて

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(); 
    } 
    
  • だけApplication->Terminate()直接:助けを

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

ありがとう!何らかの理由で、2つの 'FormClose'メソッドを自分のコードで追加することはできませんでしたが、' ShowModal'の2番目の解決策はうまくいくように見えました。 – RisaAudr

+0

'FormClose()'メソッドをコードに追加するだけでは不十分です。実際にそれらを 'OnClose'イベントに割り当てる必要があります。正しく使用するとうまく動作します。 –

+0

FormCloseメソッドをOnCloseイベントにどのように割り当てますか?私はそうする方法のドキュメントを見つけるのに苦労しています... – RisaAudr

0

それは正常な動作です。両方のフォームは自動的に作成されるので、2番目のフォームを閉じるとアプリケーションは終了しません。メインフォームはまだ生きています。 これはいくつかの方法で解決できます。ここでは簡単です:

は、モーダルとして第二の形式を表示:

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

それはモーダルフォームとして示されているため、BackupFormは「フルコントロール」を持っています。 BackupFormを閉じた後、メインフォームを再度表示するか(上記の例のように)、メインフォームを閉じることができます。

関連する問題