- ベストアンサー
モジュールレベルで宣言した変数の値について
WinNT4SP6 & VB6のSP4の環境です。 例えばfrmUserIDというフォームがあり、このフォームだけで有効なモジュールレベルの変数を、次のように宣言します。 Private sPassword As String 他のフォームから、このfrmUserIDフォームを開き、このfrmUserIDの中で値を設定したとします。 sPassword = "SHOW1234" Unload MeでfrmUserIDフォームを閉じて、元のフォームに戻ります。 もう一度、他のフォームからfrmUserIDフォームを開いた場合、sPasswordという変数には、先程設定した値がそのまま残っています。 私は、フォームのUnloadと共に、モジュールレベルの変数もメモリから開放されるものと考えていましたが、こういうものなんでしょうか?
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
はい。そういうものなのです。 フォームのインスタンスを完全に解放しない限りメモリから解放されません。 従って、対策は、以下の2つの方法があります。 1)FormのUnloadイベントに Set 自フォーム名 = Nothing と、記述し、インスタンスを解放する。 2)FormのLoadイベントで各変数を初期化する。
その他の回答 (4)
- ARC
- ベストアンサー率46% (643/1383)
「こういうもの」なのでしょう。 VB5のヘルプのUnLoadの項目によれば、 メモ フォームをメモリからアンロードするときには、表示されている構成要素だけがアンロードされ、そのフォーム モジュールのコードはメモリに保持されます。 だそうです。恐らく、変数内容も同様に保持されるのでしょう。
お礼
そのようですね。 フォームのアンロードで、すべてが解放されると思い込んでいました。 変数は明示的に初期化するか、フォームを明示的にメモリから解放するのがよさそうです。 ありがとうございました。
- すもあん(@ryoyama)
- ベストアンサー率56% (45/80)
フォームは明示的にメモリから解放しなければ変数の値などが残ってしまうものだったと思います。 フォームを明示的にメモリから解放するには Set フォーム名 = Nothing と記述します。 きちんと確認してないので、チョンボの可能性もあります・・・
お礼
きちんと確認できました。 フォームのアンロードで、そのフォームに関わるすべてがメモリから解放されるという誤解をしていました。 ありがとうございました。
- yu-ji
- ベストアンサー率19% (15/78)
よくわかりませんが 1つのセッション内では変数はクリアされないとか。 VBにセッションとかあるか分からないけど。。。
お礼
プロシージャレベルの変数が初期化されているので、モジュールレベルの変数もそうかな?という思い込みがありました。やはり変数は、明示的に初期化するのが、まっとうなプログラムですね。 ありがとうございました。
VBのことはあまり分かりませんが、フォームの 変数ってstaticではなかったですか? staticならば、プログラムが終了するまで変数の 値は保持されるのでクリアしたければ、明示的に クリアしなければなりませんよ。 とりあえずお調べください。 ではでは☆
お礼
staticがどういうことなのか解りませんが、変数の初期化をサボっちゃいけませんね。プログラムの基本でした。 ありがとうございます。
お礼
変数の初期化をサボったことが間違いの元でした。 FormのUnloadイベントでインスタンスを解放する方が、1行で済むので楽ですね。 ありがとうございました。