![]() |
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? |
AW: Countdown mit Stunden/Minuten
Zitat:
|
AW: Countdown mit Stunden/Minuten
Vor dem Start des Timers die „Endzeit“ mittels
Delphi-Quellcode:
berechnen.
IncMinute
Im Timer dann
Delphi-Quellcode:
und damit Stunden und Minuten entsprechend berechnen...
Minutesbetween(now, Endzeit)
Wie blawen vorgeschlagen für Stunden und Minuten Integer-Werte zum rechnen nehmen... |
AW: Countdown mit Stunden/Minuten
Das hier "
![]() ![]() |
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; |
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; |
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.
|
AW: Countdown mit Stunden/Minuten
Dann eben so:
Delphi-Quellcode:
oder
function ASMinute(TimeStr:String; PM:Integer;TimeDelim:String) : String;
var Stunden, Minuten : Integer; begin Stunden := StrToInt(Copy(TimeStr,0,Pos(TimeDelim,TimeStr)-1)); ..........
Delphi-Quellcode:
(ich weiß gerade nicht ob Pos auch mit Char umgehen kann)
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)); .......... Gruß K-H |
AW: Countdown mit Stunden/Minuten
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
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 11:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz