• ベストアンサー
  • 暇なときにでも

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

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

共感・応援の気持ちを伝えよう!

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

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

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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

その他の回答 (4)

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

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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

  • 回答No.3
  • ryoyama
  • ベストアンサー率56% (45/80)

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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

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

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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

  • 回答No.1
noname#9414
noname#9414

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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

関連するQ&A

  • 標準モジュールにpublicで宣言するしかない?

    フォームモジュールと標準モジュールで同じ変数を使って値を行き来したい場合、 標準モジュールにpublicで宣言するしかないのでしょうか? 【フォームモジュール】 Private Sub cmd_コマンド0_Click() test = "aaa" Call 標準モジュールtest End Sub 【標準モジュール】 Public test As String Sub 標準モジュールtest() MsgBox test End Sub でいいのですか?

  • Vb.netのグローバル変数の宣言の仕方の質問

    こんばんわ! VB6.0からの移行でVB.net2012に挑戦中なんですが、グローバル変数の宣言の仕方で分からないことがあり質問しに着ました! 内容 モジュール内で public hoge as string="aaa" と宣言するのと モジュール内で public hoge as string と宣言しておいて フォーム起動時に hoge="aaa" と宣言するのにどのような違いがあるのでしょうか? hogeの変数を変更したいのですが、上記の方法だと動いて、下記の方法だと動かないのですが・・・ まだ良く分かっていないので、程度の低い質問で申し訳ないのですが、アドバイスのほどよろしくお願いいたします。

  • VB.NETで変数の宣言が上手くできません

    VB.NETで変数の宣言が上手くできません プロパティを使用し、変数の内容を一括保存しようと考えています その為に以下のようなコードを書いたのですが他のフォームから宣言されていないとなってしまいます 修正点を教えて頂けると嬉しいです Setting.vb Pubic class Settings Public dbdirectry As String Public flistpass As String Public Property flist () As String Get Return flistpass End Get Set (Byval Value As String) flistpass = Value End Set End Property もう一つflist () をdbdic ()に flistpassをdbdirectryにしたもの End Class この変数2つに他のフォームMainForm1.vbとDefaultSetting.vbなどからflistpass = Newflistpassなどと記述するとアクセス出来ず宣言していない扱いになります Publicでの宣言で大丈夫だと思ったのですが間違えているのでしょうか?

  • VBA モジュールで共通に使う変数の宣言方法

    VBAにてプログラミングを覚えている者です。 現在、いくつかのモジュールがあり、それぞれDimにて宣言している共通の変数があります。 いくつものプロシージャに毎回宣言せず、どこかでひとまとめにしたいと思い、色々と調べています。 例えば、 Dim pic1 As Picture Dim cell1 As String Dim pass1 As String Dim pic2 As Picture などです。 Dimのほかに、Publicの宣言などがありますが、いま一つ使い方がピンときません。 共通宣言する変数をひとつのモジュールとして登録し、活用できると、いざ変更となったときに その内容だけ置き換えればいいと思うのですが、みなさんはどのように宣言をしていますか? (例えば、Stringなどは各モジュールで変更するのが大変だと思うのですが・・・) ヒントを教えていただければと思います。よろしくお願いします。

  • VB2010で、変数の宣言がわかりません。

    VB2010で、変数の宣言がわかりません。 Option Explicit Public i, j, k, l As Long Public ii, jj, kk, ll As Long Public lngFileSuu As Long Public strTemp As String ・ ・ ・ と標準モジュールに宣言すると エラーがでています。 VB6.0とは宣言方法が違うのでしょうか? 教えてください。よろしくお願いします。

  • VBA モジュールレベル・パブリックレベルの変数

    Excel VBAにおいて(他のプログラミングにも通じることでしょうが)、変数は可能な限り、プロシージャレベルを使うようにしています。 やはり上手な人は、プロシージャレベルの変数を中心に使い、モジュールレベルやパブリックレベルの変数はあまり使わないものでしょうか。 モジュールレベル・パブリックレベルの変数って、一番上に沢山書いていくと、プロシージャを記述するスペースを下に追いやってしまい、ソースが見苦しくなる気がします。上手な人は、そういうモジュールレベル・パブリックレベルの変数をいたずらに増やさないようにする、良い方法とかを持っているのでしょうか?それとも、上手な人でも、モジュールレベル・パブリックレベルの変数は、多くなる時は物凄く多くなったりするのでしょうか?

  • VBでグローバル変数を宣言するには

    VB初心者ですが。クイズゲームのようなものを作成したいと考えてます。 Private Sub ~ End Sub の中で宣言した変数って他のところに呼び出したり(戻り値として渡す)出来るのでしょうか? どこでも、いつでも呼び足せるグローバル変数の宣言とはどのようにやるのか、具体的に教えていただけないでしょうか?

  • VBでのモジュールの使い方

    フォーム1でデータベースから取得した値を変数に格納し、それをフォーム2で表示、更新をしたいのですが、モジュールを使うを便利だと聞いたのですが、具体的にはどうすればよろしいのでしょうか? モジュールで変数を普通に宣言し、フォーム1、フォーム2で同じ宣言をし、利用しようと思ったのですが、やはり、フォーム2のほうでは認識してくれませんでした。 どうぞ宜しくお願い致します。

  • アクセス97 モジュール 変数について

    変数について不明な点があります。 Public A As String Public B As String とモジュールの最上段に 宣言しました strSQL = strSQL & ",備考1 ='" & pfncReplaceString1(A, "'", "''") & "'" strSQL = strSQL & ",備考2 ='" & pfncReplaceString2(B, "'", "''") & "'" この時点では AとBにはそれぞれ値が入っているのですが pfncReplaceString1とpfncReplaceString2に飛んだ時にBの方は""(何も入っていない状態)になっています。 何が違いがあるのでしょうか? 変数に値が入っていたのに消えてしまう 状態です。

  • 標準モジュールについてなのですが

    すみません。教えてください(/_;)VB6にて理解できないことがあります。いくつものパスを標準モジュールに記述できると知り、早速見やすいプログラムにしようと思い、標準モジュールを追加しました。サンプルなどを調べ、Function Apath() as stringを理解しました。フォームの方にはpath = Apathって書いておけばいいと書かれていたのでその通りにしました。しかし、見に行ってはくれません(>_<)で、いろいろやってみてあることに気づきました。変数を宣言してたら、ダメでしてなかったらちゃんと見に行ってくれます。 Dim path as string,Dim Apath as string.Apathを消すと働いてくれます。宣言が間違っているのでしょうか?標準モジュールをこのような感じで利用するには何か重大なルールがあるのでしょうか?すいません、初心者すぎる質問で<(_ _)>しかし、聞かぬは一生の恥と思い質問しました(>_<)よろしくお願いいたします<(_ _)>