変数の適用範囲

・丁半さいころゲーム(掛け金の累計を表示)

これまでの内容がきちんと分かっている人は、ちょっと難しいかもしれないけど、是非知っていて欲しい内容です。
知っていると例えばC言語などの別のプログラムでも非常に役に立つ「ジェネラルプロシージャと変数の適用範囲」について、簡単な説明を記しておきます。但し、申し訳ありませんが、詳細、具体例などについては割愛しますので、参考書などを参照してください。説明を読み、自分できちんと理解するという練習にもなるはずです。
なお、わからい部分があれば是非聞いてください。

○変数の適用範囲 #VB2015用に大幅修正しました!

複数のプロシージャを組み合わせて利用した場合、変数の使い方に注意する必要がある。
プロシージャとは、一つのプログラムであり、簡単な例で言うと、一つのあるボタンに書けるプログラムを一つのプロシージャと呼ぶ。よって、ボタンが二つあって、各々にプログラムを各場合は、プロシージャが二つあることになる。

例えば、あるプロシージャで利用する変数は、実は他のプロシージャでは利用できない。
つまり、折角計算し記憶した変数の内容が、別のプロシージャでは利用できないということで非常に不便な場合がある。一方で各プロシージャ内で他のプロシージャを全く気にすることなく独自にプログラムを作成できるという大きなメリットがある。このように変数は、利用できる範囲があり、これを適用範囲、スコープと呼ぶ。

例えば、ボタン1で宣言した変数は、ボタン2では参照など利用できない。一方両方で同じ名前の変数xを宣言したとしても、名前は同じだがお互いは全く無関係である。

また、例えばボタン1で、Dim xと宣言し、x=x+1というプログラムをしたとしても、ボタン1をクリックするたびに、変数xは宣言しなおされて初期化されてしまうので、ボタンを押すたびにxは次々と増えてはくれない。
このことは、例えば、賭けをするプログラムにおいて、自分の所持金を持ち越すことができないことを意味する。

所持金は、どのプロシージャでも利用できると嬉しい。このように複数のプロシージャ(ボタンなど)で共通に使いたい方法について説明する。

まず、全てのプロシージャで共通に使いたい変数を、「xxx」という変数名だとする。
通常変数は、プロシージャ内で「Dim xxx」などのように宣言するが、まずはこれをしないようにする。
代わりに、別の場所で宣言する。

一般的にグローバル変数と呼ばれることが多いが、「プロジェクトの内側と外側の任意の場所」をスコープ範囲とする変数の宣言方法は、

プロシージャの外側で、
Public xxx
などのように宣言する。

プロシージャの外側とは、例えば
「Public Class Form1」 と 「Private Sub Button1_Click(……」 の間である。
つまり、ボタン1のプログラムの上に書いてしまう。

上記のように宣言されたパブリック変数xxxは、ボタン1でもボタン2でも、その他どこからでも使える。

 

○イベントプロシージャ

今まで作成してきたプロシージャは、ボタンのClickイベントプロシージャと呼ばれるものである。
つまりボタンがクリックされた際に動作するプログラム(プロシージャ)である。
イベントはオブジェクトによって色々なあり、クリックされる以外にも、Changeイベントなど多々ある。

この授業では、基本的にボタンのクリックイベントプロシージャのみを使ってきたが、もう一つだけ、利用できそうなイベントプロシージャがある。

それは、「Form Load イベントプロシージャ」である。これは、プログラム実行された時に動くプロシージャである。今まではプログラムを動かした上で、ボタンをクリックして初めてプロシージャが実行されたが、これはプログラムを動かした時に実行される。
よって、例えば、初期値の設定などに使える。

Public変数を使った場合、その変数に初期値を設定したい場合、ボタン1のプロシージャで例えば xxx = 100 と書いてしまうと、ボタン1を押すたびに初期化され100に戻ってしまう。初期化は一度だけで、ボタンを押しても初期化されないようにしたい場合は、このForm_Loadイベントプロシージャを使うとよい。

Form_Loadイベントプロシージャは、デザイン画面において、今まではボタンをダブルクリックしていたが、ボタンなどがないフォーム部分をダブルクリックすれば、プログラムを記述できるようになる。「Private Sub Form1_Load(sender……」「End Sub」が表示され、この間にプログラムを書いていくことになる。

 

なお、このようなイベントプロシージャの他に、ジェネラルプロシージャというものが存在し、他のC言語などの多くでは「関数」や「サブルーチン」などと呼ばれるものに対応する。少し本格的なプログラムを作成しようとすると、関数、つまりVBでいうジェネラルプロシージャは、非常に重要となる。
イベントプロシージャと違ってジェネラルプロシージャは、ユーザの何らかのアクションによって実行されるのではなく、プログラマが通常のプログラムの中で利用するものである。
ジェネラルプロシージャは、いわゆる下請け工場のようなもので、同じような処理を何回もしたいような場合などに利用し、プログラムから適宜呼び出して利用することができる。また、プログラムが長くなると間違いやすく、また分かりにくくなり、ジェネラルプロシージャを利用することにより、これらを解消することもできる。

VBにおけるジェネラルには、Subプロシージャと、Functionプロシージャの二つの種類がある。

詳細などについては参考書などを参照してください。

 

★丁半さいころゲームへの応用具体例(持ち点の繰り越し)


[「C班」プログラミング基礎のTopに戻る]