Daniel Lip
Daniel Lip

Reputation: 11317

How can I add a designer control the form for setting a target time?

When the timer is getting to this time to stop.

Set target

The box is a small richTextBox and above it I added a small label "Set time target".

Either the timer is counting up or down when getting to the target time stop everything.

I'm not sure if using richTextbox or textBox and how to make that the user can change the time input and then to take effect either when the watch/timer are running or if not running so it will stop when getting to the target time.

The format inside the richTextBox/textBox should be 00:00:00 hours/minutes/second

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
using System.IO;
using DannyGeneral;

namespace StopwatchTimer
{
    public partial class Form1 : Form
    {
        private static readonly Stopwatch watch = new Stopwatch();
        private long diff = 0, previousTicks = 0, ticksDisplayed = 0;
        private OptionsFile optionsfile = new OptionsFile(Path.GetDirectoryName(Application.LocalUserAppDataPath) + "\\Settings.txt");
        private string result;
        private bool runOnStart = false;
        private bool countingDown = false;

        public Form1()
        {
            InitializeComponent();

            richTextBox1.TabStop = false;
            richTextBox1.ReadOnly = true;
            richTextBox1.BackColor = Color.White;
            richTextBox1.Cursor = Cursors.Arrow;
            richTextBox1.Enter += RichTextBox1_Enter;

            trackBarHours.Value = Convert.ToInt32(optionsfile.GetKey("trackbarhours"));
            trackBarMinutes.Value = Convert.ToInt32(optionsfile.GetKey("trackbarminutes"));
            trackBarSeconds.Value = Convert.ToInt32(optionsfile.GetKey("trackbarseconds"));

            richTextBox1.Text = optionsfile.GetKey("result");

            TimeSpan ctimeSpan = new TimeSpan(0, trackBarHours.Value, trackBarMinutes.Value, trackBarSeconds.Value, 0);
            ticksDisplayed = ctimeSpan.Ticks;

            radioButton1.Checked = GetBool("radiobutton1");

            if (ticksDisplayed > 0 && radioButton1.Checked == false)
                radioButton2.Checked = true;

            if (ticksDisplayed == 0)
                radioButton1.Checked = true;

            if(trackBarHours.Value == 0 && trackBarMinutes.Value == 0 && trackBarSeconds.Value == 0)
            {
                btnPause.Enabled = false;
                btnReset.Enabled = false;
            }
            else
            {
                btnPause.Enabled = false;
                btnReset.Enabled = true;
            }

            runOnStart = GetBool("runonstart");
            if(runOnStart == true)
            {
                autoRunOnStart.Checked = true;
                StartOnRun();
            }
            else
            {
                autoRunOnStart.Checked = false;
            }
        }

        private void RichTextBox1_Enter(object sender, EventArgs e)
        {
            btnStart.Focus();
        }

        private void UpdateTime()
        {
            if (ticksDisplayed > 0)
                btnReset.Enabled = true;

            richTextBox1.Text = GetTimeString(watch.Elapsed);
            optionsfile.SetKey("result", result.ToString());
        }

