Почему при изменении секунд trackBar влево, а затем при запуске таймера он начинает с более высоких секунд / с? - PullRequest
0 голосов
/ 01 октября 2018

Например, если я установлю trackBar часов на 3, trackBar минут на 5 и нижний trackBar секунд на 6, затем, нажав кнопку пуска, начнется обратный отсчет, начиная с 6 секунд.

Но затем я нажимаю кнопку «Стоп», изменяя trackBar секунд только с 6 до 3, затем нажимаю кнопку «Пуск», он начинает обратный отсчет, но с 6 секунд, а не с 3. Я изменил значение trackBar каксекунд до 3, но начинается с 6. Не знаю, почему.

public partial class Form1 : Form
{
    private static readonly Stopwatch watch = new Stopwatch();
    private long diff = 0, previousTicks = 0, ticksDisplayed = 0;

    public Form1()
    {
        InitializeComponent();

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

        UpdateTime();
    }

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

    private void UpdateTime()
    {
        richTextBox1.Text = GetTimeString(watch.Elapsed);
    }

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

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

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

        if (ticksDisplayed < 0)
        {
            ticksDisplayed = 0;
        }

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

        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 btnStart_Click(object sender, EventArgs e)
    {
        if (btnStart.Text == "START")
        {
            watch.Reset();
            watch.Start();
            UpdateTime();
            btnStart.Text = "STOP";
            timer1.Enabled = true;
        }
        else
        {
            watch.Stop();
            btnStart.Text = "START";
            btnPause.Text = "PAUSE";
            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;
        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;


        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;


        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;


        UpdateTime();
    }

    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();
    }
}

На данный момент я проверил это только с помощью trackBar секунд, когда изменился на 6, например, секунды, затем старт, затем останов, затемизменив его на 3, затем начните снова, он будет начинаться с 6, а не с 3.

1 Ответ

0 голосов

Это потому, что при сбросе Stopwatch вы не установили время для значений трекбара:

if( button1.Text == "START" ) {
    watch.Reset();

    //Here
    TimeSpan ctimeSpan = new TimeSpan( 0, trackBar1.Value, trackBar2.Value, trackBar3.Value, 0 );
    diff = 0;
    previousTicks = 0;
    ticksDisplayed = ctimeSpan.Ticks;

    watch.Start();
    button1.Text = "STOP";
    timer1.Enabled = true;
}
else {
    watch.Stop();
    button1.Text = "START";
    button2.Text = "PAUSE";
    timer1.Enabled = false;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...