*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*

VB.NET> フォーム1からフォーム2への画面遷移で、イベントを使って情報伝達をするサンプル No.2 <自作イベントの場合>


*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*


「<VB.NET> メインルーチン活用時のデーターやイベントの取り扱い <目次>」

における一連の説明(知恵ノート)において、ここでは、


「<VB.NET> フォーム1からフォーム2への画面遷移で、イベントを使って情報伝達をするサンプル No.2 <自作イベントの場合>」


について説明します。






総合の目次


本ページを含めた関連事項の総合目次です。

http://note.chiebukuro.yahoo.co.jp/detail/n333660




関連サンプル


本サンプルと関連性のあるサンプルです。
すなわち、次回と、それ以降のサンプルです。


関連サンプル1「フォーム1からフォーム2への画面遷移で、イベントを使って情報伝達をするサンプル No.1 <既存のイベントの場合>」

http://note.chiebukuro.yahoo.co.jp/detail/n333908


関連サンプル2「フォーム1からフォーム2への画面遷移で、イベントを使って情報伝達をするサンプル No.2 <自作イベントの場合>」

http://note.chiebukuro.yahoo.co.jp/detail/n333909


関連サンプル3「画面遷移で、遷移先フォームを選択可能にするサンプル」

http://note.chiebukuro.yahoo.co.jp/detail/n333910



関連サンプル4以降「メインルーチン活用時のデーターやイベント関連の各種サンプル」
関連サンプル4と、それ以降のサンプルもあります。総合目次から参照して下さい。(メインルーチン活用時のイベント関連の各種サンプルは、総合目次上で複数個あります。総合目次から参照して下さい)





はじめに


フォーム1(Form1)からフォーム2(Form2)へ画面遷移を行ないます。また、フォーム2(Form2)からフォーム3(Form3)へ画面遷移を行うサンプルプログラムを紹介します。

なお、その画面遷移の際に、遷移元フォームと遷移先フォームの間でデーター通信を行ないます。すなわち、フォーム1(Form1)で入力したデーターを、フォーム2(Form2)へ渡します。また、フォーム2(Form2)で入力したデーターを、フォーム3(Form3)へ渡します。


具体的には、遷移元フォームが閉じる際に、自分で定義したイベントを発生させます。すなわち、イベントは、既存のイベントではなく、自分で定義したイベントを活用します。その定義イベントは、以下の2点です。


<1>

遷移元フォームが閉じる際に、遷移元フォームからメインルーチンへ伝達するイベント


<2>

メインルーチンに上記イベントが発生した際に、メインルーチンから遷移先フォームへ伝達するイベント


すなわち、遷移元から遷移先への情報伝達は、メインルーチン経由で行ないます。


遷移元 ---> メインルーチン ---> 遷移先





画面遷移の概要



<画面遷移の動作上の流れ>

画面遷移では、以下の手順の動作になります。

まず、フォーム1からフォーム2を開きます。

その際、フォーム1を閉じます。



<画面遷移の問題点>

上記「画面遷移の動作上の流れ」には、問題があります。

フォーム1を閉じると、フォーム1は、メインフォーム(一番親となるフォーム)なので、アプリケーションソフト自体が終了してしまします。すなわち、フォーム2が開いているのに、アプリケーションソフト自体が終わるので、そのフォーム2は強制的に閉じられてしまします。



<問題点の対策の概要>

よって、フォーム1を閉じるときは、フォーム2をメインフォームに設定します。

すなわち、メインフォームの切り替えを行ないます。

具体的には、本サンプルのソースコードを参照して下さい。






関連サンプルと比べた特徴


下記の各種サンプルプログラムは、どれも画面遷移のイベント関連のサンプルです。ただし、イベントの扱い方が、各サンプルで異なります。詳しくは、下記に説明します。

関連サンプル1「フォーム1からフォーム2への画面遷移で、イベントを使って情報伝達をするサンプル No.1 <既存のイベントの場合>」
遷移元フォームが閉じる際に発生するFormClosedイベントを、遷移元フォームの内部だけではなく、遷移先フォームにも伝達します。そのFormClosedイベントで、遷移元フォームのデーターを遷移先フォームへ渡します。

