cancel
Showing results for 
Search instead for 
Did you mean: 

CrystalReportViewer の表示を何度も繰り返すと、Windowsの「メモリ不足エラー」が発生する。

Former Member
0 Kudos

お世話になっております。

標題の事象について質問させていただきます。

<環境>

Crystal Report XI Release2(WinForm/ver.11.5.8.826)

Visual Basic.NET 2005(Visual Studio.NET 2005 SP1)

Oracle 10g(ver.10.2.0.1.0)

<再現手順>

1)以下のようなOracleのテーブルA(レコード数 1,000件)を元にレポートを作成しました。

 (dummy.rpt / 全ての項目を横一列に並べて1ページ 20 行出力する)

 テーブルA

  キー1 NUMBER(5,0)

  項目1 VARCHAR2(32)

  項目2 VARCHAR2(32)

  項目3 VARCHAR2(32)

  項目4 VARCHAR2(32)

  項目5 VARCHAR2(32)

2)Visual Basic の Form オブジェクトを2つ(Form1とForm2)作成し、

 Form1にコマンドボタン、Form2にCrystalReportViewerオブジェクトを配置します。

 Form1から起動し、Form1のコマンドボタンをクリックするとForm2が表示(Form2.ShowDialog)され、

 先のdummy.rptをプレビューするプログラムです。

3)2のプログラムを起動し、Form1を起動したまま

 Form2を表示するu2192レポートをプレビューするu2192Form2を閉じる を繰り返していると、

 Windowsの「メモリ不足エラー」が発生します。

Windows のタスクマネージャを起動してメモリ状況を確認しながら同現象を発生させると、

どうやら Form1 が終了するまで、Form2 で表示した時のメモリが解放されずにどんどん

蓄積されているようです。

Form2 の Dispose 時に、 CrystalReportViewer の Dispose()をしてみましたが

現象は変わりません。

Form2 の終了時点で CrystalReportViewer のメモリを解放するには、どうすればいいでしょうか?

ご教示 願います。

以上、よろしくお願いします。

Accepted Solutions (1)

Accepted Solutions (1)

former_member583013
Active Contributor
0 Kudos

ReportSource プロパティでレポートをどのように指定していますか。

毎回同じレポートとは考えにくいので、Form1 側で ReportDocument オブジェクトを生成しているか、Form2 側の Load のタイミングで ReportSource を指定していますよね?

Former Member
0 Kudos

ご指摘ありがとうございます。

レポートの指定は、Form1 側のコマンドボタンクリック時に

private 変数 で ReportDocument オブジェクトを生成してレポートファイルをLoadし、

Form2 側の CrystalReportViewer.ReportSource オブジェクトに代入しています。

この Form1側の private 変数はコマンドボタン処理のFinallyで、

また、Form2側のReportSource オブジェクトはForm2.Dispose 時にそれぞれ Dispose しています。

ReportSource オブジェクトの処理は Form2だけで纏めた方がいいでしょうか?

以上、よろしくお願い致します。

former_member583013
Active Contributor
0 Kudos

>private 変数 で ReportDocument オブジェクトを生成してレポートファイルをLoadし

Form1 の Private オブジェクトを Form2 に渡せるのですか???

>ReportSource オブジェクトの処理は Form2だけで纏めた方がいいでしょうか?

まずは 生成 & 廃棄は一つの Form2 のみで行ってみてください。

SCN フォーラムモデレーター

Former Member
0 Kudos

お世話になっております。

>Form1 の Private オブジェクトを Form2 に渡せるのですか???

はい。

Form2 に ReportDocument オブジェクトを受けるパブリックプロパティを持たせて、

そのプロパティにPrivate のオブジェクトを代入しています。

>まずは 生成 & 廃棄は一つの Form2 のみで行ってみてください。

ありがとうございます。

生成と廃棄をForm2 内でまとめる方法で確認してみましたところ、

Form2 起動時に増加したメモリがForm2 終了時に解放されました。

上記の ReportDocument オブジェクトを渡す辺りの作りに問題があったようです。

ご助力いただき、ありがとうございました。

Answers (0)