DOBON.NET DOBON.NETプログラミング掲示板過去ログ

NumericUpownのValueChangedイベントの中でメッセージ表示がうまくいきません。

環境/言語:[VB.NET2003]
分類:[.NET]

初めて書き込みます。ますたにと申します。
現在VB.NET2003 FramWork 1.1 SP1 を使っています。

NumericUpDownの値を100くらいにして
NumericUpDownの右にあるDownボタンを押しっぱなしにし、
ValueがMinimum(0)になったときメッセージを表示したいのです。

Private Sub NumericUpDown_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NumericUpDown.ValueChanged
If Me.NumericUpDown.Value = Me.NumericUpDown.Minimum Then
MsgBox("これ以上小さくできません")
End If
End Sub

メッセージ表示後、以下のエラーになってしまいます。


このダイアログ ボックスではなく、Just-In-Time (JIT) デバッグを呼び出すための詳細については、
このメッセージの最後を参照してください。

************** 例外テキスト **************
System.NullReferenceException: オブジェクト参照がオブジェクト インスタンスに設定されていません。
at System.Windows.Forms.UpDownButtons.TimerHandler(Object source, EventArgs args)
at System.Windows.Forms.Timer.OnTick(EventArgs e)
at System.Windows.Forms.Timer.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr idEvent, IntPtr dwTime)

引用終わり

おそらくメッセージを出すことによって
それまでの押しっぱなしのDOWNがきかなくなって落ちると思うのですが。
この中にTry catchやon error gotoと書いてもエラー内容は拾えませんでした。
メッセージを出す前にこのイベント自体を消そうと
e=nothingや値の増減をなくしてみたり、増減を利かないようにしてみたのですが
NumericUpDown1.Increment = 0
NumericUpDown1.InterceptArrowKeys = False

結果は同じでした。
そもそもこのようなことは実現不可能なのでしょうか?

実現方法をご存知のかたがいらっしゃったら教えてください、お願いします。
■No17251に返信(ますたにさんの記事)

こんにちは エツです。

ますたにさんの想像通りの現象と思います。

このイベントでメッセージを出さないでここではタイマーを起動させ、
タイマーのTickイベントでメッセージを出せば一応動作します。

もっとスマートな方法は思いつきません。
■No17253に返信(エツさんの記事)

タイマーよりこちらがいい気がします。

Private Sub NumericUpDown1_ValueChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles NumericUpDown1.ValueChanged

'If Me.NumericUpDown1.Value = Me.NumericUpDown1.Minimum Then
' Timer1.Start()
'End If

If Me.NumericUpDown1.Value = Me.NumericUpDown1.Minimum Then
AddHandler Application.Idle, AddressOf LowValueMsg
End If

End Sub


Private Sub LowValueMsg(ByVal sender As Object, ByVal e As EventArgs)
RemoveHandler Application.Idle, AddressOf LowValueMsg
MsgBox("これ以上小さくできません")
End Sub
■No17258に返信(エツさんの記事)

気になったのでもう少し調べました。
NumericUpDown_ValueChanged イベントで時間の掛かる処理をしても落ちるわけでなく、MsgBoxやMessageBox.Show で落ちますね。なんとも不思議です。

以下の内容で実験してみました。

Private Sub NumericUpDown1_ValueChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles NumericUpDown1.ValueChanged

If Me.NumericUpDown1.Value = Me.NumericUpDown1.Minimum Then
System.Threading.Thread.Sleep(5000) '<-- 時間の掛かる処理1

'Dim i, j As Integer '<-- 時間の掛かる処理2
'Dim k As String
'For i = 0 To 100
' For j = 0 To 1000
' k += "a"
' Next
'Next
AddHandler Application.Idle, AddressOf LowValueMsg

End If
End Sub

時間の掛かる処理1、時間の掛かる処理2 では 落ちませんでした。
ますたにです。
エツ様、早速の返信ありがとうございます。
TopicNo.3の方法で無事動作し、解決いたしました。

たかだかMSGBOXを表示するだけにここまで苦戦するとは思いませんでした。
なんとも不思議な現象でした。

余談ですが、マウスの押しっぱなしでは落ちますが。KEYDOWNの↓や↑では落ちませんでした。やはりUPDOWNボタンの部品の不具合ではないかなと思います。

今後はNumericUpdownはできるかぎり使わないことにします。

このたびはありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板