AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Countdown mit Stunden/Minuten

Ein Thema von jacky213 · begonnen am 5. Jun 2019 · letzter Beitrag vom 7. Jun 2019
Antwort Antwort
jacky213

Registriert seit: 2. Mär 2011
97 Beiträge
 
#1

Countdown mit Stunden/Minuten

  Alt 5. Jun 2019, 22:00
Moin,

Ich habe ein Panel mit einer Startzeit von ca. 35 Stunden und 15 Minuten. In der Caption steht also 30:15 und ich möchte nun damit einen Countdown realisieren der immer 1 Minute von dieser Zeit abzieht und auf dem Panel ausgibt.

Wenn ich aber mit StrToTime und EncodeTime arbeiten möchte bekomme ich die Fehlermeldung das es sich bei 30:15 nicht um eine korrekte Zeitangabe handelt. Das liegt wohl daran das 30 Stunden über dem Standart von 24 Stunden liegt. Wie kann ich das ganze trotzdem realisieren?
  Mit Zitat antworten Zitat
Benutzerbild von blawen
blawen

Registriert seit: 30. Nov 2003
Ort: Luterbach (CH)
365 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Countdown mit Stunden/Minuten

  Alt 5. Jun 2019, 22:06
Moin,

Ich habe ein Panel mit einer Startzeit von ca. 35 Stunden und 15 Minuten. In der Caption steht also 30:15 und ich möchte nun damit einen Countdown realisieren der immer 1 Minute von dieser Zeit abzieht und auf dem Panel ausgibt.

Wenn ich aber mit StrToTime und EncodeTime arbeiten möchte bekomme ich die Fehlermeldung das es sich bei 30:15 nicht um eine korrekte Zeitangabe handelt. Das liegt wohl daran das 30 Stunden über dem Standart von 24 Stunden liegt. Wie kann ich das ganze trotzdem realisieren?
Wie wäre es mit zwei Integer Zahlen und einer einfachen Logik?
Roland
  Mit Zitat antworten Zitat
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
890 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: Countdown mit Stunden/Minuten

  Alt 5. Jun 2019, 22:33
Vor dem Start des Timers die „Endzeit“ mittels IncMinute berechnen.

Im Timer dann Minutesbetween(now, Endzeit) und damit Stunden und Minuten entsprechend berechnen...

Wie blawen vorgeschlagen für Stunden und Minuten Integer-Werte zum rechnen nehmen...
Michael Kübler
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
1.972 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Countdown mit Stunden/Minuten

  Alt 6. Jun 2019, 06:54
Das hier "scandatetime" könnte dir vielleicht helfen, oder Du zerlegst die Elemente eben schnell selber.
  Mit Zitat antworten Zitat
Schokohase

Registriert seit: 17. Apr 2018
769 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#5

AW: Countdown mit Stunden/Minuten

  Alt 6. Jun 2019, 08:33
Hier ein dreckiges Beispiel
Delphi-Quellcode:
uses
  Winapi.Windows,
  Winapi.Messages,
  System.SysUtils,
  System.Variants,
  System.Classes,
  System.TimeSpan,
  System.Diagnostics,
  Vcl.Graphics,
  Vcl.Controls,
  Vcl.Forms,
  Vcl.Dialogs,
  Vcl.StdCtrls,
  Vcl.ExtCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    Button2: TButton;
    Timer1: TTimer;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    FDuration: TTimeSpan;
    FStopwatch: TStopwatch;
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function ParseCountdownTime(const s: string): TTimeSpan;
var
  parts: TArray<string>;
  Hours, Minutes: Integer;