関連サンプル2「フォーム1からフォーム2への画面遷移で、イベントを使って情報伝達をするサンプル No.2 <自作イベントの場合>」
イベントは、既存のイベントではなく、自分で定義したイベントを活用します。その定義イベントにより、遷移元から遷移先への情報伝達は、メインルーチン経由で行ないます。遷移元 ---> メインルーチン ---> 遷移先


関連サンプル3「画面遷移で、遷移先フォームを選択可能にするサンプル」
上記「関連サンプル1」と上記「関連サンプル2」は、フォーム1(Form1)の次は、フォーム2(Form2)で、フォーム2(Form2)の次は、フォーム3(Form3)と言うように、遷移先が固定で決まっています。これに対して、関連サンプル3は、遷移先を自由に選択可能にしています。なお、関連サンプル1と関連サンプル2では、関連サンプル2のほうが柔軟な構造です。よって、関連サンプル2をベースにして、関連サンプル3を作成しています。


関連サンプル4以降「メインルーチン活用時のデーターやイベント関連の各種サンプル」
上記までの各種のサンプルは、メインルーチンを活用した場合のイベント関連の基礎サンプルです。基礎範囲だけではなく、もう少し応用的なサンプルも幾つかあります。それらのサンプルは、総合目次から参照して下さい。





サンプルコード


ここで取り上げるサンプルは、なるべく複雑にならない範囲で、メインルーチンでのイベント関連を確かめられるものとします。






本サンプルの仕様概要


<1>作成したサンプルプログラムを実行すると、フォーム1(Form1)が起動します。
<2>そのフォーム1(Form1)上のテキストボックスに任意の文字列を入力し、ボタンをクリックします。そうすると、フォーム1(Form1)が閉じて、入れ替わりにフォーム2(Form2)が起動します。すなわち、フォーム1(Form1)からフォーム2(Form2)への画面遷移が行なわれます。
<3>起動したフォーム2(Form2)上のラベルには、先ほどフォーム1(Form1)で入力した文字列が表示されます。すなわち、遷移元から遷移先へデーターが渡され、遷移先で受け取ったデーターがラベルに表示されます。
<4>フォーム2(Form2)上のテキストボックスに任意の文字列を入力し、ボタンをクリックします。そうすると、フォーム2(Form2)が閉じて、入れ替わりにフォーム3(Form3)が起動します。すなわち、フォーム2(Form2)からフォーム3(Form3)への画面遷移が行なわれます。
<5>起動したフォーム3(Form3)上のラベルには、先ほどフォーム2(Form2)で入力した文字列が表示されます。すなわち、遷移元から遷移先へデーターが渡され、遷移先で受け取ったデーターがラベルに表示されます。
<6>フォーム3(Form3)上のテキストボックスに任意の文字列を入力し、ボタンをクリックします。そうすると、フォーム3(Form3)が閉じて、入れ替わりにフォーム1(Form1)が起動します。すなわち、フォーム3(Form3)からフォーム1(Form1)への画面遷移が行なわれます。
<7>以上の通り、フォーム1(Form1)--->フォーム2(Form2)--->フォーム3(Form3)--->フォーム1(Form1)--->フォーム2(Form2)--->フォーム3(Form3)と、いつまでも循環して画面遷移を続けます。よって、アプリケーションソフトを終了する時は、フォームの [ x ]ボタンをクリックします。



フォームデザイン等の前準備


コードを記述する前に、フォームのデザイン作成などの、以下の前準備を行なって下さい。


<プロジェクトの作成>
本サンプルの確認用に、新規にプロジェクトを作成して下さい。
プロジェクトの種類は、「Windowsフォームアプリケーション」です。

<メインルーチンの活用の設定>メインルーチンを活用するには、以下の設定を行なう必要があります。まず、[プロジェクト] - [<プロジェクト名>のプロパティ] で、「プロジェクトのプロパティ」画面を表示します。(なお、上記<プロジェクト名>は、プロジェクトを新規作成した時に付けた名前です)次に、その「プロジェクトのプロパティ」画面内の[アプリケーション]タブを選択します。次に、その[アプリケーション]タブの画面内における、 [ アプリケーション フレームワークを有効にする ]チェックボックスのチェックを外します。次に、同じく[アプリケーション]タブの画面内において、[スタートアップ オブジェクト]を[Sub Main]に設定します。

