» Poradna » Programy

Stopky v C#

 |   | 

Ahojky Protože jste mi minule moc pěkně pomohli s kalkulačkou v C#, tak se na vás obracím znovu.

Ve škole jsem udělali jednoduché stopky pomocí timer.

Máme label, ve kterém je text Čas: 1s a pak 3 tlačítka, Start, Stop, Smaž. Vše mi normálně funguje, ale dostali jsme Dú a to, že naše stopky počítají ve vteřinách a je problém, třeba 500s

Takže máme za úkol to udělat tak, aby místo 61s bylo napsáno 1min1s a pokračovalo to normálně dál 1min2s a tak dále. Hledal jsem na internetu, vím že je něco jako new imespan (0,0,1), ale vůbec nevím jak to použít a tak.

Doufám, že se znovu úspěšně dostaneme ke konci. Děkju ji moc za případné odpovědi a rady.

Mohlo by vás také zajímat

Odpovědi na otázku

 | 

TimeSpan aktualnycas = new TimeSpan( 0, 0, pocitadlosekund );
labelZobrazCas.Text = aktualnycas.ToString();

toto ti zobrazi spravne cas v tvare hodiniek tj 00:00:00 zmenu na text typu 1 min 2 s uy dufam zvladnes aj sam

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

Máto jeden háček a to velký:
The best overloaded method match for 'System.TimeSpan.TimeSpan(int, int, int)' has some invalid arguments C:\Users\Radek\Documents\Visual Studio 2008\Projects\Prvni Aplikace\Timer\Form1.cs 25 36 Timer

Souhlasím  |  Nesouhlasím  |  Odpovědět
 | 

No a co se snažíš narvat do toho pocitadlasekund?

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

Mno asi bude lepší, sem zkopírovat kód, pak se bude radit lépe. Toto jsou moje funkční stopky.
Jenom nevím, co upravit podle první odpovědi, aby to fungovalo.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Timer
{
public partial class Form1 : Form
{
double i = 0;
public Form1()
{
InitializeComponent();
}

private void timer1_Tick(object sender, EventArgs e)
{
i = i + 0.1;
label1.Text = "Čas: " + i + " s";
}

private void btnStart_Click(object sender, EventArgs e)
{
timer1.Enabled = true;
label1.Text = "Čas: " + i + " s";

}

private void btnStop_Click(object sender, EventArgs e)
{
timer1.Enabled = false;
label1.Text = "Čas: " + i + " s";

}

private void btnSmazat_Click(object sender, EventArgs e)
{
i = 0;
label1.Text = "Čas: " + i + "s";
}
}
}


Souhlasím  |  Nesouhlasím  |  Odpovědět
 | 

Tomuhle bych funkční stopky neříkal, za chvíli se ti začnou pěkně zpožďovat.

DateTime start;

private void timer1_Tick(object sender, EventArgs e)
{
TimeSpan ts = DateTime.Now - start;
label1.Text = String.Format("Čas: {0} s", ts);
}

private void btnStart_Click(object sender, EventArgs e)
{
timer1.Enabled = true;
start = DateTime.Now;
label1.Text = "Čas: 0 s";
}

private void btnStop_Click(object sender, EventArgs e)
{
timer1.Enabled = false;
TimeSpan ts = DateTime.Now - start;
label1.Text = String.Format("Čas: {0} s", ts);
}

private void btnSmazat_Click(object sender, EventArgs e)
{
TimeSpan ts = DateTime.Now - start;
label1.Text = String.Format("Čas: {0} s", ts);
}

Souhlasím  |  Nesouhlasím  |  Odpovědět
 | 

Oprava:
private void btnSmazat_Click(object sender, EventArgs e)
{
label1.Text = "Čas: 0 s"
}

Souhlasím  |  Nesouhlasím  |  Odpovědět
 | 

Presne jak pise wikan. Ty "stopky" meri cas velice nepresne. Na 1minute maji odchylku asi 5s.

Kdyztak tady si to muzes porovnat (mas tam napsanou i chytrejsi metodu na prevod casu):

double i = 0;
DateTime start = DateTime.Now;
DateTime pauseStart = DateTime.Now;

private void btnStart_Click(object sender, EventArgs e)
{
timer1.Enabled = true;
start += DateTime.Now - pauseStart;
label1.Text = "Čas: " + i + " s";
label2.Text = "Čas: " + ShowTime(DateTime.Now - start);
}

private void btnStop_Click(object sender, EventArgs e)
{
timer1.Enabled = false;
pauseStart = DateTime.Now;
label1.Text = "Čas: " + i + " s";
label2.Text = "Čas: " + ShowTime(DateTime.Now - start);
}

private void btnSmazat_Click(object sender, EventArgs e)
{
i = 0;
start = pauseStart = DateTime.Now;
label1.Text = "Čas: " + i + " s";
label2.Text = "Čas: " + ShowTime(DateTime.Now - start);
}

private void timer1_Tick(object sender, EventArgs e)
{
i = i + 0.1;
label1.Text = "Čas: " + i + " s";
label2.Text = "Čas: " + ShowTime(DateTime.Now - start);
}

private string ShowTime(TimeSpan time)
{
StringBuilder sb = new StringBuilder(50);
if (time.Hours > 0) sb.Append(time.Hours).Append("h ");
if (time.Minutes > 0) sb.Append(time.Minutes).Append("m ");
sb.Append(time.Seconds).Append(".").Append(time.Milliseconds).Append("s");
return sb.ToString();
}

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

Díky, to tvoje funguje parádně a měl jsi pravdu, nechal jsem je běžet cca hodinu výsledek byl velmi odlišný. Moc díky, že jsi ukázal správnou cestu, dokonce i chápu, jak jsi to udělal, jenom nechápu dole ten převod, ale to nevadí. Na to přijdu také.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 | 

Mno ten prevod. mozny je, ze te zmatl ten StringBuilder. Dalo by se to zapsat i takto:
string s = string.Empty;
if (time.Hours > 0) s+= time.Hours + "h ";
if (time.Minutes > 0) s+= time.Minutes + "m ";
s+= time.Seconds + "." + time.Milliseconds + "s";
return s;

Je to jednoduche. Proste kdyz je cas delsi nez 0 hodin. Tak tam zapisu 1h.
Kdyz je delsi nez 1 minuta, tak tam zapisu 1m.
A pak tam nacpu cas v sekundach a milisekundach.
Jedinej rozdil je v tom ze ten StringBuilder pracuje mnohem rychleji nez tento zapis, ikdyz vysledek je stejny.

Takze pro dobu 1 hodina, 4 minuty, 3s to zapise: 1h 4m 3.0s
Jak ted na to koukam, tak v pripade 1h 0m 5s tam budou chybet ty minuty. tj zapis: 1h 5s. To nevim jestli je to prehledne, ale kdyz ne, tak staci rozsirit podminku (u tech minut a testovat i pocet hodin), aby to psalo 1h 0m 5s.

Souhlasím  |  Nesouhlasím  |  Odpovědět

Související témata: Stopky, Timer