Visual Basicにおける関数、プロシージャ、イベントプロシージャについて その役割や違いについて述べています。
(関数とプロシージャ)
Visual Basicの標準関数は、そもそもユーザー定義のプロシージャに近いものです。言い換え れば、Visual Basicですでに定義されているグローバルなプロシージャというようになるでしょうか。 例えば、CInt関数は、CInt(55.6) = 55のように()内の数値を整数に変換する 関数ですが、これには、内部で、この処理をするためのコードがあって、 そこで変換しています。つまり、一般のユーザー定義のプロシージャと同じだ けど、そのコードがユーザーに見えない形になっているだけなのです。
そして、ユーザー定義のプロシージャは、「一連の関数や命令の集まり」の ようにとらえられますが、このプロシージャもプロシージャの集まりでできて いると言った方がいいかもしれません。
(イベントプロシージャ)
では、イベントプロシージャは、どうでしょうか?
イベントというのは、ユーザーの動作や操作(マウスを動かした、とか右クリ ックした)のことをいいます。そのときに実行される一連の関数や命令にあた るプロシージャをイベントプロシージャといいます。しかし、これは上述の関数 ではありません。
例えば、MouseMoveというのは、「マウスを動かした」というイベントに対 するプロシージャですが、これは明らかにメッセージです。関数であれ、 プロシージャであれ、実行するときにはそれぞれ関数名,プロシージャ名を 指定します。だけど、MouseMoveというプロシージャは、基本的にいつでもど こでも呼び出すというというわけにはいきません。通常マウスが移動したとき にのみ勝手に呼び出される(無理矢理呼び出すことも可能)わけで、 プログラマーが呼び出すコードを記述するわけではありません。ユーザーの 操作、つまりメッセージ=プロシージャ名になっているため、 とてもややこしいものとなっています。(正確には、Visual Basicではメッセージ という概念はありません)
C言語レベルでは、次のようなコードとなっています。
C言語レベルのメッセージの受け取り方の例
LPARAM CALLBACK MainWndProc(HWND hWnd,UINT message,WPARAM
wParam,LPARAM lParam)
{
//様々なメッセージに対する処理
switch (message) {
//特にユーザーのコマンド操作によるメッセージ
case WM_COMMAND:
//ダイアログボックスのOKボタンが押されたとき
if (wParam == ID_OK){
/*ここのコードがVBのCommand_Clickなどの
プロシージャに当たる*/
return TRUE;
//ダイアログボックスのCANCELボタンが押されたとき
}else if (wParam == ID_CANCEL) {
DestroyWindow(hWnd);
return TRUE;
}
:
:
:
}
return 0;
}
C言語では、Visual Basicでいうプロシージャのことをひっくるめて「関数」として います。また、イベントは、「メッセージ」であり、その「メッセージ」に対 する処理は1つの関数(上記)の中で実行されます。Visual Basicのイベントプロシージャは、 その関数の中にある、一連の処理に当たります。 このようにVisual Basic自体が、送られてきたメッセージに対するプロシージャの 受け渡し役をしているわけです。
こうやって見ていくと、名前は似ているもののユーザー定義のプロシージャ とイベントプロシージャの役目がかなり違うことがわかります。前者は、 むしろVisual Basic標準関数の方に近いのです。
イベントとかメッセージというものは、Window プログラミングの土台の 部分です。Visual Basicを利用する上でも、理解しておけば何かの役に立つかもしれません。