プロジェクトのプロパティ画面.jpg

<モジュールを書くためのソースファイルの作成>[プロジェクト] - [モジュールの追加] で、「新しい項目の追加」画面を表示する。その画面の [ファイル名]欄に任意のファイル名(モジュール用ソースファイルのファイル名)を記入する。(なお、ここではファイル名を、Program.vb とするものとします)次に、その画面内の[追加]ボタンをクリックする。なお、ここで作成されたソースファイルには、後述しますモジュールのコード(「Main()メソッド用Programモジュールのソースコード」等)を記述します。

<子フォームの追加>子ウィンドウとなるフォームを、下記操作で追加してください。[プロジェクト] - [Windows フォームの追加]で、「新しい項目の追加」画面を表示します。その「新しい項目の追加」画面で、ファイル名を入力してから[追加]ボタンを押します(取り決めたいファイル名が特に無ければ、デフォルトのファイル名で構いません)。そうすると、新しいフォーム(Form2)のデザイン画面等が追加されます。同様に、新規のフォームForm3も追加して下さい。

<クラスを書くためのソースファイルの作成>[プロジェクト] - [クラスの追加] で、「新しい項目の追加」画面を表示する。その画面の [ファイル名]欄に任意のファイル名(クラス用ソースファイルのファイル名)を記入する。[追加]ボタンをクリックする。なお、ここで作成されたソースファイルには、後述しますクラスのコード(「フォーム間伝達情報クラス」のソースコード)を記述します。

<Form1 におけるフォームのデザイン>デザイン画面で、ラベル(Label)を1個と、テキストボックス(TextBox)を1個と、ボタン(button)を1個貼り付けて下さい。 デザイン画面1.jpg


<Form1 におけるイベントプロシージャの作成>デザイン画面のフォーム(ボタン等のコントロールが貼り付いていない無地の部分)をダブルクリックすることにより、Form1_Load() メソッドを作って下さい。
次に、デザイン画面のフォームが選択された状態で、「プロパティ」画面の「イベント」ボタン(雷マークのボタン)をクリックして下さい。その「プロパティ」画面で、FormClosed と言う項目をダブルクリックして下さい。そうすると、Form1_FormClosed()メソッドが作成されます。
次に、デザイン画面で先ほど貼り付けたボタン1(button1)をダブルクリックして、button1_Click() メソッドを作って下さい。
<注意>ちなみに、デザイン画面の操作で、Form3_FormClosed()メソッドは、作成しないので、その点を注意して下さい。通常であれば、フォームのクローズ時におけるイベントプロシージャーForm3_FormClosed() は、デザイン画面とプロパティウィンドウの操作で作成します。しかし、今回のサンプルでは、Form3_FormClosed() メソッドはデザイン画面は使わず、ソースファイルにプログラマーが直接書いて作成して下さい。なお、コード記述で作成する理由は、該当イベントが、遷移元フォームで発生するイベントだからです。すなわち、遷移元フォームで発生するイベントなので、フォーム間をまたがった操作は無理です。よって、該当のイベントプロシージャーは、デザイン画面操作ではなく、コード記述で作成します。

<Form2 におけるフォームのデザイン>デザイン画面で、ラベル(Label)を1個と、テキストボックス(TextBox)を1個と、ボタン(button)を1個貼り付けて下さい。 デザイン画面2.jpg



