前述したように、クラス・ライブラリのFormクラスを使用するように書き換えたプログラムでは、Showメソッドの呼び出しによりウィンドウが表示されますが、そのウィンドウはすぐに消えてしまい、プログラム自体も終了してしまいます。これは、Windowsアプリケーションの心臓部分ともいえる処理が抜けているためです。
たいていのWindowsアプリケーションは、起動直後は何もせずに止まっているように見えますが、実際にはユーザーによりキーが押されたり、マウスでクリックされたりするのをじっと待っています。そしてユーザーがキーを入力したり、マウスでウィンドウをクリックしたりした場合には、その情報が「メッセージ」としてアプリケーションに送られます。
Windowsアプリケーションは、受け取ったメッセージを1つずつ処理します(最終的には、各メッセージに対応した特定のメソッドが呼び出されることになります)。すべてのメッセージを処理し終えると、また次のメッセージが来るのを待ちます。
このような、メッセージを待ち、メッセージを受け取ったらそれを適切に処理し、次のメッセージを待つ、という一連の動作は、Windows用語で「メッセージ・ループ」と呼ばれています。これがWindowsアプリケーションの心臓部ともいえる処理です。
クラス・ライブラリには、このメッセージ・ループを行ってくれるメソッドが用意されています。これはApplicationクラスのRunメソッドです。Applicationクラスは、Formクラスと同様にSystem.Windows.Forms名前空間に含まれています。
■Application.Runメソッドで実装されているメッセージ・ループ
メッセージ・ループについて少し詳しく説明しましたが、プログラムでは、次のようにしてメソッドの最後にApplicationクラスのRunメソッドの呼び出しを記述すればよいだけです。メソッドのパラメータには、メッセージ・ループが必要となるFormオブジェクトを指定します。
これで表示されたウィンドウは立派にWindowsアプリケーションとして機能します。表示されたウィンドウのタイトルバー部分をドラッグしてウィンドウを移動できるのは、マウスのクリック・メッセージと、マウスの移動メッセージが(メッセージ・ループによって)適切に処理されているためです。
Application.Run(myForm1)の呼び出しは、内部でメッセージ・ループを実行していますので、コード上は、この行で処理が停止していることになります。ウィンドウを閉じる操作を行うと、このループは終了し、それ以降は何も処理を記述していないので、プログラムは終了します。
ところで、
Application.Run(myForm1);
という記述は、Applicationオブジェクトに対してRunメソッドを呼び出しているように見えますが、そのようなオブジェクトはどこにも生成していません。実際「Application」はオブジェクトではなく、単なるクラス名です。
オブジェクトではなくクラス名を指定して、このようにメソッドが呼び出せるのは、ApplicationクラスのRunメソッドが「静的メソッド」であるためです。次に、この静的メソッドについて解説します。
静的メソッド(VB.NETでは「共有メソッド」とも呼ばれます)については、本連載第2回のプログラムの実行時に呼び出されるMainメソッドでも少し触れましたが、クラス内でメソッドを定義するときに、static(VB.NETではShared)を付けたものです。
恐らく、ApplicationクラスのRunメソッドの定義は、次のようになっているものと思われます(ここではnamespaceキーワードにより、クラスの名前空間も指定してみました。クラス・ライブラリの多くのクラスは、C#により記述されているらしいです)。
namespace System.Windows.Forms
{
……
public sealed class Application
{
……
public static void Run(Form form)
{
……メッセージ・ループ……
}
……
}
}
このようにして定義された静的メソッドは、そのクラスのインスタンスを作成せずに呼び出すことができます。呼び出しは、「Application.Run(myForm1)」のように、クラス名とメソッド名をドット(.)でつなげて記述します。
静的メソッドに対して、staticなどの付かない通常のメソッドは、インスタンスに対してのみ呼び出し可能であるため「インスタンス・メソッド」と呼ばれることがあります。
インスタンス・メソッドと静的メソッドの違いが初心者にとってはけっこうややこしいので次にまとめてみます。
Copyright© Digital Advantage Corp. All Rights Reserved.