§3 複数のフォーム VB6
 (4) 変数の適用範囲 U 前へ 目次へ 次へ 

 新しいプロジェクトを作成したときに用意されるフォームモジュールと同じフォームモジュールを追加することもできる。追加と削除の方法は、「(2) フォームの追加・削除方法」を参考にすること。「フォームモジュールの追加」のダイアログで“フォームモジュール”を選択する。オブジェクト名がForm2のフォームモジュールが追加される。

 2. フォーム間の変数

例3 先の例2のプログラムにフォームモジュールを1つ追加する。追加したフォーム(Form2)にラベル1つ(Label1)とコマンドボタン1つ(Command1)を配置する。
 プログラムは次の通りである。

 

・Form1のプログラムリスト

Dim a As Integer

Private Sub Command1_Click()
    a = 12345
    Label1.Caption = a
End Sub

Private Sub Command2_Click()
    Label2.Caption = a
End Sub

Private Sub Form_Load()  '←追加
    Form2.Show           '←追加
End Sub                  '←追加

 スタートアップは変更していないので、Form1から実行される。Form1_LoadプロシージャでForm2をモードレスでロードして表示している。

・Form2のプログラムリスト

Private Sub Command1_Click()
    Label1.Caption = a
End Sub
実行結果
Form1の
ボタン1をクリック
Form1の
ボタン2をクリック
Form2の
ボタン1をクリック
12345 12345 表示なし

 実行すると2つのウィンドウForm1とForm2が表示される。ここでForm1のボタン1、ボタン2、Form2のボタン1をクリックするとForm1のラベル1とラベル2には"12345"が表示されるが、Form2のラベル1には何も表示されない。
 変数aはForm1でグローバル変数として宣言されているが、Form1のモジュール内だけで有効ということである。

 Form1とForm2で共通で利用できる変数はどのようにすればよいのだろうか。


 3. フォーム間で共通の変数

例4 例3のプログラムに標準モジュールを1つ追加する。
 標準モジュールを追加するには、メニューから[プロジェクト(P)] → [標準モジュールの追加(M)]を選択すると「標準モジュールの追加」のダイアログが開く。このダイアログから「標準モジュール」を選択して追加する。

 標準モジュールのプログラムは、変数aの宣言だけである。このとき宣言にはPublicキーワードを使う。

Public As Integer

 Form1のプログラムからは、変数aの宣言(Dim a As Integer)を削除する。
 Form2のプログラムは、そのままである。

実行結果
Form1の
ボタン1をクリック
Form1の
ボタン2をクリック
Form2の
ボタン1をクリック
12345 12345 12345

 このように、標準モジュールの(General),(Declarations)でPublicキーワードを使って宣言すると、このプロジェクトの全てのモジュール(Form1, Form2, Module1)で共通の変数として利用できる。

 1つのプロジェクトは右図のように複数のモジュール(フォームモジュールや標準モジュール)を持っている。 

【注意】
 ※ 標準モジュールの(General),(Declarations)でDimキーワードを使って宣言すると、標準モジュール内だけで有効なグローバル変数となる。
 ※ Form1またはForm2の(General),(Declarations)でPublicキーワードを使って宣言すると、Form1またはForm2内だけで有効なグローバル変数となる。


 4. 同名の変数があるとき

 標準モジュールの(General),(Declarations)でPublicキーワードを使って宣言するとプロジェクト内のすべてのモジュールで共通の変数として利用できる。
 このとき、あるモジュール内で同じ名前の変数を宣言すると、その変数はどのように扱われるのかを調べてみる。

ケース1 例4のプログラムを利用して、Form1の(General),(Declarations)に Dim a As Integer を追加する。
実行結果
Form1の
ボタン1をクリック
Form1の
ボタン2をクリック
Form2の
ボタン1をクリック
12345 12345 0
 プロジェクト全体で利用できる変数aとForm1全体で利用できる変数aが存在するが、Form1内ではForm1で宣言した変数aが使われる。Form2内では標準モジュールで宣言した変数aが使われるので、Integer型の初期値である0が表示される。
 同じように、Form1ではなく、Form2に宣言を追加した場合も結果は同じになる。Form1内では標準モジュールで宣言した変数aが使われ、Form2内ではForm2で宣言した変数aが使われる。
ケース2 例4のプログラムを利用して、Form1のCommand1_ClickサブプロシージャにDim a As Integer を追加する。
実行結果
Form1の
ボタン1をクリック
Form1の
ボタン2をクリック
Form2の
ボタン1をクリック
12345 0 0
 Form1のCommand1_Clickサブプロシージャ内の変数aはこのプロシージャ内だけで有効なローカル変数となり、Form1のCommand_ClickサブプロシージャとForm2のCommand1_Clickサブプロシージャ内の変数aは標準モジュールで宣言した変数aが使われる。
 同じように、サブプロシージャ内に宣言を追加した場合、次のようになる。
 ・Form1のCommand2_Clickサブプロシージャに宣言を追加
Form1の
ボタン1をクリック
Form1の
ボタン2をクリック
Form2の
ボタン1をクリック
12345 0 12345
 ・Form2のCommand1_Clickサブプロシージャに宣言を追加
Form1の
ボタン1をクリック
Form1の
ボタン2をクリック
Form2の
ボタン1をクリック
12345 12345 0

 このように、1つのプロジェクト内で同じ変数名を使うときは注意をしなければならない。なるべく、グローバル変数と同じ変数名のローカル変数を使わないようにする方がよい。
 例えば、グローバル変数は英大文字で宣言する、あるいは変数名の先頭に"g"を付ける、など自分でルールを決めておくとよい。


 (4) 変数の適用範囲 U 前へ 目次へ 次へ 
Copyright © 2002 Hiroshi Masuda 

 

 

inserted by FC2 system