- - PR -
画面Load時のClose処理について。
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-09-11 14:00
いつもお世話になっております。
現在、VisualStudio2005のWindows版で開発を行っています。 画面Load時に、データベースOpen処理を行い、Openできない(エラー)場合、 画面をCloseしたいと思っています。 単純に、画面Load処理内でエラーの場合、Me.Close() で画面Closeを 行おうと思っていたのですが、MicroSoftのヘルプを参照すると・・・ ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ Close を Load イベントまたは Activated イベントのイベント ハンドラ内 から呼び出さないでください。 どちらの状況でもメモリ リークが発生する場合があります。 フォームを起動直後に閉じる必要があるかどうかテストするには、代わりに Idle イベントを使用します。 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ と記載してあります。 そもそも、画面Load処理内でCloseを行おうとするのが間違いなのか、 自分の中で判断が付きませんでした。 Idle イベントを使用せずに回避できる方法または、他に、もっと良い方法が ありましたら、ご教授願います。 以上の件、よろしくお願い致します。 | ||||||||
|
投稿日時: 2006-09-11 14:39
アプリケーションのエントリポイントでDBオープンを行ってみてはどうでしょうか。
program.vb (でしたっけ?) shared sub main() 'DBオープン if ( not OpenDataBase() ) then MessageBox.Show("DBが開けないよ") return end if 'メインフォームを表示して、アプリケーション開始 Application.Run(new Form1()) end sub | ||||||||
|
投稿日時: 2006-09-11 14:49
そもそも開く必要のないフォームだったら、開かなければ良いですよね。 さらに、Load の中で Close を行うとメモリーリークの可能性があるなら、 それは間違いと言っていいのではないでしょうか。
開く側で開いていいかをチェックしてみてはどうでしょうか。 メインフォームだとしたら、masaさんがおっしゃっているように Main に書いてあげればいいですよね。 _________________ かるあ のメモ と スニペット | ||||||||
|
投稿日時: 2006-09-11 15:05
私も、フォームを呼び出す前にチェックすべきだと思います。
とりあえずフォームの表示はしたいのなら(例えばエラーメッセージ表示してOKクリックするまではメインとなるフォームを表示しておきたいとか)下記のような感じでIdleイベントを使えばいいのでは? ところで、なぜIdleイベントを回避しようと考えになられたのでしょうか?
[ メッセージ編集済み 編集者: けんじ 編集日時 2006-09-11 15:09 ] | ||||||||
|
投稿日時: 2006-09-11 15:57
私も何度か言っていることですが、Form が Load される前に判断すべきだと思います。
起動時であれば、エントリ ポイントになりますね。 何故 Load イベントで判断する? (wankuma.com) 特別な理由があるのであれば、理由を書いた方が良いでしょう。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2006-09-11 16:36
objectです。
Formの「Loadイベント」は、 「Createイベント」 つまり、 「Formのコンストラクション処理中」 と考えるべきだと思います。 そして、これは、 「生成処理の真っ只中」 という、とても不安定に期間ですから かなり記述に注意が必要です。 #この処理は、言語にもかなり依存しています。 #また、名前が #「Loadイベント」 #なので誤解を招きやすいんでしょうね。 今回の場合、必要が無いのに 「生成を開始しておいて、 最もデリケートなコンストラクション処理中に中断する」 という事が最も問題だと思います。 それから、 オブジェクト指向プログラミングでは 「コンストラクターとその処理」 に関連する事項は、プログラマーとして、 「かなりシッカリとした知識が必要」 だと私は思います。 #コンストラクションは単なる初期化ではありません。 | ||||||||
|
投稿日時: 2006-09-11 17:41
皆様、返信ありがとうございます。
実際には、以下の処理を行おうとしていました。 〜Form Load イベント処理〜 1. データベースOpen 2. データベースよりFormに表示するデータをSelect 3. 項番2.で取得したデータをFormに表示 〜Form Closed イベント処理〜 1. データベースClose なぜ、Form Load イベント処理でForm Close処理を行いたかったと 申しますと・・・ @ データベースOpen処理だけでなく、データベースOpen後(項番3.)の処理にて、 システムエラーが発生した場合、必ずデータベースをCloseさせたい。 A プログラムのいろいろな所に、データベースClose処理を記述せずに、 1つのイベントのみに記述したい。 これは、コーディングルールを分かりやすくしたかった為です。 皆様から返信頂いた内容で考えた結果・・・ 〜 Sub Main 〜 1. データベースOpen 〜Form Load イベント処理〜 1. データベースよりFormに表示するデータをSelect 2. 項番2.で取得したデータをFormに表示 〜Form Closed イベント処理〜 1. データベースClose Form Load時に発生したシステムエラー処理は、Form Load後、ユーザが押下した 終了ボタン等でデータベースをCloseさせるといった方法が良いと思いました。 皆様、有難うございました。 | ||||||||
|
投稿日時: 2006-09-11 17:53
たぶん、また大量に返信があると思いますが。。。
検索や更新など必要なときにデータベースに接続し、 処理が終了したらその都度データベースを必ず閉じるようにすれば、 このあたりを考える必要がなくなると思います。 コネクションプーリングって物もありますし。。。
コネクションオブジェクトのスコープが大きすぎる気がします。 データベースにつながるかどうか最初に確認するとしても、 コネクションは開いたのと同じスコープで閉じてあげたいですね。 |