フォームが表示されて初めてアクティブになった時に行いたい処理が在る場合、 以下のソースの様にActivatedイベント時に処理を記述します。
フォーム上に1個のテキストボックスを貼付け、そのテキストボックスを複数行入力許可とします。
そして、Activatedイベント時に現在の時刻を表示します。 ソースは以下の通りです。
フォームのActivatedイベントでの処理
Public Class frmActive '''''' フォームアクティブイベント ''' Private Sub frmActive_Activated(sender As Object, e As EventArgs) Handles Me.Activated 'テキストボックに時刻表示 Me.TextBox1.Text &= "Activated..." & Now.ToString("hh:mm:ss") & vbCrLf End Sub '''''' フォームロードイベント ''' Private Sub frmActive_Load(sender As Object, e As EventArgs) Handles Me.Load 'テキストボックスを複数行許可 Me.TextBox1.Multiline = True Me.TextBox1.Height = 200 End Sub End Class
これを実行すると以下の様な表示になります。
上手く動いたかに見えますが、このフォームから別のプログラムなどをアクティブにしてから このプログラムを再度アクティブにすることを繰り返すと以下の様な表示になります。 (日付の表示がどんどん増えていきます)
これは問題です。何が悪いのかと言えば、Activatedイベントは自分自身のフォームが非アクティブから アクティブに変わった時に必ず発生するからです。 プログラムが起動し、最初のActivatedイベントかどうかはフラグを使うしかない様です。 そこで、プログラムを以下の様に変更します。
フォームのActivatedイベントでの処理その2
Public Class frmActive 'アクティブフラグ Private mblnActivated As Boolean = False '''''' フォームアクティブイベント ''' Private Sub frmActive_Activated(sender As Object, e As EventArgs) Handles Me.Activated 'アクティブフラグOFF?? If Me.mblnActivated = False Then 'フラグON Me.mblnActivated = True 'テキストボックに時刻表示 Me.TextBox1.Text &= "Activated..." & Now.ToString("hh:mm:ss") & vbCrLf End If End Sub '''''' フォームロードイベント ''' Private Sub frmActive_Load(sender As Object, e As EventArgs) Handles Me.Load 'テキストボックスを複数行許可 Me.TextBox1.Multiline = True Me.TextBox1.Height = 200 'アクティブフラグOFF(くどいですが) Me.mblnActivated = False End Sub End Class
上記のソースではアクティブになったフラグをフォームのローカル変数として宣言し、 Activatedイベント時にそのフラグをみてOFFだったら、フラグをONして二度と時刻表示の処理を しない様にしています。
これで何とかうまくいくようになりました。
関連する記事
⇒フォームの位置設定を行う処理 :[Screen.PrimaryScreen.WorkingArea]⇒フォームクラスにプロパティ宣言し外からアクセスする方法
⇒親フォームのコントロールを子フォームからアクセスする方法
⇒フォームが閉じるのをキャンセルする方法:[FormClosingEventArgs,Cancel]
⇒フォームの表示をモジュールのMain関数から行う(エントリポイントの変更)
⇒フォームがKeyDownなどのキーイベントを受取り、ファンクションキー処理をする
⇒最初のフォームActivatedイベントでの処理(1回のみしか処理しない様にする)
⇒初回のフォームActivatedイベント発生させるフォーム継承について
PR
コメント
1. 無題
2. 無題