• ベストアンサー

VB6のユーザーコントロールがメモリを食う

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

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

  • ベストアンサー
回答No.3

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

lord_chan
質問者

お礼

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

lord_chan
質問者

補足

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

その他の回答 (3)

回答No.4

せっかく書いた回答が消えた(;;) は、いいとして。 UnloadしてもNothingしても同じですか? Nothingで画面が消えるんですか!? どうやって画面を消してますか? Unloadのタイミングは恐らくNothingのタイミングと同じでいいです。 私はUnloadだけして、Nothingはしたことありません。 だからSet フォーム = NothingとUnload フォームを置き換える形です。 フォームをUnloadしても、その後でフォーム上のコントロールとかに何かすると勝手にロードされます。 何もしてませんか? Set フォーム = Nothing ではたぶんロードされてないような気がしますけど、どうなんだろう。 フォームを表示する前と消した後に Debug.Print Forms.Count と書いて見てください。 表示の前後で同じ数なら、フォームはきちんとUnloadされてるハズ。 きちんとUnloadされてるなら、私の考え違いですね。 余計なこと言ってごめんなさい。

lord_chan
質問者

補足

ありがとうございます。 >UnloadしてもNothingしても同じですか? 同じようですねぇ。 >どうやって画面を消してますか? 普通にUnload Me しています。 普通にUnload Me してもメモリ使用量が減らないんですよね、これってユーザーコントロールのメモリが完全に開放されていないということだと思うのですが。(-~-)

  • Kazupie
  • ベストアンサー率17% (56/323)
回答No.2

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

lord_chan
質問者

補足

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

  • VT250F
  • ベストアンサー率30% (26/84)
回答No.1

ユーザーコントロール=メモリバカ食いには私も悩まされまして、結局 通常のコントロールに代えました。 ユーザーコントロールを貼ったフォームを、 使わなくなり次第、アンロードすると言う手はどうでしょうか、もしくは、フレックスグリッドや、 他社のOCXを買ってきて貼ると言う手くらいしか思いつかないです。 マイクロソフトのホームページで探すのも一考ですが、 答えに行き着くかは不明です。

lord_chan
質問者

補足

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