begin
  parts := s.Split([':']);
  if Length(parts) <> 2 then
    raise EArgumentException.Create('Fehlermeldung');

  if not Integer.TryParse(parts[0], Hours) then
    raise EArgumentException.Create('Fehlermeldung');
  if (Hours < 0) then
    raise EArgumentException.Create('Fehlermeldung');

  if not Integer.TryParse(parts[1], Minutes) then
    raise EArgumentException.Create('Fehlermeldung');
  if (Minutes < 0) or (Minutes >= 60) then
    raise EArgumentException.Create('Fehlermeldung');

  Result := TTimeSpan.Create(Hours, Minutes, 0);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  FDuration := ParseCountdownTime(Edit1.Text);
  FStopwatch := TStopwatch.StartNew();
  Edit1.ReadOnly := True;
  Button1.Enabled := False;
  Button2.Enabled := True;
  Timer1.Enabled := True;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Timer1.Enabled := False;
  Button2.Enabled := False;
  Button1.Enabled := True;
  Edit1.ReadOnly := False;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  remain: TTimeSpan;
  Hours, Minutes: Integer;
begin
  remain := FDuration - FStopwatch.Elapsed;
  Hours := Trunc(remain.TotalHours);
  Minutes := remain.Minutes;
  if remain.Seconds > 0 then
    Inc(Minutes);
  Edit1.Text := string.Format('%d:%2.2d', [Hours, Minutes]);
end;
  Mit Zitat antworten Zitat
jacky213

Registriert seit: 2. Mär 2011
97 Beiträge
 
#6

AW: Countdown mit Stunden/Minuten

  Alt 6. Jun 2019, 19:24
Also ich danke nochmal Herzlich für die Tipps.

Ich habe es so eingestellt das ich jeweils Eine Minute zum Countdown Hinzufügen oder Abziehen kann.


Delphi-Quellcode:
function ASMinute(TimeStr:String; PM:Integer) : String;
var
Stunden, Minuten : Integer;
begin
Stunden := StrToInt(Copy(TimeStr,0,Pos(':',TimeStr)-1));
Minuten := StrToInt(Copy(TimeStr,Pos(':',TimeStr)+1,TimeStr.Length));
case PM of
   0 : if not (Minuten=0) then Minuten := Minuten - 1 else
       if not (Stunden=0) then
          begin
          Stunden := Stunden - 1;
          Minuten := 59;
          end;
   1 : if not (Minuten=59) then Minuten := Minuten + 1 else
          begin
          Stunden := Stunden + 1;
          Minuten := 0;
          end;
   end;
result := string.Format('%d:%2.2d', [Stunden, Minuten]);
end;
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
878 Beiträge
 
#7

AW: Countdown mit Stunden/Minuten

  Alt 6. Jun 2019, 19:26
Was ist mit Systemen die statt : als Timedelimiter ein - haben? Ist zwar kein Standard aber solls geben. Habe schon alles gesehen. Und nein ich meine nicht das Datum. Ich meine die Uhrzeit.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.296 Beiträge
 
Delphi 7 Personal
 
#8

AW: Countdown mit Stunden/Minuten

  Alt 6. Jun 2019, 22:46
Dann eben so:
Delphi-Quellcode:
function ASMinute(TimeStr:String; PM:Integer;TimeDelim:String) : String;
var
Stunden, Minuten : Integer;
begin
Stunden := StrToInt(Copy(TimeStr,0,Pos(TimeDelim,TimeStr)-1));
..........
oder
Delphi-Quellcode:
function ASMinute(TimeStr:String; PM:Integer;TDChar:Char) : String;
var
Stunden, Minuten : Integer;
TimeDelim : String;
begin
Timedelim:=TDChar;
Stunden := StrToInt(Copy(TimeStr,0,Pos(TimeDelim,TimeStr)-1));
..........
(ich weiß gerade nicht ob Pos auch mit Char umgehen kann)

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von Moombas
Moombas

Registriert seit: 22. Mär 2017
Ort: bei Flensburg
187 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: Countdown mit Stunden/Minuten

  Alt 7. Jun 2019, 07:16
Was ist mit Systemen die statt : als Timedelimiter ein - haben? Ist zwar kein Standard aber solls geben. Habe schon alles gesehen. Und nein ich meine nicht das Datum. Ich meine die Uhrzeit.
In IT kann das auch durchaus ein "." sein So zumindest die vorgaben bei uns von IT.

