• ベストアンサー

モジュールレベルで宣言した変数の値について

WinNT4SP6 & VB6のSP4の環境です。 例えばfrmUserIDというフォームがあり、このフォームだけで有効なモジュールレベルの変数を、次のように宣言します。 Private sPassword As String 他のフォームから、このfrmUserIDフォームを開き、このfrmUserIDの中で値を設定したとします。 sPassword = "SHOW1234" Unload MeでfrmUserIDフォームを閉じて、元のフォームに戻ります。 もう一度、他のフォームからfrmUserIDフォームを開いた場合、sPasswordという変数には、先程設定した値がそのまま残っています。 私は、フォームのUnloadと共に、モジュールレベルの変数もメモリから開放されるものと考えていましたが、こういうものなんでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • mfuku
  • ベストアンサー率50% (173/345)
回答No.5

はい。そういうものなのです。 フォームのインスタンスを完全に解放しない限りメモリから解放されません。 従って、対策は、以下の2つの方法があります。 1)FormのUnloadイベントに Set 自フォーム名 = Nothing と、記述し、インスタンスを解放する。 2)FormのLoadイベントで各変数を初期化する。

showcase
質問者

お礼

変数の初期化をサボったことが間違いの元でした。 FormのUnloadイベントでインスタンスを解放する方が、1行で済むので楽ですね。 ありがとうございました。

その他の回答 (4)

  • ARC
  • ベストアンサー率46% (643/1383)
回答No.4

「こういうもの」なのでしょう。 VB5のヘルプのUnLoadの項目によれば、 メモ フォームをメモリからアンロードするときには、表示されている構成要素だけがアンロードされ、そのフォーム モジュールのコードはメモリに保持されます。 だそうです。恐らく、変数内容も同様に保持されるのでしょう。

showcase
質問者

お礼

そのようですね。 フォームのアンロードで、すべてが解放されると思い込んでいました。 変数は明示的に初期化するか、フォームを明示的にメモリから解放するのがよさそうです。 ありがとうございました。

回答No.3

フォームは明示的にメモリから解放しなければ変数の値などが残ってしまうものだったと思います。 フォームを明示的にメモリから解放するには Set フォーム名 = Nothing と記述します。 きちんと確認してないので、チョンボの可能性もあります・・・

showcase
質問者

お礼

きちんと確認できました。 フォームのアンロードで、そのフォームに関わるすべてがメモリから解放されるという誤解をしていました。 ありがとうございました。

  • yu-ji
  • ベストアンサー率19% (15/78)
回答No.2

よくわかりませんが 1つのセッション内では変数はクリアされないとか。 VBにセッションとかあるか分からないけど。。。

showcase
質問者

お礼

プロシージャレベルの変数が初期化されているので、モジュールレベルの変数もそうかな?という思い込みがありました。やはり変数は、明示的に初期化するのが、まっとうなプログラムですね。 ありがとうございました。

noname#9414
noname#9414
回答No.1

VBのことはあまり分かりませんが、フォームの 変数ってstaticではなかったですか? staticならば、プログラムが終了するまで変数の 値は保持されるのでクリアしたければ、明示的に クリアしなければなりませんよ。 とりあえずお調べください。 ではでは☆

showcase
質問者

お礼

staticがどういうことなのか解りませんが、変数の初期化をサボっちゃいけませんね。プログラムの基本でした。 ありがとうございます。

関連するQ&A