- ベストアンサー
VB6のユーザーコントロールがメモリを食う
VB6でユーザーコントロールを作りまして、OCXにしてそれを、ある画面に数十個張り付けているのですが、メモリをたくさん食います。タスクマネージャで見ると50Mを超え、エラーがでるようです。 画面に張り付けたユーザーコントロールですが、画面を消してもメモリはあまり減らず食ったままになります。画面はちゃんとNothingしているのですが、ユーザーコントロールに使われているメモリは開放されないようです。次のことをご教授願えればおねがいいたします。 1)ユーザーコントロールOCXを動的に画面に張り付ける方法 2)デザイン画面で張り付けたユーザーコントロールOCXのメモリを開放する方法 3)メモリをあまり消費しないユーザーコントロールの作り方 その他なにかよいアドバイスがあればお願いいたします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>1)ユーザーコントロールOCXを動的に画面に張り付ける方法 予め1つだけユーザーコントロールを貼り付けて、Indexに0を入れておく(=コントロール配列にする)。 Form_Loadで必要なだけロードして、位置を移動しておく。 (数十個あると位置を移動っていうのが面倒そう。) With Text1 Load .Item(.UBound + 1) With .Item(.UBound) .Visible = True .Left = 100 '←位置。 .Top = 100 '位置。 End With End With >2)ユーザーコントロールOCXのメモリを開放する方法 デザイン画面で貼り付けておいたコントロールはたぶん解放できないです。 Form_Unloadで、最初に貼り付けておいたコントロール以外を削除する。 Private Sub Form_Unload(Cancel As Integer) Dim i As Integer With Text1 For i = .LBound + 1 To .UBound '1つを残して開放 Unload .Item(.UBound) Next End With End Sub ところで。 >画面はちゃんとNothingしているのですが、 Unload フォーム をしてもユーザーコントロールだけ破棄されないんですか?
その他の回答 (3)
- pen_pen_pen
- ベストアンサー率65% (52/79)
せっかく書いた回答が消えた(;;) は、いいとして。 UnloadしてもNothingしても同じですか? Nothingで画面が消えるんですか!? どうやって画面を消してますか? Unloadのタイミングは恐らくNothingのタイミングと同じでいいです。 私はUnloadだけして、Nothingはしたことありません。 だからSet フォーム = NothingとUnload フォームを置き換える形です。 フォームをUnloadしても、その後でフォーム上のコントロールとかに何かすると勝手にロードされます。 何もしてませんか? Set フォーム = Nothing ではたぶんロードされてないような気がしますけど、どうなんだろう。 フォームを表示する前と消した後に Debug.Print Forms.Count と書いて見てください。 表示の前後で同じ数なら、フォームはきちんとUnloadされてるハズ。 きちんとUnloadされてるなら、私の考え違いですね。 余計なこと言ってごめんなさい。
補足
ありがとうございます。 >UnloadしてもNothingしても同じですか? 同じようですねぇ。 >どうやって画面を消してますか? 普通にUnload Me しています。 普通にUnload Me してもメモリ使用量が減らないんですよね、これってユーザーコントロールのメモリが完全に開放されていないということだと思うのですが。(-~-)
- Kazupie
- ベストアンサー率17% (56/323)
どのようなユーザーコントロールでしょうか? オブジェクトに画像やビデオを使用していると、それだけでメモリを食いますし、Public変数を多用すると、いつまでもメモリ中に領域が確保されます。 解決策は、オブジェクトのサイズを小さくする事と、出来る限りPrivate変数を使用する事で、ある程度解決出来ると思います。
補足
ありがとうございます。インプットマンを利用したユーザーコントロールです。ユーザーコントロールにimTextやimNumberを張り付けています。
- VT250F
- ベストアンサー率30% (26/84)
ユーザーコントロール=メモリバカ食いには私も悩まされまして、結局 通常のコントロールに代えました。 ユーザーコントロールを貼ったフォームを、 使わなくなり次第、アンロードすると言う手はどうでしょうか、もしくは、フレックスグリッドや、 他社のOCXを買ってきて貼ると言う手くらいしか思いつかないです。 マイクロソフトのホームページで探すのも一考ですが、 答えに行き着くかは不明です。
補足
ありがとうございます。ユーザーコントロール=メモリバカ食いなんですね。了解です。
お礼
ユーザーコントロールOCXを動的に画面に張り付ける方法がわかりました。とても参考になりました。ありがとうございました。
補足
>Unload フォーム >をしてもユーザーコントロールだけ破棄されないんですか? Unload フォームをしても、ただNothingするだけでも結果は同じなようです。Unload フォームはどの位置にいれたらいいでしょうか? Unload フォーム Set フォーム = Nothing でいいですか?