型変換の警告が出るが公式の解説でOK

プログレスバーとは、インストール画面などでよく見かけますね。処理の進行具合を示すメーターのようなものです。今回は、タイマー処理とプログレスバーを組み合わせ、カウントプログラムを作ってみます。

早速、新規プロジェクトを作るわけですが、注意点が1つ。プログレスバーはコモンコントロールの部類に入り、新規プロジェクト ダイアログの2つ目の画面(プロジェクト オプションが設定できるところ)で、「コモンコントロールを使用する(api_commctrl.sbp)」にチェックを入れておかなければなりません。その点を踏まえ、プロジェクトを作成してみましょう(プロジェクト名は "TimeCount" とします)。


ちなみに、プロジェクト オプションは、プロジェクト作成後、メニューの「表示」→「プロジェクト オプション」からも変更することができます。

コントロール貼り付けの前に、ベースとなる "MainWnd" の設定を行います。ウィンドウ プロパティの「サイズ変更枠」を「細枠」にし、「最大化ボタン」のチェックを外しておきます。コントロールを貼り付けた後でも構いませんが、ウィンドウの大きさを適当でいいので設定しておくとよいでしょう。

では、以下のような構成になるよう、ウィンドウをデザインしましょう。



No. コントロール キャプション ID 備考
① エディット コントロール - EditBox1 Editプロパティのスタイルの「番号」をチェック
② スタティック テキスト 秒 Static1 -
③ ボタン カウント スタート CommandButton1 -
④ スタティック テキスト 残り時間:あとx秒 CountStatic ID名変更を忘れずに!
⑤ プログレスバー - ProgressBar1 -


ウィンドウ デザインが完了したら、イベント コーディングを始めます。コーディングを必要とするイベントは、以下の2つです。

  • 「カウント スタート」ボタン(CommandButton1)がクリックされたとき
  • Timerイベント

コーディング前の準備

"MainWnd.sbp" を開き、先頭部分でcount変数を定義します。このcount変数は、残り時間(秒)を記憶しておくためのグローバル変数です。

' ----------------------------------ここから----------------------------------

Dim count As Long

' ----------------------------------ここまで----------------------------------



「カウント スタート」ボタン(CommandButton1)がクリックされたときのイベント

"MainWnd" のRAD画面にある、「カウント スタート」ボタンをダブルクリックし、表示されたプロシージャを以下のようにコーディングします。

EditBox1の文字列を取得し、それを数値に変換したものをcount変数にコピーしています。プログレスバーに PBM_SETRANGE、PBM_SETSTEP メッセージを送ることで、プログレスバーの目盛りの大きさ、ワンステップで進む数を設定します。最後に、SetTimer関数でタイマーを始動します。始動されたタイマーは、指定された時間(ここでは1秒ごと)がたつたびに、Timerイベントを呼び出します。

Sub MainWnd_CommandButton1_Click()
   Dim buf As String      '文字列バッファ
   Dim length As String   'buf変数のバッファのバイト数
   Dim hProgBar As Long   'プログレスバー ハンドル

   'エディット ボックス(EditBox1)の内容を文字列バッファbufにコピーする
   buf=String$(100,Chr$(0))
   GetWindowText(GetDlgItem(hMainWnd,EditBox1),buf,100)

   '文字列内の数値をcount変数に取り出す
   count=Val(buf)

   '数値が0以下のときは抜け出す
   If count<=0 Then Exit Sub

   'プログレスバーの初期設定を行う
   hProgBar=GetDlgItem(hMainWnd,ProgressBar1)                    'hProgBarにプログレスバーのハンドルを格納する
   SendMessage(hProgBar,PBM_SETRANGE,0,MAKELONG(0,count))  '長さをcount変数の内容にあわせる
   SendMessage(hProgBar,PBM_SETSTEP,1,0)                   'ステップ値を1にセットする
   SendMessage(hProgBar,PBM_SETPOS,0,0)                    '初期位置を0にセットする

   '残り時間の初期表示
   SetWindowText(GetDlgItem(hMainWnd,CountStatic),"残り時間:あと"+Str$(count)+"秒")

   'エディット ボックス(EditBox1)、「カウント」ボタン(CommandButton1)を無効にする
   EnableWindow(GetDlgItem(hMainWnd,EditBox1),FALSE)
   EnableWindow(GetDlgItem(hMainWnd,CommandButton1),FALSE)

   '1000ミリ秒(1秒)ごとにタイマーをセットする
   SetTimer(hMainWnd,0,1000,0)
End Sub



Timerイベント

"MainWnd" のRAD画面で「イベント処理」ダイアログを開き、Timerイベントをコーディングします。

このイベントはSetTimer関数が呼び出された後、KillTimer関数が呼び出されるまで、一定時間間隔(ここでは1秒ごと)で実行されます。count変数の値を1だけ減らし、0になったらKillTimer関数でタイマーをストップさせ、終了処理を行います。

Sub MainWnd_Timer(TimerID As Long)
   'カウンタの値を1だけ減らす
   count=count-1

   'プログレスバーを進める
   SendMessage(GetDlgItem(hMainWnd,ProgressBar1),PBM_STEPIT,0,0)

   If count Then
       'count変数の内容が0になっていないとき、残り時間の表示を設定し、プロシージャから抜け出す
       SetWindowText(GetDlgItem(hMainWnd,CountStatic),"残り時間:あと"+Str$(count)+"秒")
       Exit Sub
   End If

   '--------------------------------------------------------
   ' 以下、count変数の内容(残り時間)が0になったときの処理
   '--------------------------------------------------------

   'タイマーをストップさせる
   KillTimer(hMainWnd,0)

   '残り時間の表示位置に "タイマー終了" の文字列を表示する
   SetWindowText(GetDlgItem(hMainWnd,CountStatic),"タイマー終了")

   'エディット ボックス(EditBox1)、「カウント」ボタン(CommandButton1)を有効にする
   EnableWindow(GetDlgItem(hMainWnd,EditBox1),TRUE)
   EnableWindow(GetDlgItem(hMainWnd,CommandButton1),TRUE)
End Sub



これで作業は完了です。コンパイル、実行をし、プログレスバー、タイマー機能がきちんと動作するか試してみましょう。