カテゴリー
VB6

フォームはグローバル変数

VB6の落とし穴ですね。
フォームをインスタンス化せずに使うとややこしい事態にはまる場合があります。

VB6の場合、フォームをインスタンス化せずとも呼び出すことが出来ます。
Form1.Show
みたいな感じです。
.NETだと
Dim frm as New Form1
frm.Show
というようにNewでインスタンスを作成して操作する形になります。
このVB特有のForm1.Showとい書き方はフォームと同じ名前で暗黙的にグローバルな変数が勝手に作られている為に可能となっています。
ここで、勘違いしやすいのが、Unload命令です。
Unloadするとフォームのメモリはすべて消えてしまうと思われがちですが、全然違います。
Unloadはフォームの一覧を管理しているFormsコレクションから指定したフォームを削除するという意味で、フォームのインスタンスを破棄するということとは全く別の意味です。
ですから、仮にForm1にPrivateな変数がある場合で、Form1.Showという書き方でフォームを呼び出した場合、UnloadでForm1の内容がすべてクリアされると勘違いしていると、次に同じようにForm1.Showで開いてPrivate変数を見た時に、前回の値が保持されたままなので面食らうはずです。
こうならないための対策としては
A.フォームはすべてインスタンス化して使用する
B.Private変数を初期化するルーチンを必ず用意して、必ずそれを実行するようにする。
C.フォームを閉じる際に暗黙的グローバル変数をNothingする
などが考えられます。
A.は
Dim frm as Form1
Set frm = New Form1
frm.Show
という感じで必ず呼び出すということです。
これが一番確実です。暗黙的なオブジェクトなんて使わない方が間違いが少なくて良いでしょう。
B.はフォームに初期化関数を用意するということですが、忘れたりさぼったりするのは目に見えるので、あまり意味がないかもしれません。
C.はFormをUnloadする所などで
Set Form1 = Nothing
などとするということです。暗黙的なグローバル変数を一度クリアしてしまうわけです。
でも、やっぱり忘れるでしょうね。
一応、いろんなパターンを考えましたが、インスタンス化して使用するA.が一番良いようです。
今まで、インスタンス化して使用した方が良いというのは聞いてはいましたが、今日罠にはまって理由が分かりました(#^.^#)

この記事を書いた人: A-tak

A-tak.com(えいたっく どっとこむ)の管理人。
Apple野郎なおっさんでしたが、Windowsに出戻り。最近はまっているのはハンターカブというバイクとBlackmagic Pocket Cinemaでの動画撮影です。
A-tak.comは2002年2月から運営(前身のサイトは1999年3月から)。今年で20年!

Youtube / Twitter