■69645 / inTopicNo.2) |
Re[1]: CheckBoxのチェックマークの反映 |
□投稿者/ 魔界の仮面弁士 (500回)-(2014/01/16(Thu) 15:52:29)
|
2014/01/17(Fri) 02:14:42 編集(投稿者)
■No69644 (ザイーガ さん) に返信 > この処理が終了しないと、GUI上のチェックボックスのチェック表示が反映されません。 Refresh メソッドで反映されるかと思います。
> チェックボックスのEnabled = Falseの時にチェックボックスをクリックすると、 > その時のチェックが無効にならず、Enabled = Trueに戻った後にまたチェック処理が走ってしまいます。
'======= 案1 ====== ' Enabled = True に戻す直前に DoEvents を入れる手法 ' ' 修正量が少ないように見えますが、推奨される手法ではありません。 ' http://msdn.microsoft.com/ja-jp/library/system.windows.forms.application.doevents.aspx ' Public Class Form1 Private Sub CheckBox1_CheckedChanged(ByVal sender As Object, ByVal e As EventArgs) Handles CheckBox1.CheckedChanged CheckBox1.Enabled = False : 長い処理 : Application.DoEvents() CheckBox1.Enabled = True End Sub End Class
'======= 案2 ====== ' Idle イベントで解除する手法 ' ' 処理中は Enabled = False にしておき、クリック処理が無視されるようにします。 ' Enabled = True に戻す処理は、CheckedChanged が終わった「後」で行う必要があるため ' Application_Idle や Timer_Tick などで処理させます。 ' Public Class Form1 Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load AddHandler Application.Idle, AddressOf App_Idle End Sub
Private Sub App_Idle(ByVal sender As Object, ByVal e As EventArgs) CheckBox1.Enabled = True End Sub
Private Sub CheckBox1_CheckedChanged(ByVal sender As Object, ByVal e As EventArgs) Handles CheckBox1.CheckedChanged CheckBox1.Refresh() CheckBox1.Enabled = False : 長い処理 : End Sub End Class
'======= 案3 ====== ' AutoCheck プロパティを利用 ' ' 基本的には 案2 と同じですが、Enabled の状態が変わってしまうと ' 都合が悪いような場合に使えます。AutoCheck を False にすると、 ' ReadOnly 状態となり、ユーザー操作による CheckedChanged が発生しません。 ' Public Class Form1 Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load AddHandler Application.Idle, AddressOf App_Idle End Sub
Private Sub App_Idle(ByVal sender As Object, ByVal e As EventArgs) CheckBox1.AutoCheck = True End Sub
Private Sub CheckBox1_CheckedChanged(ByVal sender As Object, ByVal e As EventArgs) Handles CheckBox1.CheckedChanged CheckBox1.AutoCheck = False CheckBox1.Refresh() : 長い処理 : End Sub End Class
|
|