忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、Javascript、PHP その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

最初のフォームActivatedイベントでの処理(1回のみしか処理しない様にする)

フォームが表示されて初めてアクティブになった時に行いたい処理が在る場合、 以下のソースの様に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. 無題

Shown イベントでも良いと思います。

2. 無題

コメント有難うございます。 確かにその通りですね。ご指摘ありがとうございます。
コメントを書く