- 題名: ボタン点滅のプログラミングについて
- 日時: 2006/03/21 2:24:55
- ID: 14911
- この記事の返信元:
- (なし)
- この記事への返信:
- [14918] Re[1]: ボタン点滅のプログラミングについて2006/03/21 4:58:56
- ツリーを表示
>DOBONさんのマルチスレッドに関するご説明において(MSDNにも記述されておりま >した)別スレッドからフォームのコントロールを使用する場合は、デリゲートを >使用するとございましたが、本処理におきましても必要となるのか?が気になっ >ております。 基本的に別スレッドからコントロールにアクセスできません。 VB2005で試したところ,BackColorの変更ではなぜかエラーになりませんが BackColorの代わりにTextを変更しようとするとエラーになりました。 デリゲートを使用してアクセスするか,タイマーをWindows.Forms.Timerに してシングルスレッドで実行するか,どちらかにした方がよいかと思います。 タイマーをWindows.Forms.Timerに変えると以下のようになると思います。 (その他,適当にリファクタリング?してみました) Option Strict On Public Class Form1 Dim BlinkLightCtrl As New BlinkLightCtrl Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load BlinkLightCtrl.BlinkCallOn(Button1) End Sub End Class Public Class BlinkLightCtrl Private htBlinkCall As New Collections.Hashtable Private blnBlinkCalling As Boolean = False Private WithEvents Timer As New Timer Public Sub BlinkCallOn(ByVal objBtn As Button) Me.htBlinkCall.Add(objBtn, objBtn.BackColor.ToArgb) End Sub Public Sub New() Timer.Interval = 1000 Timer.Enabled = True End Sub Private Sub tmrOnePerSec_Tick(ByVal sender As Object, ByVal e As EventArgs) Handles Timer.Tick For Each de As DictionaryEntry In Me.htBlinkCall DirectCast(de.Key, Button).BackColor = Color.FromArgb(CInt(IIf(blnBlinkCalling, de.Value, &HFF00FF00I))) Me.blnBlinkCalling = Not Me.blnBlinkCalling Next End Sub End Class
分類:[.NET]