BTT:
Ein Beispiel wie ich es aktuell nutze, müsstest du dann noch minimal anpassen:
Delphi-Quellcode:
//Timer 1 Starten
procedure Timer1SSClick(Sender: TObject); //Button zum starten und stoppen
begin
  if T1Stunden.Text = 'then T1Stunden.Text := '0'; //EditFeld mit Stunden (Korrektur fehlender/falscher Nutzeringabe)
  if T1Minuten.Text = 'then T1Minuten.Text := '0'; //EditFeld mit Minuten (Korrektur fehlender/falscher Nutzeringabe)
  if T1Sekunden.Text = 'then T1Sekunden.Text := '0'; //EditFeld mit Sekunden (Korrektur fehlender/falscher Nutzeringabe)
  if Timer1C.Text <> 'then //Eine Combobox, wo ich mehrere vordefinierte Timer wählen kann
    if Timer1SS.Caption = 'Startthen //Timer starten
    begin
      FPTimer1.Enabled := TRUE; //Startet den Timer
      Timer1RS.Enabled := TRUE; //Schaltet den Reset-Button frei
      FertigT1.Hide; //Das Label für "Timer1 Fertig" verstecken
      T1Stunden.ReadOnly := TRUE; //Editfeld "Sperren" damit wenn der Timer läuft es nicht verändert werden kann
      T1Minuten.ReadOnly := TRUE; //Editfeld "Sperren" damit wenn der Timer läuft es nicht verändert werden kann
      T1Sekunden.ReadOnly := TRUE; //Editfeld "Sperren" damit wenn der Timer läuft es nicht verändert werden kann
      Timer1C.Enabled := FALSE; //Combobox "Sperren" damit wenn der Timer läuft es nicht verändert werden kann
      Timer1SS.Caption := 'Stop'; //Button umbenennen um das Stoppen zu ermöglichen
    end else
    begin
      FPTimer1.Enabled := FALSE; //Timer Stoppen
      Timer1CChange(Sender); //Combobox ChangeEvent auslösen um wieder den richtigen Startwert im Edit zu haben
      Timer1RS.Enabled := FALSE; //Reset Button "sperren"
      T1Stunden.ReadOnly := FALSE; //Editfeld wieder zum ändern freigeben
      T1Minuten.ReadOnly := FALSE; //Editfeld wieder zum ändern freigeben
      T1Sekunden.ReadOnly := FALSE; //Editfeld wieder zum ändern freigeben
      Timer1C.Enabled := TRUE; //Combobox wieder zum ändern freigeben
      Timer1SS.Caption := 'Start';//Button umbenennen um das Starten zu ermöglichen
    end;
end;

//Timer 1 resetten
procedure Timer1RSClick(Sender: TObject);
begin
  Timer1SSClick(Sender);
  Timer1SSClick(Sender);
end;

//Timer 1
procedure FPTimer1Timer(Sender: TObject);
begin
  if strtoint(T1Sekunden.Text) >= 1 then
  begin
    T1Sekunden.Text := inttostr(strtoint(T1Sekunden.Text) - 1); //Sekunden runter zählen
  end else
    if strtoint(T1Minuten.Text) >= 1 then
    begin
      T1Minuten.Text := inttostr(strtoint(T1Minuten.Text) - 1); //Minuten runter zählen
      T1Sekunden.Text := '59';
    end else
      if strtoint(T1Stunden.Text) >= 1 then
      begin
        T1Stunden.Text := inttostr(strtoint(T1Stunden.Text) - 1);//Stunden runter zählen
        T1Minuten.Text := '59';
        T1Sekunden.Text := '59';
      end else //Timer abgelaufen
        begin
          Timer1SS.Click;
          Messagebox(Self.Handle, PChar('Die ' + Timer1C.Text + '-Festplatte sollte Fertig sein.'), 'Timer 1', MB_ICONQUESTION or MB_OK or MB_SETFOREGROUND);
          FertigT1.show;
        end;
end;
Miniaturansicht angehängter Grafiken
unbenannt.jpg  
Der Weg ist das Ziel aber man sollte auf dem Weg niemals das Ziel aus den Augen verlieren.

Geändert von Moombas ( 7. Jun 2019 um 07:44 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:40 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf