「ポモドーロ・テクニックアプリ自作」25分作業して5分休憩を繰り返す

# ソースコード

```vb:vb.net
Public Class MyTimerFrom
    Private WithEvents timer As New Timer()
    Private startTime As DateTime
    Private remainingTime As TimeSpan
    Private breakTime As Boolean = False
    Private pausedTime As TimeSpan
    Private breakStartTime As DateTime ' 休憩開始時刻を記録するための変数を追加

    Public Sub New()
        InitializeComponent()

        ' デフォルトの時間を25分に設定
        txtMinutes.Text = "25"

        ' タイマーの間隔を1秒に設定
        timer.Interval = 1000

        ' ボタンのテキストを初期化
        btnStartStop.Text = "作業開始"

        Me.TopMost = ckbTop.Checked

    End Sub

    Private Sub btnStartStop_Click(sender As Object, e As EventArgs) Handles btnStartStop.Click
        If btnStartStop.Text = "作業開始" Or btnStartStop.Text = "作業再開" Then
            Dim minutes As Integer

            ' 入力を検証
            If Integer.TryParse(txtMinutes.Text, minutes) And minutes <= 99 Then
                If btnStartStop.Text = "作業開始" Then
                    startTime = DateTime.Now.AddMinutes(minutes)
                    remainingTime = TimeSpan.FromMinutes(minutes)
                Else
                    Dim aaa As Double = pausedTime.TotalMinutes
                    startTime = DateTime.Now.Add(TimeSpan.FromMinutes(aaa))
                    remainingTime = pausedTime
                End If

                timer.Start()

                ' ボタンのテキストを更新
                btnStartStop.Text = "一時停止"
            Else
                MessageBox.Show("無効な入力です！数字を入力してください。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error)
            End If
        ElseIf btnStartStop.Text = "一時停止" Then
            ' タイマーを停止
            timer.Stop()
            pausedTime = remainingTime

            ' ボタンのテキストを更新
            btnStartStop.Text = "作業再開"
        ElseIf btnStartStop.Text = "復帰" Then
            timer.Stop()
            breakTime = False
            ' ボタンのテキストを更新
            btnStartStop.Text = "作業開始"
            lblTime.Text = "00:00"
        End If
    End Sub

    'timer_Tickは、タイマーオブジェクトのTickイベントハンドラーです。このメソッドは、タイマーのIntervalプロパティで設定された間隔が経過するたびに自動的に呼び出されます。
    '上記のコードスニペットでは、timer.Interval = 1000と設定されています。これは、タイマーが1秒ごと（1000ミリ秒ごと）にTickイベントを発生させ、それに応じてtimer_Tickメソッドが呼び出されることを意味します。
    'したがって、timer_Tickメソッドは、タイマーが開始され(timer.Start())、そしてタイマーが動作している間は、1秒ごとに自動的に呼び出されます。
    Private Sub timer_Tick(sender As Object, e As EventArgs) Handles timer.Tick
        remainingTime -= TimeSpan.FromSeconds(1)

        If remainingTime.TotalSeconds <= 0 And btnStartStop.Text <> "復帰" Then
            timer.Stop()

            If breakTime Then
                ' 休憩時間が終了したら、リセット
                breakTime = False
                btnStartStop.Text = "作業開始"
                lblTime.Text = "00:00"
            Else
                ' 作業時間が終了したら、休憩を開始
                Dim form As New Form()
                form.TopMost = True
                form.Activate()
                MessageBox.Show(form, "時間です！休憩を取ってください。", "タイマー", MessageBoxButtons.OK, MessageBoxIcon.Information)
                ' OKボタンを押下したら、下記を実行
                breakStartTime = DateTime.Now ' 休憩開始時刻を記録 休憩が開始されるとすぐに経過時間が00:00からカウントアップし始めます
                timer.Start()
                breakTime = True
                btnStartStop.Text = "復帰"
                ckbTop.Checked = True
                Me.TopMost = ckbTop.Checked
                Me.Activate()
            End If
        Else
            ' ラベルを更新
            If breakTime Then
                ' 休憩中の場合、休憩の経過時間を表示
                Dim breakElapsedTime = DateTime.Now - breakStartTime
                lblTime.Text = breakElapsedTime.ToString("mm\:ss")
            Else
                ' 作業中の場合、残り時間を表示
                lblTime.Text = remainingTime.ToString("mm\:ss")
            End If
        End If
    End Sub

    Private Sub CheckBox1_CheckedChanged(sender As Object, e As EventArgs) Handles ckbTop.CheckedChanged
        Me.TopMost = ckbTop.Checked
    End Sub

    Private Sub btnReset_Click(sender As Object, e As EventArgs) Handles btnReset.Click
        timer.Stop()
        breakTime = False
        ' ボタンのテキストを更新
        btnStartStop.Text = "作業開始"
        lblTime.Text = "00:00"
    End Sub
End Class
```
## イメージ
### 起動
:::note info
00:00の文字設定は「Broadway, 48pt」です。
ディフォルト設定：25分間とするが、変更可能となります。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509696/b70f32ff-b811-5251-bdab-b8aca874002a.png)
### 作業開始押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509696/cde53309-26df-c636-ab90-823d2f6ef9d9.png)
### 一時停止押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509696/56b50d11-13c8-01f1-138a-a0402dd6aa37.png)
### 作業再開押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509696/d5d5e561-11ac-3c62-b996-3009dc0a1468.png)
### リセット押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509696/66b5d7e8-d000-707c-e99f-f76b74f0faf7.png)
### 設定時間に到達
:::note warn
スクリーンの最前面に表示
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509696/8b20dae4-4275-c940-3ea1-b9df5b43a586.png)
### OK押下
:::note info
休憩時間をカウントアップする
※スクリーンの最前面表示を自動的に設定
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509696/9388b060-061b-7789-b8bd-b87a87684fef.png)
### 復帰押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509696/b542f529-166a-2993-1c16-1618b5f9ecc5.png)