Visual Studio Countdown?

3 Antworten

Z.B. so:

using System;
using System.Windows.Forms;
using System.Drawing;

class CountdownWindow : Form{
    private DateTime targetDate;
    private Timer updateTimer;
    private Label displayLabel;
    public CountdownWindow(){
        //Countdown bis zu diesem Datum
        targetDate = new DateTime(2019, 10, 31, 18, 0, 0).ToUniversalTime();
        
        //Fenstertitel
        Text = "Halloween Countdown 2019";
        
        ClientSize = new Size(425, 50);
        FormBorderStyle = FormBorderStyle.FixedToolWindow;
        updateTimer = new Timer(){Interval = 1000, Enabled = true};
        updateTimer.Tick += UpdateDisplay;
        displayLabel = new Label(){Dock = DockStyle.Fill, Font = new Font(FontFamily.GenericSansSerif, 15), TextAlign = ContentAlignment.MiddleCenter};
        Controls.Add(displayLabel);
        Shown += UpdateDisplay;
    }
    
    private void UpdateDisplay(object sender, EventArgs e){
        TimeSpan deltaT = targetDate - DateTime.UtcNow;
        displayLabel.Text = string.Format("{0} Days {1} Hours {2} Minutes {3} Seconds", deltaT.Days, deltaT.Hours, deltaT.Minutes, deltaT.Seconds);
    }
    
    public static void Main(string[] args){
        Application.Run(new CountdownWindow());
    }
}

Ggf. noch ein paar Anpassungen (z.B. die von regex9 vorgeschlagene Initialisierung/Synchronisierung) vornehmen und los gehts. ^^

Im Grunde berechnest du nur die verbleibende Zeit zwischen dem aktuellen Zeitpunkt und dem Endzeitpunkt an dem der Countdown enden soll. Dann benötigst du einen Timer, der die Anzeige mit der verleibenden Zeit immer wieder aktualisiert.

Jetzt ist der Knackpunkt wohl der, woher das Programm wissen soll welches Datum als Endzeitpunkt feststeht. Wenn der Zeitpunkt fix ist und du ihn nie wieder ändern willst, kannst du ihn natürlich im Quellcode hart kodieren.

Folgendes Beispiel zeigt dir einen Timer der jede Sekunde ein Label aktualisiert, welches du natürlich zunächst in deiner Windows-Form anlegen musst. Dort wird die verbleibende Zeit bis Weihnachten dargestellt. Die verleibende Zeit wird also jede Sekunde aktualisiert.

Timer myTimer = new Timer();
myTimer.Elapsed += new ElapsedEventHandler(DisplayTimeEvent);
myTimer.Interval = 1000; // 1000 ms ist eine Sekunde
myTimer.Start();

public static void DisplayTimeEvent(object source, ElapsedEventArgs e)
{
  TimeSpan span = DateTime.Now - new DateTime(2019, 12, 24); // Beispiel Weihnachten
  label1.Text = String.Format("{0} Stunden {1:D2} Minuten {2:D2} Sekunden", span.Hours, span.Minutes, span.Seconds);
}

Wie gesagt ist hier das Datum hart kodiert. Jeder der das Programm hat und startet wird die gleiche Zeit sehen, bis der Timer bei Null ankommt. Dann wird er negativ. Du kannst natürlich mit einer if-Abfrage den Timer bei 0 stoppen.

Wenn du das Datum für alle ändern willst, brauchst du eine zentrale Schnittstelle wie einen Server der auf Anfrage das Datum zurück gibt oder auch Fileserver, auf dem einfach eine Konfiguration liegt, die bei jedem Start neu eingelesen wird. Das ist dann natürlich etwas komplexer, da du für die Serverabfrage ein Programm auf der Gegenseite brauchst, welches die Anfrage versteht.

LG Knom

Woher ich das weiß:Studium / Ausbildung – Softwareentwickler mit 10 Jahren Berufserfahrung 💾

Für einen Countdown eignet sich die Timer-Klasse.

Damit die zu zählende Zeit überall gleich ist, würde ich die Anwendung wohl initial bei einem zentralen Server anfragen lassen, wie viel Sekunden noch gezählt werden müssen. Du benötigst also eine Netzwerkverbindung via Sockets / WCF oder einfacher einen WebRequest an einen HTTP-Server.

Eine Garantie der genauen Synchronität gibt es dennoch nicht, schließlich hängt dies von der gegebenen Netzwerkverbindung ab.