
VB.netにおいて、プログレスバーの作成方法や処理中でのキャンセル方法についてご紹介
- SE
- プログレスバーの作成方法がよく理解できません。教えていただけますか?
- PM
- わかりました。では実際のソースコードを見ながら理解を深めていきましょう。
目次
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コンポーネントを使用すれば、処理の間も操作できます。
- SE
- 途中でキャンセルできたり、様々なソースコードがあるのですね。参考になりました。
- PM
- それぞれのスタイルの違いを理解いただけたようですね。
VB.netでのプログレスバーについて正しく理解して使用しましょう。
いかがでしたでしょうか。VB.netでのプログレスバーについてや、ProgressBarコントロールを使用したプログレスバーの作成方法や、処理中でのキャンセル方法についてご紹介しました。
ぜひご自身でVB.netのソースコードを書いて、理解を深めてください。