Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Countdown mit Stunden/Minuten (https://www.delphipraxis.net/200906-countdown-mit-stunden-minuten.html)

jacky213 5. Jun 2019 22:00

Countdown mit Stunden/Minuten
 
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?

blawen 5. Jun 2019 22:06

AW: Countdown mit Stunden/Minuten
 
Zitat:

Zitat von jacky213 (Beitrag 1434012)
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?

scrat1979 5. Jun 2019 22:33

AW: Countdown mit Stunden/Minuten
 
Vor dem Start des Timers die „Endzeit“ mittels
Delphi-Quellcode:
IncMinute
berechnen.

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

Wie blawen vorgeschlagen für Stunden und Minuten Integer-Werte zum rechnen nehmen...

Rollo62 6. Jun 2019 06:54

AW: Countdown mit Stunden/Minuten
 
Das hier "scandatetime" könnte dir vielleicht helfen, oder Du zerlegst die Elemente eben schnell selber.

Schokohase 6. Jun 2019 08:33

AW: Countdown mit Stunden/Minuten
 
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;

jacky213 6. Jun 2019 19:24

AW: Countdown mit Stunden/Minuten
 
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;

DieDolly 6. Jun 2019 19:26

AW: Countdown mit Stunden/Minuten
 
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.

p80286 6. Jun 2019 22:46

AW: Countdown mit Stunden/Minuten
 
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

Moombas 7. Jun 2019 07:16

AW: Countdown mit Stunden/Minuten
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von DieDolly (Beitrag 1434080)
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 = 'Start' then //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;


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:54 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz