1

VisualBasicでDoWhileループを繰り返すたびにラベルが表示するテキストを変更しようとしています。1つのラベル(整数を表示)は正常に機能しますが、ループが終了して最終結果を表示するまで、もう1つのラベルは空白のままです。何が問題なのですか?

Private Sub btnCalc_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles btnOblicz.Click
Dim W As Single
Dim L As Integer
Dim J As Integer
Dim Y As Double

W = Val(txtW.Text)

L = InputBox("Input L")

J = 0

If W > 0 And W < 100 Then

Do

    Y = (2 * Math.Sqrt(W)) / (L - J)
    J = J + 1
    lblJ.Text = Str(J)
    lblY.Text = Str(Y)
    MsgBox("Next...")

Loop Until Y < 0

Else
    MsgBox("No calculations, because the number is less than zero or greater than a hundred.")

End If

End Sub
4

3 に答える 3

5

Application.DoEvents()は、他の人が提案しているように、機能します。ただし、StackOverflowExceptionsが発生する可能性など、いくつかの悪影響があることに注意する必要があります。

この問題を解決する正しい方法は、BackgroundWorkerコンポーネントを使用することです。

これが発生する理由については...すべてのWindowsプログラムは、ユーザーとオペレーティングシステムからのメッセージ(mousemoveイベント、クリック、キーストロークなど)をチェックするループをコアに持つことで機能することを忘れないでください。ラベルのtextプロパティを設定する場合、画面上にそれ自体を再描画するようにラベルに指示しているわけではありません。代わりに、プログラムのメッセージループが受信して処理する必要があるイベントをオペレーティングシステムに投稿します。新しいイベントが発生すると、メッセージループ(またはポンプ)はそれらのイベントを適切なメソッドに送信します。

あなたのbtnCalc_Click()関数はそのような方法の1つです。関数が実行されている場合は、コアWindowsメッセージングループによって呼び出されました。このループは、メソッドが完了して制御を返すのを待機しています。ブロックされています。関数が完了するまで、ループはメソッドの受信とディスパッチを続行できないため、プログラムのインターフェイスでは何も更新できません。

于 2012-04-18T14:48:51.130 に答える
1

これは、VS2010を使用して行った小さなコピーで問題なく機能しました

メッセージポンプが必要な場合があります。これを試して :

System.Windows.Forms.Application.DoEvents()

于 2012-04-18T14:21:15.243 に答える
0

おそらく、ループの実行中は、OSイベントメッセージを処理するウィンドウ関数にアクセスできません。ディスパッチメッセージを明示的に呼び出してみてください。たとえば、ループ内にラベルテキストを割り当てた後に挿入します

Application.DoEvents
于 2012-04-18T14:18:49.247 に答える