dポイントプレゼントキャンペーン実施中!

VB6でユーザーコントロールを作りまして、OCXにしてそれを、ある画面に数十個張り付けているのですが、メモリをたくさん食います。タスクマネージャで見ると50Mを超え、エラーがでるようです。
画面に張り付けたユーザーコントロールですが、画面を消してもメモリはあまり減らず食ったままになります。画面はちゃんとNothingしているのですが、ユーザーコントロールに使われているメモリは開放されないようです。次のことをご教授願えればおねがいいたします。
1)ユーザーコントロールOCXを動的に画面に張り付ける方法
2)デザイン画面で張り付けたユーザーコントロールOCXのメモリを開放する方法
3)メモリをあまり消費しないユーザーコントロールの作り方
その他なにかよいアドバイスがあればお願いいたします。

A 回答 (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 フォーム
をしてもユーザーコントロールだけ破棄されないんですか?

この回答への補足

>Unload フォーム
>をしてもユーザーコントロールだけ破棄されないんですか?
Unload フォームをしても、ただNothingするだけでも結果は同じなようです。Unload フォームはどの位置にいれたらいいでしょうか?
Unload フォーム
Set フォーム = Nothing
でいいですか?

補足日時:2005/04/07 09:38
    • good
    • 0
この回答へのお礼

ユーザーコントロールOCXを動的に画面に張り付ける方法がわかりました。とても参考になりました。ありがとうございました。

お礼日時:2005/04/08 09:36

せっかく書いた回答が消えた(;;)


は、いいとして。

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 してもメモリ使用量が減らないんですよね、これってユーザーコントロールのメモリが完全に開放されていないということだと思うのですが。(-~-)

補足日時:2005/04/08 09:37
    • good
    • 0

どのようなユーザーコントロールでしょうか?


オブジェクトに画像やビデオを使用していると、それだけでメモリを食いますし、Public変数を多用すると、いつまでもメモリ中に領域が確保されます。
解決策は、オブジェクトのサイズを小さくする事と、出来る限りPrivate変数を使用する事で、ある程度解決出来ると思います。

この回答への補足

ありがとうございます。インプットマンを利用したユーザーコントロールです。ユーザーコントロールにimTextやimNumberを張り付けています。

補足日時:2005/04/08 09:34
    • good
    • 0

ユーザーコントロール=メモリバカ食いには私も悩まされまして、結局 通常のコントロールに代えました。



ユーザーコントロールを貼ったフォームを、
使わなくなり次第、アンロードすると言う手はどうでしょうか、もしくは、フレックスグリッドや、
他社のOCXを買ってきて貼ると言う手くらいしか思いつかないです。

マイクロソフトのホームページで探すのも一考ですが、
答えに行き着くかは不明です。

この回答への補足

ありがとうございます。ユーザーコントロール=メモリバカ食いなんですね。了解です。

補足日時:2005/04/08 09:32
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!