<Form2 におけるイベントプロシージャの作成>デザイン画面のフォーム(ボタン等のコントロールが貼り付いていない無地の部分)をダブルクリックすることにより、Form2_Load() メソッドを作って下さい。
次に、デザイン画面のフォームが選択された状態で、「プロパティ」画面の「イベント」ボタン(雷マークのボタン)をクリックして下さい。その「プロパティ」画面で、FormClosed と言う項目をダブルクリックして下さい。そうすると、Form2_FormClosed()メソッドが作成されます。
次に、デザイン画面で先ほど貼り付けたボタン1(button1)をダブルクリックして、button1_Click() メソッドを作って下さい。。
<注意>ちなみに、デザイン画面の操作で、Form1_FormClosed()メソッドは、作成しないので、その点を注意して下さい。通常であれば、フォームのクローズ時におけるイベントプロシージャーForm1_FormClosed() は、デザイン画面とプロパティウィンドウの操作で作成します。しかし、今回のサンプルでは、Form1_FormClosed() メソッドはデザイン画面は使わず、ソースファイルにプログラマーが直接書いて作成して下さい。なお、コード記述で作成する理由は、該当イベントが、遷移元フォームで発生するイベントだからです。すなわち、遷移元フォームで発生するイベントなので、フォーム間をまたがった操作は無理です。よって、該当のイベントプロシージャーは、デザイン画面操作ではなく、コード記述で作成します。

<Form3 におけるフォームのデザイン>デザイン画面で、ラベル(Label)を1個と、テキストボックス(TextBox)を1個と、ボタン(button)を1個貼り付けて下さい。 デザイン画面3.jpg



<Form3 におけるイベントプロシージャの作成>デザイン画面のフォーム(ボタン等のコントロールが貼り付いていない無地の部分)をダブルクリックすることにより、Form3_Load() メソッドを作って下さい。
次に、デザイン画面のフォームが選択された状態で、「プロパティ」画面の「イベント」ボタン(雷マークのボタン)をクリックして下さい。その「プロパティ」画面で、FormClosed と言う項目をダブルクリックして下さい。そうすると、Form3_FormClosed()メソッドが作成されます。
次に、デザイン画面で先ほど貼り付けたボタン1(button1)をダブルクリックして、button1_Click() メソッドを作って下さい。。
<注意>ちなみに、デザイン画面の操作で、Form2_FormClosed()メソッドは、作成しないので、その点を注意して下さい。通常であれば、フォームのクローズ時におけるイベントプロシージャーForm2_FormClosed() は、デザイン画面とプロパティウィンドウの操作で作成します。しかし、今回のサンプルでは、Form2_FormClosed() メソッドはデザイン画面は使わず、ソースファイルにプログラマーが直接書いて作成して下さい。なお、コード記述で作成する理由は、該当イベントが、遷移元フォームで発生するイベントだからです。すなわち、遷移元フォームで発生するイベントなので、フォーム間をまたがった操作は無理です。よって、該当のイベントプロシージャーは、デザイン画面操作ではなく、コード記述で作成します。



Main()メソッド用Programモジュールのソースコード


http://note.chiebukuro.yahoo.co.jp/detail/n335112

Form1 におけるソースコード


http://note.chiebukuro.yahoo.co.jp/detail/n335113

Form2 におけるソースコード


http://note.chiebukuro.yahoo.co.jp/detail/n335114

Form3 におけるソースコード


http://note.chiebukuro.yahoo.co.jp/detail/n336293

フォーム間伝達情報クラスにおけるソースコード


http://note.chiebukuro.yahoo.co.jp/detail/n336294






コードの解説


サンプルコードの中に書かれていますコメントを読んで下さい。
すなわち、コードの解説は、基本的にサンプルコードの中に書かれているコメントとします。





実行結果


サンプルプログラムを実行し、ボタンをクリックして下さい。そうすると、画面遷移が行なわれます。



<フォーム1(Form1)関連の各種画面>

アプリケーションソフトを実行して、最初に起動するフォーム1(Form1)の画面

実行画面1.jpg

<フォーム2(Form2)関連の各種画面>

フォーム1(Form1)からフォーム2(Form2)へ画面遷移をする際の、遷移先フォーム(Form2)の画面


実行画面2.jpg


<フォーム3(Form3)関連の各種画面>

フォーム2(Form2)からフォーム3(Form3)へ画面遷移をする際の、遷移先フォーム(Form3)の画面

実行画面3.jpg


<フォーム1(Form1)関連の各種画面No.2>

フォーム3(Form3)からフォーム1(Form1)へ画面遷移をする際の、遷移先フォーム(Form1)の画面
 実行画面4.jpg





さいごに


本サンプルは、画面遷移でのデーター受け渡しにおける基礎的な範囲です。よって、総合目次から、引き続き各種サンプルを参照して下さい。