このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

【6日でできるVisual Basic2022入門】④コードの実装と実行:ラーメンタイマーアプリの完成

④コードの実装と実行:ラーメンタイマーアプリの完成

 本章では、ラーメンタイマー完成のための実装と実行確認を行います。ButtonStart.ClickInteger.TryParseによる検証、EndSeconds/Elapsed初期化、Timer1.Start()、進行中の入力欄・ボタン無効化を実施。Timer1.Tickで1秒ごとに残り秒を更新し、0到達でTimer1.Stop()、UIを復帰、SystemSounds.Asterisk.Play()MessageBox.Showで通知。二重起動防止や境界値にも配慮します。

4.コードの実装と実行:ラーメンタイマーアプリの完成

4.1. 完成コード(FormRamenTimer.vb)

 下記はラーメンタイマーアプリの完成版です。前章のコントロール名・プロパティを前提にしています。

Imports System.Media

Public Class FormRamenTimer
    ' 入力された合計秒
    Private EndSeconds As Integer
    ' 経過秒
    Private Elapsed As Integer

    Private Sub FormRamenTimer_Load(sender As Object, e As EventArgs) _
        Handles MyBase.Load
        ' 初期表示(例)
        TextRemaining.Text = ""
        ' Enter で開始(前章で設定済みの場合は不要)
        Me.AcceptButton = ButtonStart
    End Sub

    ' Start ボタンクリック
    Private Sub ButtonStart_Click(sender As Object, e As EventArgs) _
        Handles ButtonStart.Click

        ' 1) 入力検証
        Dim input As Integer
        If Not Integer.TryParse(TextSetSeconds.Text, input) OrElse input <= 0 Then
            MessageBox.Show("ゆで時間は 1 以上の整数で入力してください。", "入力エラー")
            TextSetSeconds.Focus()
            TextSetSeconds.SelectAll()
            Exit Sub
        End If

        ' 実用上の上限(任意):最大 3600 秒に制限
        If input > 3600 Then
            MessageBox.Show("最大 3600 秒までにしてください。", "入力エラー")
            TextSetSeconds.Focus()
            TextSetSeconds.SelectAll()
            Exit Sub
        End If

        ' 2) 変数初期化
        EndSeconds = input
        Elapsed = 0
        TextRemaining.Text = EndSeconds.ToString()

        ' 3) UI の状態変更
        TextSetSeconds.Enabled = False
        ButtonStart.Enabled = False

        ' 4) タイマースタート(1秒間隔)
        Timer1.Interval = 1000
        Timer1.Start()
    End Sub

    ' 1秒毎の処理
    Private Sub Timer1_Tick(sender As Object, e As EventArgs) _
        Handles Timer1.Tick

        Elapsed += 1
        Dim remaining = EndSeconds - Elapsed
        If remaining < 0 Then remaining = 0

        ' 画面更新
        TextRemaining.Text = remaining.ToString()

        ' 終了判定
        If remaining = 0 Then
            Timer1.Stop()

            ' UI の状態を元に戻す
            TextSetSeconds.Enabled = True
            ButtonStart.Enabled = True
            TextSetSeconds.Focus()
            TextSetSeconds.SelectAll()

            ' 通知(音+メッセージ)
            SystemSounds.Asterisk.Play()
            MessageBox.Show("麺がゆで上がりました!お好みの固さでお召し上がりください。", "ラーメンタイマー")
        End If
    End Sub
End Class

4.2. 主要コードの要点解説

位置コード要素役割・ポイント
クラス先頭EndSeconds, Elapsed合計秒・経過秒をフォーム全体で共有するためのフィールド
LoadHandles MyBase.Loadフォーム表示直前に初期化。AcceptButton の設定など
Start クリックInteger.TryParse例外を出さずに数値検証。Exit Sub で早期リターン
Start クリックEnabled=False実行中の二重開始を防止。入力欄もロック
TickTimer1.Interval=10001 秒毎に Tick イベント発生
Tickremaining = EndSeconds - Elapsed残り秒の計算と表示更新
TickStop() → 通知0 秒到達で停止。SystemSounds.Asterisk.Play()MessageBox.Show

4.3. Visual Basic 2022 の関連 API/言語機能の解説

要素概要使いどころ
Handlesメソッドとイベントの関連付けButtonStart.ClickTimer1.Tick など
Integer.TryParse(String, ByRef Integer)変換の成否を真偽値で返す入力検証(例外を避けたい時)
Exit Sub現在のサブルーチンを即終了バリデーション NG 時の早期退出
Timer.Interval/Start/Stop周期イベントの制御1 秒カウントダウン
MessageBox.Show(text, caption)モーダル通知ダイアログ完了メッセージの表示
System.Media.SystemSoundsOS 標準の効果音完了を聴覚的に通知

4.4. 実行手順と期待結果

  1. RamenTimer」ボタンで起動
  2. 「ゆで時間(秒)」に 180 と入力
  3. Enter または Start をクリック
  4. 「残り時間(秒)」が 180, 179, 178 … と 1 秒ごとに更新
  5. 0 で音が鳴り、ダイアログに「麺がゆで上がりました!お好みの固さでお召し上がりください。」と表示
  6. OK を押すとボタンと入力欄が再び操作可能

実行結果

残り時間(秒) 180 → 179 → ... → 0
🔔 ピロン → [麺がゆで上がりました!...]

4.5. 動作確認チェックリスト

観点期待確認方法
入力検証文字や 0、負数でエラー表示「abc」「0」「-5」で Start
二重起動防止実行中は Start 連打できない。進行中にボタンが無効化
画面更新1 秒ごとに残り秒が減る。目視でカウントダウン
完了時処理音+メッセージ、UI 復帰0 秒到達時の挙動
フォーカス戻し入力欄へ選択状態完了後に再編集しやすい。

4.6. よくあるつまずきと対処

症状原因対処
Tick が発生しないTimer1 がフォームに無い/Start() していないコンポーネントトレイに Timer1 を追加、Start() 呼び出し確認
「Form1 が見つからない」フォーム名変更後の起動先不一致プロジェクトの「スタートアップ オブジェクト」を FormRamenTimer
残り時間がマイナス表示終了判定が遅いIf remaining < 0 Then remaining = 0 を入れる
実行中に再入力できてしまう入力欄を無効化していないStart 後に TextSetSeconds.Enabled=False

4.7. 追加課題(拡張のヒント)

  • 停止・再開ボタンの追加(Timer1.Enabled の切り替え)
  • 残り時間の mm:ss 表示(TimeSpan.FromSeconds(remaining).ToString("mm\:ss")
  • 完了時に任意のサウンドファイル再生(My.Computer.Audio.Play

まとめ

 本章では、Start クリックと Tick の 2 本のイベントハンドラーを中心に、入力検証→初期化→カウントダウン→通知までの一連の流れを実装しました。これでラーメンタイマーは完成です。次は拡張課題として停止/再開や mm:ss 表示などを加えると実用性がさらに高まります。