Form1とFrom2を往復(画面遷移)する方法は?


  2009-06-23 00:17:16  No: 70427

VC++をはじめて1週間程なのですが、どうしても分からない事があるので、
質問させて頂きます。

現在画面遷移に取り組んでいまして、
From1からFrom2に遷移する事は出来たのですが、
From2からFrom1に遷移する事が出来ません。
コードを記すと、

From1のコード
#include "From2.h"

~~~~~~~~~~~~~^中略~~~~~~~~~~~~~~~~~~~~~~~

From2^ frm2=gcnew From2();
frm2->Show();

と、この記述で一応From2に飛ぶ事は出来たのですが、
同様にFrom2でinclude "From1.h"と記述すると、From1の、
From2^ frm2=gcnew From2();  の部分でエラーを出してしまいます。

どういったコードを書けば、お互い相互に画面遷移できるのか、
ご教授お願いいたします。


Blue  2009-06-23 00:21:24  No: 70428

とりあえず、Form2からForm1の中身(メンバ変数とか)が必要になりますか?
必要になる場合、ヘッダファイルだけでは実現不可能です。


Blue  2009-06-23 00:29:44  No: 70429

あーだめだ、gcnewしている時点で定義が必要ですね。
ヘッダファイルと定義ファイル(*.cpp)を別々にする必要がありますね。

画面遷移ということだから、
Form1からForm2を表示したとき、Form1は消えると思うんだけど、
消えていないから兄弟関係ってわけでもない気がするけど。


Blue  2009-06-23 00:36:58  No: 70430

連投ですが、

>Form1とFrom2を往復
ということであれば、
・Form1からForm2を表示したときに、Form1を非表示に。
・Form2が閉じた時に、Form1を表示に。
ということで良ければ、
http://oshiete1.goo.ne.jp/qa4995556.html
てな感じで、Form2のFormClosedイベントをForm1で設定してあげれば、Form2は
Form1を知らなくてもできます。


  2009-06-23 00:40:47  No: 70431

説明が足りないようでした、申し訳ありません。

>>ヘッダファイルと定義ファイル(*.cpp)を別々にする必要がありますね。
これはどういった意味でしょうか?現状では実現不可能という事ですか?

>>画面遷移ということだから
現状、From1からFrom2を表示(上記コードのまま)しますと、
From1は一応出現したままです。
将来的にはthis->Close();  或いは  this->Hide();を用いて、表示されないようにしたいと思っています。


Blue  2009-06-23 00:46:12  No: 70432

>this->Close();
は不可能です。
Form2の親がForm1ですので、親が閉じられると子も閉じられてしまいます。
(Closeを考えるのであれば、Form1,Form2を管理する親(main関数でも良い)が必要)

もっと簡単にShowではなく、ShowDialogではだめなんでしょうか?

Form2 f;
this->Hide();
f.ShowDialog();
this->Show();


  2009-06-23 01:14:41  No: 70433

お手数をお掛けしてすみません。

ShowDialog()は使ってみたところかなり便利で、目標達成かと思いましたが、多少問題がありました。
システム全体としての構造として、まず最初にメニュー画面(menu)があり、
そこからFrom1へ遷移、さらにFrom1からFrom2へ遷移、といった状態なのです。
From2にはFrom1に戻るボタンと、menuへ戻るボタンを付けたいと思っております。

なお、教えて頂いた参考アドレスについては、現在取り組み中です。
私自身勉強不足なところもあり内容を理解するのに手間取っていますが、
1つの方法としてやってみたいと思います。


Blue  2009-06-23 02:12:38  No: 70434

メニューがあるのであれば、メニューで遷移させた方が妥当ではないでしょうか?

具体例
1.MyForm.hを追加
#pragma once

namespace test 
{
    public ref class MyForm : public System::Windows::Forms::Form
    {
    public:
        enum class NEXTTYPE { FORM1, FORM2, MENU };
    protected:
        NEXTTYPE NextType_;
    public:
        MyForm() : NextType_(NEXTTYPE::MENU), Form() {}
        property NEXTTYPE NextType
        {
            void set(NEXTTYPE type) { NextType_ = type; }
            NEXTTYPE get() { return NextType_; }
        }
    };
}

2.Form1,Form2の継承元をMyFormに変更(要MyForm.hのインクルード)
3.Form1のボタンの処理
    private:
        System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) 
        {
            // Form2へ
            this->NextType = NEXTTYPE::FORM2;
            this->Close();
        }
        System::Void button2_Click(System::Object^  sender, System::EventArgs^  e)
        {
            // メニューへ
            this->NextType = NEXTTYPE::MENU;
            this->Close();
        }
    };

4.Form2のボタンの処理
    private:
        System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) 
        {
            // Form1へ
            this->NextType = NEXTTYPE::FORM1;
            this->Close();
        }
        System::Void button2_Click(System::Object^  sender, System::EventArgs^  e)
        {
            // メニューへ
            this->NextType = NEXTTYPE::MENU;
            this->Close();
        }
    };

5.MenuForm(main関数でApplication::Run(gcnew MenuForm());となる)のボタンの処理
#include "Form1.h"
#include "Form2.h"



    private: 
        System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) 
        {
            MyForm::NEXTTYPE type = MyForm::NEXTTYPE::FORM1;
            // メニューを非表示に
            this->Hide();
            while (1)
            {
                MyForm^ form;
                switch (type)
                {
                case MyForm::NEXTTYPE::FORM1:  // Form1へ
                    form = gcnew Form1();
                    break;
                case MyForm::NEXTTYPE::FORM2:  // Form2へ
                    form = gcnew Form2();
                    break;
                default: // メニューへ戻る
                    form = nullptr;
                    break;
                }
                
                if (form == nullptr) {
                    break;
                }
                form->ShowDialog();
                type = form->NextType;
                delete form;
            }
            // メニューを表示
            this->Show();
        }
    };


  2009-06-23 21:49:30  No: 70435

とても丁寧な説明ありがとうございます。
現在このコードを元に作成していますが、問題が発生しました。

MyForm.hの入力は完了したのですが、
Form1の
this->NextType = NEXTTYPE::FORM2;
この部分がうまくいきません。
一応、From1のトップにMyFromをインクルード、
From1.ccpの方にもインクルードして試してみたのですが、
上記のコードのthis->で変換候補が出てきてくれません。

MyFrom^ MF = MyFrom();なども試してみたのですが、今度は
イコールから先が定義されていないと出ます。

私に何か見落としている点があるのでしょうか?


Blue  2009-06-23 22:05:07  No: 70436

>2.Form1,Form2の継承元をMyFormに変更(要MyForm.hのインクルード)
はしてありますか?

public ref class Form1 : public System::Windows::Forms::Form

public ref class Form1 : public MyForm

ってことです。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加