VB.netにおいて、プログレスバーの作成方法や処理中でのキャンセル方法についてご紹介

- システム
エンジニア - プログレスバーの作成方法がよく理解できません。教えていただけますか?
- プロジェクト
マネージャー - わかりました。では実際のソースコードを見ながら理解を深めていきましょう。
VB.netのプログレスバーについて
今回は、VB.netのプログレスバーについて説明します。プログレスバーとは、例えばサイズの大きいファイルをコピーしたりして時間がかかる処理がある場合、進捗を視覚的に表現するものです。
ProgressBarコントロールを使用しており、こちらではプログレスバーの作成方法や、処理中でのキャンセル方法についてご紹介します。VB.netのプログレスバーに興味のある方はぜひご覧ください。
プログレスバーの作成
VB.netでは、ProgressBarコントロールで進捗を表現できます。
実際のソースコードを見てみましょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
Public Class Form1
Dim progressBar As ProgressBar
Dim button As Button
Dim label As Label
Sub New()
progressBar = New ProgressBar()
progressBar.Location = New Point(10, 10)
progressBar.Step = 1
label = New Label()
label.Location = New Point(10, 40)
label.AutoSize = True
button = New Button()
button.Location = New Point(10, 70)
button.Text = "Start"
AddHandler Me.Load, AddressOf Form1_Load
AddHandler Me.button.Click, AddressOf Button_Click
Me.Controls.Add(progressBar)
Me.Controls.Add(button)
Me.Controls.Add(label)
End Sub
Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs)
'
End Sub
Private Sub Button_Click(ByVal sender As Object, ByVal e As EventArgs)
progressBar.Minimum = 0
progressBar.Maximum = 10
progressBar.Value = 0
label.Update()
Dim i As Integer
For i = 1 To 10
' 1秒待合せ
Threading.Thread.Sleep(1000)
' ProgressBarの値変更
' progressBar.Value = i ' これでもよい
progressBar.PerformStep()
label.Text = i.ToString()
' labelを再描画する
label.Update()
Next
label.Text = "完了しました。"
End Sub
End Class
|
ボタンをクリックすると、プログレスバーの進捗が伸びていき、完了することが分かります。
このように、VB.netではProgressBarコントロールで進捗を表現できます。
プログレスバーは徐々に伸びる
VB.netのプログレスバーは、進捗が進む場合は徐々にバーが伸び、逆に進捗が戻る場合には即座に戻ります。
これを確認するため、実際のソースコードを見てみましょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
Public Class Form1
Dim progressBar As ProgressBar
Dim trackBar As TrackBar
Dim label As Label
Sub New()
' プログレスバー
progressBar = New ProgressBar()
progressBar.Location = New Point(10, 10)
progressBar.Step = 1
progressBar.Minimum = 0
progressBar.Maximum = 10
progressBar.Value = 0
label = New Label()
label.Location = New Point(10, 40)
label.AutoSize = True
' トラックバー
trackBar = New TrackBar()
trackBar.Location = New Point(10, 70)
trackBar.Minimum = 0
trackBar.Maximum = 10
trackBar.Value = 0
trackBar.SmallChange = 1
trackBar.LargeChange = 1
trackBar.TickFrequency = 1
AddHandler Me.trackBar.ValueChanged, AddressOf TrackBar_ValueChanged
AddHandler Me.Load, AddressOf Form1_Load
Me.Controls.Add(progressBar)
Me.Controls.Add(trackBar)
Me.Controls.Add(label)
End Sub
Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs)
'
End Sub
Private Sub TrackBar_ValueChanged(ByVal sender As Object, ByVal e As EventArgs)
' プログレスバーをトラックバーの値にする
progressBar.Value = trackBar.Value
label.Text = progressBar.Value
label.Update()
End Sub
End Class
|
トラックバーとプログレスバーが連動するプログラムです。
進捗が進む場合は徐々にバーが伸び、逆に進捗が戻る場合には即座に戻ることが分かります。
プログレスバーのスタイル
VB.netのプログレスバーには3種類のスタイルがあります。
・Blocks:分割されたブロックが増加する
・Continuous:滑らかに連続的に増加する
・Marquee:ブロックが絶え間なくスクロールする
スタイルの違いを確認するため、実際のソースコードを見てみましょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
Public Class Form1
Dim progressBar1, progressBar2, progressBar3 As ProgressBar
Dim trackBar As TrackBar
Dim label As Label
Sub New()
progressBar1 = New ProgressBar()
progressBar1.Location = New Point(10, 10)
progressBar1.Step = 1
progressBar1.Minimum = 0
progressBar1.Maximum = 10
progressBar1.Value = 0
progressBar1.Style = ProgressBarStyle.Blocks
progressBar2 = New ProgressBar()
progressBar2.Location = New Point(10, 40)
progressBar2.Step = 1
progressBar2.Minimum = 0
progressBar2.Maximum = 10
progressBar2.Value = 0
progressBar2.Style = ProgressBarStyle.Continuous
progressBar3 = New ProgressBar()
progressBar3.Location = New Point(10, 70)
progressBar3.Step = 1
progressBar3.Minimum = 0
progressBar3.Maximum = 10
progressBar3.Value = 0
progressBar3.Style = ProgressBarStyle.Marquee
label = New Label()
label.Location = New Point(10, 100)
label.AutoSize = True
trackBar = New TrackBar()
trackBar.Location = New Point(10, 130)
trackBar.Minimum = 0
trackBar.Maximum = 10
trackBar.Value = 0
trackBar.SmallChange = 1
trackBar.LargeChange = 1
trackBar.TickFrequency = 1
AddHandler Me.trackBar.ValueChanged, AddressOf TrackBar_ValueChanged
AddHandler Me.Load, AddressOf Form1_Load
Me.Controls.Add(progressBar1)
Me.Controls.Add(progressBar2)
Me.Controls.Add(progressBar3)
Me.Controls.Add(trackBar)
Me.Controls.Add(label)
End Sub
Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs)
'
End Sub
Private Sub TrackBar_ValueChanged(ByVal sender As Object, ByVal e As EventArgs)
progressBar1.Value = trackBar.Value
progressBar2.Value = trackBar.Value
progressBar3.Value = trackBar.Value
label.Text = trackBar.Value
label.Update()
End Sub
End Class
|
実行すると、3種類のプログレスバーの違いが分かります。
途中でキャンセルできるようにする
これまでの章で紹介したプログレスバーでは、処理の間は、フォームなどのコントロールを一切操作できません。VB.netでは、BackgroundWorkerコンポーネントを使用すれば、処理の間も操作できます。
ここでは、BackgroundWorkerコンポーネントを使用したプログレスバーの作成方法と、処理途中でキャンセルできるようにする方法をご紹介します。
実際のソースコードを見てみましょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
|
Imports System.ComponentModel
Public Class Form1
Dim progressBar As ProgressBar
Dim button1, button2 As Button
Dim label As Label
Dim backgroundWorker As BackgroundWorker
Sub New()
progressBar = New ProgressBar()
progressBar.Location = New Point(10, 10)
progressBar.Step = 1
label = New Label()
label.Location = New Point(10, 40)
label.AutoSize = True
button1 = New Button()
button1.Location = New Point(10, 70)
button1.Text = "Start"
button2 = New Button()
button2.Location = New Point(100, 70)
button2.Text = "Cancel"
backgroundWorker = New BackgroundWorker()
AddHandler Me.Load, AddressOf Form1_Load
AddHandler Me.button1.Click, AddressOf Button1_Click
AddHandler Me.button2.Click, AddressOf Button2_Click
AddHandler Me.backgroundWorker.DoWork, AddressOf BackgroundWorker_DoWork
AddHandler Me.backgroundWorker.ProgressChanged,
New ProgressChangedEventHandler(
AddressOf BackgroundWorker_ProgressChanged)
AddHandler Me.backgroundWorker.RunWorkerCompleted,
New RunWorkerCompletedEventHandler(
AddressOf BackgroundWorker_RunWorkerCompleted)
Me.Controls.Add(progressBar)
Me.Controls.Add(button1)
Me.Controls.Add(button2)
Me.Controls.Add(label)
End Sub
Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs)
'
End Sub
Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs)
' 処理中は何もしない
If backgroundWorker.IsBusy Then
Return
End If
' Startボタンを無効にする
button1.Enabled = False
' Cancelボタンを有効にする
button2.Enabled = True
' コントロールを初期化する
progressBar.Minimum = 0
progressBar.Maximum = 10
progressBar.Value = 0
label.Text = "0"
' ProgressChangedイベントが発生するようにする
backgroundWorker.WorkerReportsProgress = True
' キャンセルできるようにする
backgroundWorker.WorkerSupportsCancellation = True
' DoWorkで処理を開始する
backgroundWorker.RunWorkerAsync()
End Sub
Private Sub Button2_Click(ByVal sender As Object, ByVal e As EventArgs)
' Cancelボタンを無効にする
button2.Enabled = False
' キャンセルする
backgroundWorker.CancelAsync()
End Sub
' DoWorkの処理
Private Sub BackgroundWorker_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs)
Dim bgWorker As BackgroundWorker = DirectCast(sender, BackgroundWorker)
Dim i As Integer
For i = 1 To 10
' キャンセルされたか調べる
If bgWorker.CancellationPending Then
' キャンセルされたらreturn
e.Cancel = True
Return
End If
' 1秒間待機する
Threading.Thread.Sleep(1000)
' コントロールの表示を変更する
bgWorker.ReportProgress(i)
Next
End Sub
' BackgroundWorkerのProgressChangedイベントハンドラ
Private Sub BackgroundWorker_ProgressChanged(ByVal sender As Object, ByVal e As ProgressChangedEventArgs)
' ProgressBarの値を変更する
progressBar.Value = e.ProgressPercentage
' Labelのテキストを変更する
label.Text = e.ProgressPercentage.ToString()
End Sub
' DoWorkが終わったときに呼び出される
Private Sub BackgroundWorker_RunWorkerCompleted(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs)
If e.Cancelled Then
label.Text = "キャンセルされました。"
Else
label.Text = "完了しました。"
End If
' Startボタンを有効にする
button1.Enabled = True
' Cancelボタンを無効にする
button2.Enabled = False
End Sub
End Class
|
“Cancel”ボタンをクリックすると、処理がキャンセルされて、バーが途中でとまることが分かります。
このように、VB.netではBackgroundWorkerコンポーネントを使用すれば、処理の間も操作できます。
- システム
エンジニア - 途中でキャンセルできたり、様々なソースコードがあるのですね。参考になりました。
- プロジェクト
マネージャー - それぞれのスタイルの違いを理解いただけたようですね。
VB.netでのプログレスバーについて正しく理解して使用しましょう。
いかがでしたでしょうか。VB.netでのプログレスバーについてや、ProgressBarコントロールを使用したプログレスバーの作成方法や、処理中でのキャンセル方法についてご紹介しました。
ぜひご自身でVB.netのソースコードを書いて、理解を深めてください。
FEnet.NETナビ・.NETコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。

-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。


VB.NET新着案件New Job
-
生産管理システムの単体テスト/東京都千代田区/【WEB面談可】/在宅勤務
月給25万~25万円東京都千代田区(東京駅) -
鉄鋼関連・グループ会社システム支援/Oracle/東京都新宿区/【WEB面談可】/在宅勤務
月給26万~26万円東京都新宿区(新宿駅) -
資産運用会社向け残高管理システム運用保守/SQLServer/東京都中央区/【WEB面談可】
月給50万~60万円東京都中央区(銀座駅) -
資産運用会社向け残高管理システム開発のテスター/SQLServer/東京都中央区/【WEB面談可】
月給25万~35万円東京都中央区(銀座駅) -
Web受注システム運用保守/VB.NET/東京都港区/【WEB面談可】
月給50万~60万円東京都港区(品川駅) -
Web受注システム開発のテスター/VB.NET/東京都港区/【WEB面談可】
月給25万~35万円東京都港区(品川駅)