Countdown-Tool mit Problemen

Cyperfriend

Der ohne Avatar
Registriert
14 Juli 2013
Beiträge
1.123
Ich habe mir ein Countdown-Tool geschrieben, dass nach Ablauf der Zeit einen Ton abspielt. Funktioniert sogar :D.

Nun will ich die Zeit aber nicht in Sekunden angeben, sondern im Format 01:12:45, also 1 Stunde, 12 Minuten 45 Sekunden. Die Zeit soll dann auch entsprechend so angezeigt ablaufen. Wie kann ich das bewerkstelligen? Hier der bisherige Code und ein Screenshot des Programms.

Anhang anzeigen 34667
[src=csharp]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;
using System.Media;

namespace Timer
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

// Globale Variablen
int alarm1;
int alarm2;
int alarm3;

SoundPlayer sp = new SoundPlayer("sound.wav");

// Timer #1
private void txtTimer1_MouseClick(object sender, MouseEventArgs e)
{
txtTimer1.Text = "";
}

private void txtBeschreibung1_MouseClick(object sender, MouseEventArgs e)
{
txtBeschreibung1.Text = "";
}

private void cmdStartTimer1_Click(object sender, EventArgs e)
{
// Prüfen, ob der Timer1 bereits läuft
if (timer1.Enabled)
{
timer1.Enabled = false;
cmdStartTimer1.Text = "Weiter";
}
else
{
timer1.Enabled = true;
cmdStartTimer1.Text = "Pause";
alarm1 = Convert.ToInt32(txtTimer1.Text);
}
}

private void timer1_tick(object sender, EventArgs e)
{
// Immer eine Sekunde abziehen und dies im Textfeld anzeigen
alarm1 -= 1;
txtTimer1.Text = Convert.ToString(alarm1);

// Wenn der Timer1 abgelaufen ist
if (alarm1 == 0)
{
sp.Play();
timer1.Enabled = false;
cmdStartTimer1.Text = "Start";
return;
}
}

// Timer #2
private void txtTimer2_MouseClick(object sender, MouseEventArgs e)
{
txtTimer2.Text = "";
}

private void txtBeschreibung2_MouseClick(object sender, MouseEventArgs e)
{
txtBeschreibung2.Text = "";
}

private void cmdStartTimer2_Click(object sender, EventArgs e)
{
// Prüfen, ob der Timer2 bereits läuft
if (timer2.Enabled)
{
timer2.Enabled = false;
cmdStartTimer2.Text = "Weiter";
}
else
{
timer2.Enabled = true;
cmdStartTimer2.Text = "Pause";
alarm2 = Convert.ToInt32(txtTimer2.Text);
}
}

private void timer2_tick(object sender, EventArgs e)
{
// Immer eine Sekunde abziehen und dies im Textfeld anzeigen
alarm2 -= 1;
txtTimer2.Text = Convert.ToString(alarm2);

// Wenn der Timer2 abgelaufen ist
if (alarm2 == 0)
{
sp.Play();
timer2.Enabled = false;
cmdStartTimer2.Text = "Start";
return;
}
}

// Timer #3
private void txtTimer3_MouseClick(object sender, MouseEventArgs e)
{
txtTimer3.Text = "";
}

private void txtBeschreibung3_MouseClick(object sender, MouseEventArgs e)
{
txtBeschreibung3.Text = "";
}

private void cmdStartTimer3_Click(object sender, EventArgs e)
{
// Prüfen, ob der Timer3 bereits läuft
if (timer3.Enabled)
{
timer3.Enabled = false;
cmdStartTimer3.Text = "Weiter";
}
else
{
timer3.Enabled = true;
cmdStartTimer3.Text = "Pause";
alarm3 = Convert.ToInt32(txtTimer3.Text);
}
}

private void timer3_tick(object sender, EventArgs e)
{
// Immer eine Sekunde abziehen und dies im Textfeld anzeigen
alarm3 -= 1;
txtTimer3.Text = Convert.ToString(alarm3);

// Wenn der Timer3 abgelaufen ist
if (alarm3 == 0)
{
sp.Play();
timer3.Enabled = false;
cmdStartTimer3.Text = "Start";
return;
}
}
}
}[/src]
 
Deine Zeichenkette sieht doch stets so aus: a:b:c
Wobei b, c [0, 59], a [0, "unendlich"] und (int)a, b, c

In Java würde ich das so schreiben:

[src=java]
// time String to int
String countdown = "01:15:36"; // with or without leading zeros
String[] parts = countdown.split(":"); // String array with hours, minutes, seconds as keys 0, 1, 2
int seconds = Integer.parseInt(parts[1]) * 3600 + Integer.parseInt(parts[1]) * 60 + Integer.parseInt(parts[2]);

// count down
seconds--;

// rebuild time String
int hours = Math.floor(seconds / 3600); // only hours
seconds = seconds % 3600; // remaining seconds
int minutes = Math.floor(seconds / 60); // only minutes
seconds = seconds % 60; // remaining seconds
String newCountdown = Integer.toString(hours) + ":" + Integer.toString(minutes) + ":" + Integer.toString(seconds);
[/src]

Um den Code stabiler zu machen, würde ich allerdings empfehlen zunächst zu überprüfen, ob die Eingabe tatsächlich dem gewünschten Format entspricht.

--- [2015-05-10 20:41 CEST] Automatisch zusammengeführter Beitrag ---

Als Implementierung könnte das in Java circa so aussehen:

[src=java]class Countdown {
private int remainingTime;
private ArrayList<MyListener> listeners;

public Countdown(String time){
String[] parts = countdown.split(":"); // String array with hours, minutes, seconds as keys 0, 1, 2
this.remainingTime = Integer.parseInt(parts[1]) * 3600 + Integer.parseInt(parts[1]) * 60 + Integer.parseInt(parts[2]);
listeners = new ArrayList<>();
}

public boolean register(MyListener l){
return listeners.add(l);
}

public boolean unregister(MyListener l){
return listeners.remove(l);
}

public void tick(){
remainingTime--;
for(MyListener l : listeners){
l.update();
}
}

public String remainingTimeString(){
return remainingTime;
}

public String remainingTimeString(){
int seconds = remainingTime;
int hours = Math.floor(seconds / 3600); // only hours
seconds = seconds % 3600; * * * * * * * * // remaining seconds
int minutes = Math.floor(seconds / 60); // only minutes
seconds = seconds % 60; * * * * * * * * * *// remaining seconds
return Integer.toString(hours) + ":" + Integer.toString(minutes) + ":" + Integer.toString(seconds);[/QUOTE]
}
}[/src]

Wird vom Nutzer ein neuer Countdown angegeben, so erstellst du dir ein neues Countdown-Objekt, initialisierst es mit dem String, den der Nutzer als Zeit eingegeben hat, registrierst einen Listener mit der Methode update(), der sich aus dem Countdown-Objekt mittels remainingTimeString() die verbleibende Zeit als String formatiert heraus holt.
 
Zurück
Oben