【Colum】


プロシージャとイベントプロシージャ
 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を利用する上でも、理解しておけば何かの役に立つかもしれません。