        private string GetTimeString(TimeSpan elapsed)
        {
            result = string.Empty;

            //calculate difference in ticks
            diff = elapsed.Ticks - previousTicks;

            if (radioButton1.Checked == true)
            { //counting up
                ticksDisplayed += diff;
            }
            else
            {
                if (countingDown)
                {
                    ticksDisplayed += diff;
                }
                else
                {
                    //counting down
                    ticksDisplayed -= diff;
                }
            }

            if (ticksDisplayed < 0)
            {
                ticksDisplayed = 0;

                watch.Stop();
                btnStart.Text = "START";
                btnPause.Text = "PAUSE";
                btnPause.Enabled = false;
                if (trackBarHours.Value == 0 && trackBarMinutes.Value == 0 && trackBarSeconds.Value == 0 && ticksDisplayed == 0)
                {
                    btnReset.Enabled = false;
                }

                timer1.Enabled = false;
            }

            //Make ticksDisplayed to regular time to display in richtextbox
            TimeSpan ctimeSpan = new TimeSpan(ticksDisplayed);

            if (trackBarHours.Value != ctimeSpan.Hours) { trackBarHours.Value = ctimeSpan.Hours; }
            if (trackBarMinutes.Value != ctimeSpan.Minutes) { trackBarMinutes.Value = ctimeSpan.Minutes; }
            if (trackBarSeconds.Value != ctimeSpan.Seconds) { trackBarSeconds.Value = ctimeSpan.Seconds; }

            result = string.Format("{0:00}:{1:00}:{2:00}.{3:000}",
                ctimeSpan.Hours,
                ctimeSpan.Minutes,
                ctimeSpan.Seconds,
                ctimeSpan.Milliseconds);

            previousTicks = elapsed.Ticks;

            return result;
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void btnStart_Click(object sender, EventArgs e)
        {
            if (btnStart.Text == "START")
            {
                watch.Reset();

                TimeSpan ctimeSpan = new TimeSpan(0, trackBarHours.Value, trackBarMinutes.Value, trackBarSeconds.Value, 0);
                diff = 0;
                previousTicks = 0;
                ticksDisplayed = ctimeSpan.Ticks;

                watch.Start();
                btnStart.Text = "STOP";
                btnPause.Enabled = true;
                btnReset.Enabled = true;
                timer1.Enabled = true;
            }
            else
            {
                watch.Stop();
                btnStart.Text = "START";
                btnPause.Text = "PAUSE";
                btnPause.Enabled = false;
                if (trackBarHours.Value == 0 && trackBarMinutes.Value == 0 && trackBarSeconds.Value == 0 && ticksDisplayed == 0)
                {
                    btnReset.Enabled = false;
                }
                else
                {
                    btnReset.Enabled = true;
                }

                if (ticksDisplayed > 0)
                    btnReset.Enabled = true;

                timer1.Enabled = false;
            }
        }

        private void btnReset_Click(object sender, EventArgs e)
        {
            watch.Reset();

            diff = 0;
            previousTicks = 0;
            ticksDisplayed = 0;
            trackBarHours.Value = 0;
            trackBarMinutes.Value = 0;
            trackBarSeconds.Value = 0;

            if (btnPause.Text == "PAUSE" && btnStart.Text == "STOP")
                watch.Start();

            if (trackBarHours.Value == 0 && trackBarMinutes.Value == 0 && trackBarSeconds.Value == 0)
            {
                btnReset.Enabled = false;
            }
            else
            {
                btnReset.Enabled = true;
            }

            if (radioButton2.Checked && ticksDisplayed == 0)
            {
                countingDown = true;
                radioButton2.Checked = false;
                radioButton1.Checked = true;
            }

            UpdateTime();
        }

        private void trackBarHours_Scroll(object sender, EventArgs e)
        {
            //get ticksDisplayed as TimeSpan
            TimeSpan ctimeSpan = new TimeSpan(ticksDisplayed);
            //change only the hour
            TimeSpan htimeSpan = new TimeSpan(ctimeSpan.Days, trackBarHours.Value, ctimeSpan.Minutes, ctimeSpan.Seconds, ctimeSpan.Milliseconds);

            //set it to ticksDisplayed and update.
            ticksDisplayed = htimeSpan.Ticks;

            TrackbarsScrollStates();

            optionsfile.SetKey("trackbarhours", trackBarHours.Value.ToString());

            UpdateTime();
        }

        private void trackBarMinutes_Scroll(object sender, EventArgs e)
        {
            TimeSpan ctimeSpan = new TimeSpan(ticksDisplayed);
            TimeSpan mtimeSpan = new TimeSpan(ctimeSpan.Days, ctimeSpan.Hours, trackBarMinutes.Value, ctimeSpan.Seconds, ctimeSpan.Milliseconds);

            ticksDisplayed = mtimeSpan.Ticks;

            TrackbarsScrollStates();

            optionsfile.SetKey("trackbarminutes", trackBarMinutes.Value.ToString());

            UpdateTime();
        }

        private void trackBarSeconds_Scroll(object sender, EventArgs e)
        {
            TimeSpan ctimeSpan = new TimeSpan(ticksDisplayed);
            TimeSpan stimeSpan = new TimeSpan(ctimeSpan.Days, ctimeSpan.Hours, ctimeSpan.Minutes, trackBarSeconds.Value, ctimeSpan.Milliseconds);

            ticksDisplayed = stimeSpan.Ticks;

            TrackbarsScrollStates();

            optionsfile.SetKey("trackbarseconds", trackBarSeconds.Value.ToString());

            UpdateTime();
        }

        private void TrackbarsScrollStates()
        {
            if (trackBarSeconds.Value == 0 && trackBarHours.Value == 0 && trackBarMinutes.Value == 0)
                btnReset.Enabled = false;
            if (trackBarSeconds.Value > 0 || trackBarHours.Value > 0 || trackBarMinutes.Value > 0)
                btnReset.Enabled = true;
        }

        private void radioButton1_CheckedChanged(object sender, EventArgs e)
        {
            optionsfile.SetKey("radiobutton1", radioButton1.Checked.ToString());
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            optionsfile.SetKey("trackbarhours", trackBarHours.Value.ToString());
            optionsfile.SetKey("trackbarminutes", trackBarMinutes.Value.ToString());
            optionsfile.SetKey("trackbarseconds", trackBarSeconds.Value.ToString());
        }

        private void btnPause_Click(object sender, EventArgs e)
        {
            if (btnStart.Text == "STOP")
            {
                if (btnPause.Text == "PAUSE")
                {
                    btnPause.Text = "CONTINUE";
                    watch.Stop();
                    timer1.Enabled = false;
                }
                else
                {
                    btnPause.Text = "PAUSE";
                    watch.Start();
                    timer1.Enabled = true;
                }
            }
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            UpdateTime();
        }

        private void autoRunOnStart_CheckedChanged(object sender, EventArgs e)
        {
            if (autoRunOnStart.Checked)
            {
                runOnStart = true;
            }
            else
            {
                runOnStart = false;
            }

            optionsfile.SetKey("runonstart", runOnStart.ToString());
        }

        private void radioButton2_CheckedChanged(object sender, EventArgs e)
        {
            countingDown = false;
        }

        private void StartOnRun()
        {
            watch.Reset();

            TimeSpan ctimeSpan = new TimeSpan(0, trackBarHours.Value, trackBarMinutes.Value, trackBarSeconds.Value, 0);
            diff = 0;
            previousTicks = 0;
            ticksDisplayed = ctimeSpan.Ticks;

            watch.Start();
            btnStart.Text = "STOP";
            btnPause.Enabled = true;
            btnReset.Enabled = true;
            timer1.Enabled = true;
        }

        private bool GetBool(string keyname)
        {
            string radiobutton1 = optionsfile.GetKey(keyname);
            bool b;
            bool.TryParse(radiobutton1.Trim(), out b);

            return b;
        }
    }
}

Upvotes: 0

Views: 86

Answers (1)

You dont need a richtextbox. Use a DateTimePicker. Go to the properties and set:

Format : Custom

ShowUpDown : True

CustomFormat : HH:mm:ss

When ever you want to get the hour, minutes and seconds:

int hour = dateTimePicker1.Value.Hour;
int minutes = dateTimePicker1.Value.Minute;
int seconds = dateTimePicker1.Value.Second;

Upvotes: 1

Related Questions