» 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: Timer



EA restrukturalizuje. O Battlefield se nově postará Vince Zampella z Respawnu

EA restrukturalizuje. O Battlefield se nově postará Vince Zampella z Respawnu

Tvůrce Titanfallu hodlá vnést do válečné série čerstvou krev.

Michal Maliarov
DiceBattlefield
Lék proti depresi za stokorunu snižuje riziko těžkého průběhu i úmrtí na onemocnění covid-19

Lék proti depresi za stokorunu snižuje riziko těžkého průběhu i úmrtí na onemocnění covid-19

** Klinická studie zkoumala vliv antidepresiva fluvoxamin na covid-19 ** Počet úmrtí souvisejících s covidem-19 klesl zhruba o 90 % ** Potřeba intenzivní lékařské péče se snížila zhruba o 65 %

Karel Kilián
COVID-19LékyDepreseMedicína
Nejvíc sexy holky ve filmech: 60 nejslavnějších erotických symbolů

Nejvíc sexy holky ve filmech: 60 nejslavnějších erotických symbolů

Krásné ženy jsou pro mnohé erotické a sex symboly. Vybrali jsme ty nejslavnější z několika desetiletí filmové a seriálové tvorby. Najdete zde nejen fotografie, ale také název díla, které herečku proslavilo.

Marek Čech
Filmy a seriály
Recenze Windows 11. Microsoft nás opíjí rohlíkem a omezuje použitelnost

Recenze Windows 11. Microsoft nás opíjí rohlíkem a omezuje použitelnost

** Oproti Desítkám významně stouply hardwarové požadavky ** Windows 11 mají nový vzhled, ale výrazně narušují workflow. ** Potěší vyhledávání, multitasking i rychlejší aktualizace

Petr Urban
Windows 11Testy
Rusko obviňuje astronautku NASA ze sabotáže Mezinárodní vesmírné stanice
Jiří Černý
Mezinárodní vesmírná staniceNASARusko
Nová volitelná aktualizace systému Windows 10 opravuje 38 problémů
Karel Kilián
Windows UpdateAktualizaceWindows 10

Aktuální číslo časopisu Computer

Megatest bezdrátových sluchátek

Test dvoudiskových NASů

Průvodce nákupem základní desky