frmMain もクラス?

 VB ユーザーが一番最初に覚えるのはフォームモジュールの使い方です。
そのフォームモジュールも、クラスモジュールと同じような性質をもっています。

たとえば、プロパティやメソッド、イベントを実装することが可能です。
オートコンプリートには、追加したインターフェイスが Form 標準のメンバに混じって表示されます。

これは、ちょっと考えると奇妙です。
Form は VB 組み込みのオブジェクトです。他のオブジェクトと同様に、そのクラスの中身を見たり改造したりすることはできません。

でもメンバの追加はできるのです。
そもそも、フォーム上にコンポーネントを貼り付けたら、それがメンバ変数(プロパティ)として取り込まれていますよね。

疑問を検証してみる

 ここで、
「frmMain はクラスなのかオブジェクトなのか?」
という疑問に移ります。

ご存じのとおり、frmMain をプロジェクトに追加したら、それがそのまま frmMain という Form オブジェクトになります。

しかし、“frmMain”をクラスとして変数の型に指定することもできます。
インスタンスをいくつも複製できるのです。

 たとえば、Form に用意したイベントを受信するためには、その Form のオブジェクト名をクラスとするプロパティ変数を持つクラスを作ります。(ややこしい)

'Main.frm
Public Event OnLoadFile(ByVal FileName As String)

Private Sub btnOpenFile_Click()
    
    'ファイルを読み込む処理
    '...
    RaiseEvent OnLoadFile(strFileName)
    
End Sub
'FormManager.cls
Option Explicit

Private WithEvents m_TargetMainForm As frmMain

Public Sub Initialize(ByRef TargetForm As frmMain)
    
    Set m_TargetMainForm = TargetForm

End Sub

Private Sub Class_Terminate()
    
    Set m_TargetMainForm = Nothing
    
End Sub

Private Sub m_TargetMainForm_OnLoadFile(ByVal FileName As String)
    
    'ファイル名をリストに登録する処理など
    '...
    
End Sub

OnLoadFile イベントは、frmMain だけに独自に実装されたイベントです。
Form ではありません。frmMain クラスから呼び出されるのです。

frmMain は、ひとつのクラスであることがわかりました。

まとめ

 ちょっとややこしい話になってしまいました。
この辺で整理してみると、
「frmMain は、Form クラスを継承したクラスである」
というひとつの答えにたどり着きます。

コードエディタで編集できることはクラスモジュールと同じです。
しかし、Form クラスは VB 組み込みのオブジェクト型であり、メンバを追加することはできません。私たちが編集しているのは、Form を継承した、Form とは別の frmMain というクラスです。

プロジェクトに Form を追加することは、Form クラスを新しく作る、ということだったのです。


 まだもうひとつ疑問が残っています。
frmMain は明らかにオブジェクトです。
これがクラスであるというのはどういうことでしょうか?

実はこの問題は、簡単に考えることができます。
“frmMain 型の、同じ名前のオブジェクトが定義されている”のです。
(Dim frmMain As frmMain)うーん。

2000年12月29日(金) 更新