@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

画面Load時のClose処理について。

投稿者投稿内容
いえ蔵
会議室デビュー日: 2006/02/16
投稿数: 4
投稿日時: 2006-09-11 14:00
いつもお世話になっております。
現在、VisualStudio2005のWindows版で開発を行っています。

画面Load時に、データベースOpen処理を行い、Openできない(エラー)場合、
画面をCloseしたいと思っています。
単純に、画面Load処理内でエラーの場合、Me.Close() で画面Closeを
行おうと思っていたのですが、MicroSoftのヘルプを参照すると・・・

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
Close を Load イベントまたは Activated イベントのイベント ハンドラ内
から呼び出さないでください。
どちらの状況でもメモリ リークが発生する場合があります。
フォームを起動直後に閉じる必要があるかどうかテストするには、代わりに
Idle イベントを使用します。
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

と記載してあります。
そもそも、画面Load処理内でCloseを行おうとするのが間違いなのか、
自分の中で判断が付きませんでした。
Idle イベントを使用せずに回避できる方法または、他に、もっと良い方法が
ありましたら、ご教授願います。

以上の件、よろしくお願い致します。
masa
大ベテラン
会議室デビュー日: 2004/10/28
投稿数: 161
投稿日時: 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
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-09-11 14:49
引用:

いえ蔵さんの書き込み (2006-09-11 14:00) より:

画面Load処理内でCloseを行おうとするのが間違いなのか、
自分の中で判断が付きませんでした。


そもそも開く必要のないフォームだったら、開かなければ良いですよね。
さらに、Load の中で Close を行うとメモリーリークの可能性があるなら、
それは間違いと言っていいのではないでしょうか。

引用:

Idle イベントを使用せずに回避できる方法または、他に、もっと良い方法が
ありましたら、ご教授願います。


開く側で開いていいかをチェックしてみてはどうでしょうか。
メインフォームだとしたら、masaさんがおっしゃっているように
Main に書いてあげればいいですよね。
_________________
かるあ のメモスニペット
よこけん
大ベテラン
会議室デビュー日: 2006/01/31
投稿数: 216
投稿日時: 2006-09-11 15:05
私も、フォームを呼び出す前にチェックすべきだと思います。
とりあえずフォームの表示はしたいのなら(例えばエラーメッセージ表示してOKクリックするまではメインとなるフォームを表示しておきたいとか)下記のような感じでIdleイベントを使えばいいのでは?
ところで、なぜIdleイベントを回避しようと考えになられたのでしょうか?

コード:

Public Class Form1

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
AddHandler Application.Idle, AddressOf Application_Idle
End Sub

Private Sub Application_Idle(ByVal sender As Object, ByVal e As EventArgs)
If (Not Me.IsOpen()) Then
Me.Close()
End If
RemoveHandler Application.Idle, AddressOf Application_Idle
End Sub

Private Function IsOpen() As Boolean
Return False
End Function
End Class





[ メッセージ編集済み 編集者: けんじ 編集日時 2006-09-11 15:09 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-09-11 15:57
私も何度か言っていることですが、Form が Load される前に判断すべきだと思います。
起動時であれば、エントリ ポイントになりますね。

  何故 Load イベントで判断する? (wankuma.com)

特別な理由があるのであれば、理由を書いた方が良いでしょう。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
object
ぬし
会議室デビュー日: 2002/03/20
投稿数: 338
お住まい・勤務地: 香川県高松市
投稿日時: 2006-09-11 16:36
objectです。

Formの「Loadイベント」は、
「Createイベント」
つまり、
「Formのコンストラクション処理中」
と考えるべきだと思います。

そして、これは、
「生成処理の真っ只中」
という、とても不安定に期間ですから
かなり記述に注意が必要です。
#この処理は、言語にもかなり依存しています。
#また、名前が
#「Loadイベント」
#なので誤解を招きやすいんでしょうね。

今回の場合、必要が無いのに
「生成を開始しておいて、
 最もデリケートなコンストラクション処理中に中断する」
という事が最も問題だと思います。

それから、
オブジェクト指向プログラミングでは
「コンストラクターとその処理」
に関連する事項は、プログラマーとして、
「かなりシッカリとした知識が必要」
だと私は思います。
#コンストラクションは単なる初期化ではありません。
いえ蔵
会議室デビュー日: 2006/02/16
投稿数: 4
投稿日時: 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させるといった方法が良いと思いました。

皆様、有難うございました。
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-09-11 17:53
たぶん、また大量に返信があると思いますが。。。

引用:

いえ蔵さんの書き込み (2006-09-11 17:41) より:

なぜ、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


コネクションオブジェクトのスコープが大きすぎる気がします。
データベースにつながるかどうか最初に確認するとしても、
コネクションは開いたのと同じスコープで閉じてあげたいですね。

スキルアップ/キャリアアップ(JOB@IT)