on 11-10-2008 8:13 AM
お世話になっております。
標題の事象について質問させていただきます。
<環境>
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 のメモリを解放するには、どうすればいいでしょうか?
ご教示 願います。
以上、よろしくお願いします。
ReportSource プロパティでレポートをどのように指定していますか。
毎回同じレポートとは考えにくいので、Form1 側で ReportDocument オブジェクトを生成しているか、Form2 側の Load のタイミングで ReportSource を指定していますよね?
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
ご指摘ありがとうございます。
レポートの指定は、Form1 側のコマンドボタンクリック時に
private 変数 で ReportDocument オブジェクトを生成してレポートファイルをLoadし、
Form2 側の CrystalReportViewer.ReportSource オブジェクトに代入しています。
この Form1側の private 変数はコマンドボタン処理のFinallyで、
また、Form2側のReportSource オブジェクトはForm2.Dispose 時にそれぞれ Dispose しています。
ReportSource オブジェクトの処理は Form2だけで纏めた方がいいでしょうか?
以上、よろしくお願い致します。
お世話になっております。
>Form1 の Private オブジェクトを Form2 に渡せるのですか???
はい。
Form2 に ReportDocument オブジェクトを受けるパブリックプロパティを持たせて、
そのプロパティにPrivate のオブジェクトを代入しています。
>まずは 生成 & 廃棄は一つの Form2 のみで行ってみてください。
ありがとうございます。
生成と廃棄をForm2 内でまとめる方法で確認してみましたところ、
Form2 起動時に増加したメモリがForm2 終了時に解放されました。
上記の ReportDocument オブジェクトを渡す辺りの作りに問題があったようです。
ご助力いただき、ありがとうございました。
User | Count |
---|---|
90 | |
10 | |
10 | |
9 | |
7 | |
6 | |
6 | |
5 | |
4 | |
3 |
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.