none
den nächsten Wert in einem Array[Uhrzeiten] für Countdown benutzen wenn Countdown des jetzigen = 0 RRS feed

  • Frage

  • Hi zusammen,

    es soll praktisch weiter runtergezählt werden bis zur nächsten Uhrzeit des bereits sortierten Arrays

    Ich hoffe mal, dass ich mein Probblem halbwegs verständlich dargestellt habe

    Wäre sehr dankbar für jede Idee wie man das realisieren könnte.

     

    Montag, 14. November 2011 13:34

Alle Antworten

  • Hallo,

    Deine Beschreibung in einem Satz läßt zuviel Raum für Spekulationen.

    Welcher CountDown ist dort gemeint und wer oder was zählt da?

    Es wäre hilfreich, wenn Du einen Codeschnipsel bereitstellen würdest,
    anhand dessen man erkennen kann, was da passieren soll.

    Gruß Elmar

    Dienstag, 15. November 2011 09:40
    Beantworter
  •  
     public partial class MainPage
        {
            int[] timeofday = new int[] { 1440,1402,1416,1368, 1398 };
            //time of day in minutes since 00:00 oclock
             
            private DispatcherTimer timer;
            
            public MainPage()
            {
                InitializeComponent();
                Loaded += OnLoaded;
            }
    
            private void OnLoaded(object sender, RoutedEventArgs e)
            {
                timer = new DispatcherTimer
                {
                    Interval = TimeSpan.FromMilliseconds(100)
                };
    
                timer.Tick += OnTick;
                timer.Start();
                
                Array.Sort(timeofday);
            }
            
            private void OnTick(object sender, EventArgs e)
            {
                var next = DateTime.Today.AddMinutes(timeofday [0]);
                var timeLeft = next - DateTime.Now;
    
                Countdown.Text = String.Format("{0:D1}:{1:D2}:{2:D2}", timeLeft.Hours, timeLeft.Minutes, timeLeft.Seconds);  
            }
    
        }
    

    der countdown zählt ja bis timeofday[0] runter, also hier 1368 = 22:48 Uhr (kleinste Uhrzeit)

    Jetzt meine Frage: kann man das ganze nicht irgendwie  in eine Schleife packen, sodass der Countdown weiter zu timeofday[1] runterzählt, wenn die Uhrzeit timeofday[0] (timeLeft =0) erreicht wurde?

    anschließend weiter zu timeofday[2] usw

     

     

     

    Dienstag, 15. November 2011 10:21
  • Hi mattshark,

     

    du kannst oben noch eine Membervariable Deklarieren zB intCounter = 0.

    Im OnTick änderst du dann die zuweisung von next in:

    var next = DateTime.Today.AddMinutes(timeofday [intCounter]);

    Und nach dem zuweisen von timeLeft Prüst du ob timeLeft<=0 ist wenn ja Zahlst du deinen Count um einen Hoch.

    MFG

    Björn


    Dienstag, 15. November 2011 12:02
  • Hallo,

    da ein Zwischenspeichern den Aufwand nicht wert ist,
    kannst Du Dir die aktuell gültigen CountDown-Minute jeweils "beim Ticken" ermitteln.

    Unten rufe ich den aktuellen Wert jeweils über Linq ab,
    wobei ich zudem den Fall berücksichtigt habe, dass keine weitere Zeit mehr vorhanden ist.

        int[] timeofday = new int[] { 440, 402, 316, 168, 398, 869 };
    
        private void OnTick(object sender, EventArgs e)
        {
            // In Variable übernehmen (denn die Zeit in DateTime.Now läuft weiter)
            var now = DateTime.Now;
            var currentTime = (now - now.Date);
            var totalMinutes = (int)Math.Ceiling(currentTime.TotalMinutes); // ganze Minuten 
    
            // Nächstes CountDown abrufen
            // geht von sortiertem Array aus
            int? timeMinutes = this.timeofday
                .Cast<int?>()
                .FirstOrDefault(minute => minute >= totalMinutes);
    
            if (timeMinutes.HasValue)
            {
                var nextTime = now.Date.AddMinutes(timeMinutes.Value);
                var timeLeft = nextTime - now;
    
                this.CountDown.Text = String.Format("{0:hh\\:mm\\:ss}", timeLeft);
                //this.CountDown.Text = String.Format("{0:c}", timeLeft);   // genauer
    
                // this.CountDownMinutes.Text = nextTime.ToString();    // Anzeige der Auswahl
            }
            else
            {
                // Nichts mehr vorhanden
                this.CountDown.Text = "Abgelaufen";
                //this.CountDownMinutes.Text = "NULL";
            }
        }
    
    
    

    Als zusätzliche Hinweise:
    Beim Berechnen solltest Du die Werte in Variablen speichern. 
    Denn DateTime.Now kann zwischen zwei Aufrufen bereits einen neuen Wert annehmen -
    auch wenn das hier kaum ins Gewicht fallen dürfte.

    Auch dürfte der Timer mit 500 oder 1000ms ausreichend oft bedient sein.

    Zum Formatieren kann man sich der TimeSpan-Standardformatzeichenfolgen bedienen.

    Gruß Elmar

    Dienstag, 15. November 2011 13:34
    Beantworter
  • Vielen Dank für die Mühe hat wunderbar geklappt.
    Dienstag, 15. November 2011 14:20