関連するQ&A

  • VB.NETのユーザコントロール

    VB6.0のユーザコントロールはコンパイルすると OCXになり、レジストリに登録しないと使用できません。 VB.NETでもユーザコントロールの作成は可能だと思いますが、これはOCXではないのですよね? で、やはりレジストリに登録する必要があるのでしょうか? 単なるプロジェクトへのファイル追加だけで使えるようになればいいんですけどねー

  • VB2008でユーザーコントロールのイベントについて

    VB2008でユーザーコントロールのイベントについて 作成したユーザーコントロールを(1)フォームに配置した時のみ実行される (2)フォームを実行した時のみ実行される それぞれ処理を分けたいのですが、適切なイベントが見つかりません。 何か区分けのできる方法はあるのでしょうか? 何方か教えていただけませんか

  • vb フォームを消した後のメモリ

    こんにちは。 VB2010Express .NET4.0 趣味でプログラミングを始めた初心者です。 ものすごく初歩の事かと思うのですが ご教授いただければ幸いです 今作ってるプログラムには2つウィンドウがあり 1つのウィンドウAからもう1つのウィンドウBを開ける形です AからBを開いた時のタスクマネージャーで見たメモリは5600K Bで作業しているうちに14000Kとなりました それでBを閉じた後、つまりAだけになった時のメモリは14000Kでした Bを閉じたのにメモリが減らないのはなぜでしょうか。 関係あるのかは分からないのですがクラスBの変数の開放はやっています。

  • ユーザーコントロールのDrawToBitmap

    vb.net(VisualStudio2015)で作成したユーザーコントロール内の画面を「DrawToBitmap」で取得しフォーム内に表示したいのですが上手く表示できません。もしご存知の方がいましたらご教授して頂けますと助かります。宜しくお願い致します。 Private SecondScreen as New UserControl1 'ユーザーコントロール内の画面を取得 Dim mBitmap as New Bitmap(SecondScreen.Width,SecondScreen.Height) SecondScreen.DrawToBitmap(mBitmap,New Rectangle(0,0,SecondScreen.Width,SecondScreen.Height)) . . . '取得した画面をフォームに表示 Dim g as Graphics = e.Graphics g.DrawImage(mBitmap,new Rectangle(0,0,SecondScreen.Width,SecondScreen.Height)) いくつか省略箇所がありますが、上記の方法ですとユーザーコントロール内の画面が取得できなく、「SecondScreen.Visible=True」で一度表示させてから取得すると表示されます。 フォーム内にユーザーコントロールを張り付けて表示させるのではなく、一度「DrawToBitmap」で取得させてから表示させたいのです。 お手数ですが、ご教授お待ちしています。 宜しくお願い致します。

  • .Net ユーザーコントロールのイベント

    質問させていただきます。 環境はVB.NET2003 WindowsXPです。 あるユーザーコントロール(Form)にボタンが用意されており、そのユーザーコントロールを別のフォームAに貼り付けたとします。 この時、Aのコード内でユーザーコントロール上のボタンのClickイベントを取得する方法がございましたら、回答をよろしくお願いします。

  • VB6 ユーザーコントロールのフォーカス無効

    現在VB6 SP5にて、テンキーのようなユーザーコントロールを作成しています。 コマンドボタンを配置し、押された場合にキーボードの入力をエミュレートするような作りにしています。 問題は、作成したコントロールをフォームに貼り付けて使用する場合に、マウスでクリックしたキーに応じて、現在フォーカスのあるテキストボックスなどに入力したいのですが、ユーザーコントロールのコマンドボタンにフォーカスが移ってしまい、うまくいきません。 ユーザーコントロールのCanGetFocusプロパティをFalseに設定しようとすると、「フォーカスを取得できないコントロール上に配置された子コントロールは、フォーカスを取得することができません。」とエラーが表示されてFalseにできません。 フォーカスを無効にし、このような機能を実現するには何か良い方法ありますでしょうか?

  • VBのフォームにあるEditやButtonのコントロールIDの入力

    VB2005でフォームを作成しているのですが、 フォームに使用している、クラス名(たとえば、Button、Editなど)の コントロールIDというのは、入力できるのでしょうか? ビルドをしたときに勝手に決まってしまうものなのでしょうか? たとえば、開発画面でデザインフォーム内のButtonをクリックして、 プロパティを見ても、コントロールIDという欄が見つかりません。 できるのであれば方法をご教授お願いいたします。

  • ユーザーコントロールの参照について

    ユーザーコントロールを作成し、デザイナ上でユーザコントロールを追加した場合には、コード上でLeftプロパティなどの自身で作成したプロパティ・関数以外でも参照ができるのですが、 コード上で動的にコントロールを追加した場合、自身作成したプロパティ・関数のみしか参照ができません。 ユーザコントロールの作成時に「公開する」的なプロパティ等の設定が必要なのでしょうか? 環境は、VB6/WindowsXP です。 ご存知の方がいらっしゃいましたら、ご教授ください。

  • メモリ使用量

    VB2005.NETでデスクトップに常駐型のアプリを作ったのですが、 タスクマネージャでメモリ使用量を見てみると19,000 Kくらいになってました。 フォームに20個くらいのコントロール(テキストボックス、コンボボックス、ボタン、ラベル)があるようなアプリなんですがこんなものなのでしょうか。 軽くする方法がありましたら教えてください。 できる限り軽くしたいです。 よろしくお願いいたします。

  • メモリの解放について VB6 VBA

    VB6やVBAで動的配列をERASEしたのですが、タスクマネージャーで見ても使っているメモリを解放しているように見えません。 動的配列の内容をMsgBoxで表示させるたびにメモリがどんどん減っていきます。Eraseしても戻りません。 Redim ArryaDat(0)とかでも無理でした。 APIを使って(どんな方法)でも、メモリを解放したいのですが、可能でしょうか? Dim ArrayDat() as String Redim ArrayDat(100) ArrayDat(0) = "なんとか" ArrayDat(1) = "かんとか" ... ArrayDat(100) = "メモリを解放したい" for i = LBound(ArrayDat) to UBound(ArrayDat) MsgBox("どんどんメモリが消費されていく・・ [" & ArrayDat(i) & "]") next i Redim ArrayDat(0) Erase ArrayDat NsgBox("解放したつもり? 誰か教えて") あと、.NETではメモリ解放はどうなっているのでしょうか? まだ使いませんが、頭の片隅に入れておきたいです。

専門家に質問してみよう