Windowsフォームの表示直後に初期化処理を行うには?[2.0のみ、C#、VB].NET TIPS

Windowsフォームにおけるフォーム自体の初期化処理には、フォームのコンストラクタやLoadイベント・ハンドラ、Activatedイベントを用いるより、.NET Framework 2.0で追加されたShownイベントの方が便利だ。C#およびVB.NETでの使い方を解説する。

» 2006年07月07日 05時00分 公開
[遠藤孝信デジタルアドバンテージ]
「.NET TIPS」のインデックス

連載目次

 Windowsフォームにおいては、アプリケーションの初期化処理はフォームのコンストラクタやLoadイベント・ハンドラ(例えば「Form1_Load」メソッド)で行うことが通常だ。しかしフォーム自体に関する初期化処理は、これらのタイミングで行えない場合がある。

 これは、コンストラクタやLoadイベント・ハンドラが呼び出されるときには、まだフォームが表示されていないことに起因する。この問題を回避するには、.NET Framework 1.xでは、フォームがアクティブになった直後に発生するActivatedイベントが使えた。例えば1.x向けの「TIPS:マウス・カーソルの移動可能領域を制限するには?」では、このイベントを利用して、初期化処理を行っている。

 しかしActivatedイベントはウィンドウがアクティブになるたびに発生するため、フォームの表示直後に一度だけ処理を行いたい場合には、フラグを立てるなどの処理が必要であった。

フォーム表示直後に一度だけ発生するShownイベント

 .NET Framework 2.0では、新しくShownイベントがフォームに追加されている。これはフォームが表示された直後に一度だけ発生するイベントだ。

 これらのイベントがどのようなタイミングで発生するのかを確かめるために、Windowsアプリケーションで以下のような3つのイベント・ハンドラを追加したとしよう。

// Loadイベント・ハンドラ
private void Form1_Load(object sender, EventArgs e) {
  System.Diagnostics.Debug.WriteLine(
    DateTime.Now + " Loadイベント");
}

// Activatedイベント・ハンドラ
private void Form1_Activated(object sender, EventArgs e) {
  System.Diagnostics.Debug.WriteLine(
    DateTime.Now + " Activatedイベント");
}

// Shownイベント・ハンドラ
private void Form1_Shown(object sender, EventArgs e) {
  System.Diagnostics.Debug.WriteLine(
    DateTime.Now + " Shownイベント");
}

' Loadイベント・ハンドラ
Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
  System.Diagnostics.Debug.WriteLine( _
    DateTime.Now + " Loadイベント")
End Sub

' Activatedイベント・ハンドラ
Private Sub Form1_Activated(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Activated
  System.Diagnostics.Debug.WriteLine( _
    DateTime.Now + " Activatedイベント")
End Sub

' Shownイベント・ハンドラ
Private Sub Form1_Shown(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Shown
  System.Diagnostics.Debug.WriteLine( _
    DateTime.Now + " Shownイベント")
End Sub

イベント発生時にメッセージを出力するLoad/Activated/Shownイベント・ハンドラ(上:C#、下:VB)

 アプリケーションを起動し、何度かウィンドウの非アクティブ/アクティブ化を行った結果、上記のコードにより出力されるデバッグ・メッセージは次のようになった。

2006/07/06 16:06:30 Loadイベント
2006/07/06 16:06:30 Activatedイベント
2006/07/06 16:06:30 Shownイベント
2006/07/06 16:06:41 Activatedイベント
2006/07/06 16:06:44 Activatedイベント
……以下省略……


上記のコードにより出力されるデバッグ・メッセージの例
アプリケーションの起動後はまずLoadおよびActivatedイベントが発生するが、その直後にはShownイベントが発生する。そしてそれ以降はShownイベントは発生しない。Activatedイベントはウィンドウの非アクティブ/アクティブ化を行うたびに発生する。

 この結果から分かるように、アプリケーションの起動後はまずLoadイベントとActivatedイベントが発生するが、その直後にShownイベントが発生する。そしてそれ以降はShownイベントが発生することはない。

 ちなみに、アプリケーションの起動後に、フォームのHideメソッド/Showメソッドによりウィンドウの非表示/表示を行ってもShownイベントは発生しない。Shownイベントが発生するのは、フォームの表示直後に一度だけである。

利用可能バージョン:.NET Framework 2.0のみ
カテゴリ:Windowsフォーム 処理対象:ウィンドウ
使用ライブラリ:Formクラス(System.Windows.Forms名前空間)
関連TIPS:マウス・カーソルの移動可能領域を制限するには?


「.NET TIPS」のインデックス

.NET TIPS

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。