質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

3回答

7347閲覧

Visual basicのフォームに張り付けたLabelの更新について

mori_C

総合スコア34

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2020/04/22 06:51

編集2020/04/22 07:04

初歩的な質問ですが、わからず困っています。
例えば、
Form上にLabel1を張り付け、
プログラム実行にて、数値iが1秒ごと1つずつ10まで
カウントアップしていくようなものをつくり
Label1.text = i.toString
で表示をLabel1に表示せております。

しかし、実際に実行すると1,2,3・・・・ではなく
なにも表示されず、10秒後に10と表示されてプログラム終了まで
表示されずに終わりになります。

どうすれば1,2,3,4と更新されるようにできるのでしょうか。

'以下コード----------------------------vb2010です
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim i As Long For i = 1 To 10 System.Threading.Thread.Sleep(1000) Label1.text = i.ToString Next End Sub

'-----------------------------------
フォームには、ボタンとLabel1が配置してあります

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2020/04/22 06:53

コードを提示しましょう
mori_C

2020/04/22 07:05

コード追記しました。 よろしくお願いします。
guest

回答3

0

GUIの画面というのは、処理を専有している間は更新されません。

#フリーズする、と言われてる現象

なので、1秒ごとに更新したいのであれば、1秒ウェイトしてループする、ってのではダメです(ループしている間は更新されない)

この場合は、タイマコンポーネントなどを使って、1秒ごとに呼び出し、ラベルの内容を更新する、ということを行いましょう

投稿2020/04/22 07:11

y_waiwai

総合スコア87749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sanapapa

2020/04/22 07:46

dodox86様のご指摘の通り、むしろThreadクラスなどよりTimerクラスの方が良さそうです。 勉強になりました、有難うございます。未熟な回答を書き直しました。
guest

0

Label1.text = i.ToString の次に Application.DoEvents() を追加したらどうなりますか?

投稿2020/04/22 07:29

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mori_C

2020/04/22 07:34

Application.DoEvents() を追加すると 値が更新されるようになりました。 簡単でよいですね。ありがとうございます。
退会済みユーザー

退会済みユーザー

2020/04/22 07:39

簡単なのは確かですが、適材適所です。今回のケースでは Application.DoEvents() を使うのは適材適所の範疇に入ると思いますが・・・
guest

0

ベストアンサー

軽率な回答で申し訳ございませんでした。
dodox86様の回答を拝見し調べなおしました。
Threadクラスを利用した制御はむしろ古いやり方で、
Timerクラスを利用した方がdodox86様のおっしゃる通り簡潔に記載することができます。
ご参考までに以下サンプルソースです。
Timerの設置はフォームデザイナのツールボックス内にあります。

VB.NET

1Public Class Form1 2 Dim count = 0 3 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 4 Timer1.Start() 5 End Sub 6 7 Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick 8 Label1.Text = count 9 count += 1 10 End Sub 11End Class

このような形でスレッド化してあげるほうが無難だと思います。
また、メインスレッドではないスレッドからGUIの操作をするにはデリゲートという仕組みを利用します。
別途お調べください。

投稿2020/04/22 07:12

編集2020/04/22 07:43
sanapapa

総合スコア30

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mori_C

2020/04/22 07:24

ありがとうございます。 設定等の抜けではなく、プログラムの書き方がまずかったのですね。 記載していただいたソースコードを貼り付けたら、 きちんと更新しながら、表示されました。 スレッド化、デリゲートなど勉強したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問