| Autor |
Beitrag |
delphineuling
      
Beiträge: 113
XP
wat dat
|
Verfasst: Do 23.02.06 21:33
Hallo,
da wir das im Unterricht noch nicht gemacht haben ich das aber für mein Programm brauche Frage ich jetzt wie man ein Countdown macht.
Einen ganz simplen Countdown hab ich hinbekommen aber ich steig noch nicht ganz da durch.
-Also der Countdown soll im Format HH:MM:SS sein und im Label angezeigt werden.
-Dann würde ich ihn gerne mit einem Button Starten und Pausieren können.
-Am besten so das auf dem Button sich dann die Beschriftungwechselt, also wenn der Countdown läuft soll da Pause stehen und wenn der Countdown im Pause Status ist soll auf dem gleichen Button Countdown Fortführen oder Starten stehen(Wie beim Mediplayer mit Play und Pause).
-Und wieso kann man keinerlei Aktionen mehr machen wen der Countdown läuft?
-Außerdem würde ich gerne die Zeit vorher in einem Label eingeben können, auch am besten in dem Format. Soll ich das dann mit drei Labeln machen also für Stunden Minuten und Sekunden?
-Und ich würde ihn gerne mit einem Button Komplett neu Starten können.
-Das mit den Intervallen hat auch nichts so ganz geklappt. Hab ich die verstellt ginges voll schnell oder total lahm! Woher weiß man was jetzt die richtigen Schritte für Sekunden z.B. ?
Danke euch für Hilfe
|
|
inselberg
      
Beiträge: 458
|
Verfasst: So 26.02.06 08:03
timer auf 500 stellen, mit button aktivieren deaktiviern
Quelltext 1:
| edit1.text:=timetostr(incsecond(strtotime(edit1.text),-1)); |
das wars
_________________ hans bist du das ?
|
|
delphineuling 
      
Beiträge: 113
XP
wat dat
|
Verfasst: Mi 01.03.06 09:45
Das geht leider nicht, da Delphi den Bezeichner "incsecond" nicht kennt!?
Was nun?
Und gibt es noch andere Lösungsvorschläge?
|
|
AXMD
      
Beiträge: 4006
Erhaltene Danke: 7
Windows 10 64 bit
C# (Visual Studio 2019 Express)
|
Verfasst: Mi 01.03.06 09:48
Welche Delphiversion hast du? D7 und D2005 kennen die Funktion - wie's in früheren Delphiversionen aussieht weiß ich nicht, aber ich glaube, da gibt's diese Funktion noch nicht.
AXMD
PS. Ansonsten mal die Unit DateUtils einbinden
|
|
delphineuling 
      
Beiträge: 113
XP
wat dat
|
Verfasst: Mi 01.03.06 09:52
Ne ich arbeite mit Delphi 7 Enterprise!
Was soll ich nun machen?
|
|
jakobwenzel
      
Beiträge: 1889
Erhaltene Danke: 1
XP home, ubuntu
BDS 2006 Prof
|
Verfasst: Mi 01.03.06 10:46
delphineuling hat folgendes geschrieben: | Ne ich arbeite mit Delphi 7 Enterprise!
Was soll ich nun machen? |
Wie wärs mit Posts ganz lesen?
AXMD hat folgendes geschrieben: | | PS. Ansonsten mal die Unit DateUtils einbinden |
_________________ I thought what I'd do was, I'd pretend I was one of those deaf-mutes.
|
|
chrisw
      
Beiträge: 439
Erhaltene Danke: 3
W2K
D7
|
Verfasst: Mi 01.03.06 10:58
Timer1.Interval auf 1000 (Jede Sekunde)
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| procedure TForm1.FormCreate(Sender: TObject); begin Label1.Caption := '01:01:59'; end; procedure TForm1.Timer1Timer(Sender: TObject); begin Label1.Caption := TimeToStr(StrToTime(Label1.Caption)-0.000001); end; procedure TForm1.Button1Click(Sender: TObject); begin if Timer1.Enabled then Button1.Caption := 'Start' else Button1.Caption := 'Stop'; Timer1.Enabled := not Timer1.Enabled; end; |
_________________ Man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug.
|
|
Vera
      
Beiträge: 82
WinXP Home
Delphi 2005 Personal
|
Verfasst: Mi 01.03.06 11:24
delphineuling hat folgendes geschrieben: | | Einen ganz simplen Countdown hab ich hinbekommen aber ich steig noch nicht ganz da durch. |
Warum hast Du uns Deinen Quelltext nicht gepostet? Dann hätte man (oder Frau  ) darauf aufbauen können.
|
|
Fabian W.
      
Beiträge: 1766
Win 7
D7 PE
|
Verfasst: Mi 01.03.06 12:18
Hallo, ka ob du jetzt noch ein Prob mit dem og Code hast, aber ich wandle Millisekunden (secunden * 1000) immer mit folgender Function um:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33:
| function MSecToDMS(MSec: int64):string; var AllesInSekunden: int64; AllesInMinuten: integer; RestMinuten: integer; RestSekunden: integer; Stunden: integer; begin result := '00:00:00 h'; try AllesInSekunden := MSec div 1000; AllesInMinuten := AllesInSekunden div 60; RestSekunden := AllesInSekunden - AllesInMinuten * 60; Stunden := AllesInMinuten div 60; RestMinuten := AllesInMinuten - Stunden * 60; if (Stunden <= 0) and (RestMinuten <= 0) then begin result := formatfloat('00',RestSekunden)+' sec'; exit; end;
if Stunden <= 0 then begin result := formatfloat('00',RestMinuten)+':'+formatfloat('00',RestSekunden)+' min'; exit; end;
result := formatfloat('00',Stunden)+':'+formatfloat('00',RestMinuten)+':'+formatfloat('00',RestSekunden)+' h'; except result := '00:00:00 h'; end; end; |
In älteren D-Versionen musst du ggf das MSec: int64 durch MSec: integer ersetzen
mfg
Fabian Walz
|
|
delphineuling 
      
Beiträge: 113
XP
wat dat
|
Verfasst: So 12.03.06 17:19
Irgendwie komm ich noch nicht so richtig weiter.
könnt ihr mir nochmal so einen Timer bauen(einen simplen bitte) und dann wenn der Countdown abgelaufen ist soll das ergebnis ausgegeben werden im label und die caption des buttons soll wieder auf start sein.
Der erste quellcode der reingeschrieben wurde war schon ganz gut aber da ich mich kein bisschen mit dem programmieren von timer auskenne bin ich nicht weitergekommen.
Bitte helft mir ich peil so langsam nicht mehr durch!
|
|
Fabian W.
      
Beiträge: 1766
Win 7
D7 PE
|
Verfasst: So 12.03.06 17:38
Versthst du die Komponente nicht oder hängst wo anders?
Grundsätzlich: Mit Interval legst du fest in welchen Zeitabständen der Code im onTimerevent wiederholt wird. Mit enabled := true / false aktivierst / stoppst du dieses verhalten.
|
|
delphineuling 
      
Beiträge: 113
XP
wat dat
|
Verfasst: So 12.03.06 17:56
ja genau diese ganzen komponenten und bezeichnungen kenn ich net und hab ich noch nie mit gearbeitet kannst du vielleicht einen countdown so machen das der recht einfach und simpel ist und das man den auch mit grundkenntnissen verstehen erklären und verändern kann?
Hab ich eigentlich vorher mal erwähnt das ich die zeit gerne in einem Label eingeben würde?
Wäre nett wenn mir da jemand sowas zusammen bauen könnte.
|
|
Fabian W.
      
Beiträge: 1766
Win 7
D7 PE
|
Verfasst: So 12.03.06 18:35
Zusammenbauen, damit du nur noch C & P machen musst ist eigtnlich nicht so Sinn der Sache. Ich nehmen mal an dass du dir nicht im Klaren darüber bist für was du am besten welche Komponente verwendest. is klar ging mir am Anfang auch so  .
Die Zeit in einem Label eingeben is nich - TLabel is nur zur ausgabe (über .Caption)
Eingeben kannst du was in ein TEdit. Die Eingabe ließt du mit .Text aus.
Den TTimer hba ich dir oben schon erklärt und Buttons müsstest du eigtnlich soweit erstehen das's geht. Also:
In das Edit kommt die Zeit wie lange er runterzählen soll zB 5 sec also 5.
Du ziehst folgende Kompos aufs Formuar: TButton, Tedit, TLabel & TTimer (je 1 mal)
Beim Timer stellst du die Eigenschaft Enabled im Objektinspektor auf false damit er nicht runterzählst bevor du den Button drückst.
In das OnTimerEvent kommmt folgendes: Zurest deklarierst du eine GLOBALE Variable (count: integer).
Dann erhöhst du den Wert von Count in jedem OnTimerevent um den Interval des Timers.
(Alle Zeitangeben werden in msec verarbeitet!!)
Dann musst du die zeit ausgeben: Also im Label die verbleibende Zeit: eingabe aus edit * 1000 (für die msec) - die schon vergangene zeit (also count). Wenn du das im DMS Format haben möchtest musst du den msec wert vorher meiner Funktion (s.o.) übergeben.
Zu guter Letzt muss im TimerEvent auch noch geprüft werden ob die Zeit vergangen ist: Delphi-Quelltext 1: 2: 3: 4:
| if count >= strtoint(Edit.text) then begin Edit.enabled := true; Timer.enabled = false; HIER MUSS DANN DER CODE REIN DER AUSGEFÜHRT WERDEN SOLL WENN RUNTERGEZÄHLT IST end; |
Nun fehlt nur noch der Button der das ganze ins Rollen bringt:
Er muss...
...die Variable Count zurücksetzten count := 0
...das Editfeld sperren .enabled := false;
...den Timer aktivieren .enabled := true
So ich hoffe dir hat das geholfen, das ganze müsste von der Logik her funzen.
Entschuldige die Schreibfehler ich habe den Text sammt Überlegung innerhalb von 5 min durchgeleiert ^^
mfg
Fabi
|
|
delphineuling 
      
Beiträge: 113
XP
wat dat
|
Verfasst: So 12.03.06 19:40
Also mein Quelltext sieht jetzt so aus ich habe den einen befehl auch FormCreate rausgenomen weil nicht beim starten des programms der countdown starten soll sondern wenn ich auf den Button klicke also hab ich es in Button klick gemacht.
Aber der gibt jetzt imer so einen fehler aus und nichts läuft mehr hab schon rumprobiert aber geht nicht könnt ihr da helfen?
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84:
| procedure TForm1.Button1Click(Sender: TObject); var mode, mmh:integer; begin mmh:= Random(100) + 1; mode:=random(2)+1; begin Label7.Caption := '00:00:59'; end; begin if Timer1.Enabled then Button1.Caption := 'Start' else Button1.Caption := 'Stop'; Timer1.Enabled := not Timer1.Enabled; end;
if listbox1.Items.Count=0 then begin showmessage('Geben Sie bitte Namen ein!'); end else if listbox4.items.Count=0 then begin showmessage('Geben Sie Mengenangaben ein!'); end else if listbox2.items.Count=0 then begin showmessage('Geben Sie Getränke ein!'); end else if listbox3.items.Count=0 then begin showmessage('Geben Sie Kurze ein!'); end else begin
If RadioButton1.Checked Then If mmh > 25 Then begin if mode=2 then begin label17.Caption:='Wer muss Trinken? ' + listbox1.Items[random(listbox1.items.count)]+' muss ' + listbox4.Items[random(listbox4.Items.Count)]+ ' ' + listbox2.items[random(listbox2.Items.Count)]+ ' trinken !'; end else begin label17.Caption:='Wer muss Trinken? ' + listbox1.Items[random(listbox1.items.count)]+' muss einen Kurzen ' + listbox3.items[random(listbox3.Items.Count)]+ ' trinken !'; end; If RadioButton2.Checked Then If mmh > 50 Then begin if mode=2 then begin label17.Caption:='Wer muss Trinken? ' + listbox1.Items[random(listbox1.items.count)]+' muss ' + listbox4.Items[random(listbox4.Items.Count)]+ ' ' + listbox2.items[random(listbox2.Items.Count)]+ ' trinken !'; end else begin label17.Caption:='Wer muss Trinken? ' + listbox1.Items[random(listbox1.items.count)]+' muss einen Kurzen ' + listbox3.items[random(listbox3.Items.Count)]+ ' trinken !'; end; If RadioButton3.Checked Then If mmh > 75 Then begin if mode=2 then begin label17.Caption:='Wer muss Trinken? ' + listbox1.Items[random(listbox1.items.count)]+' muss ' + listbox4.Items[random(listbox4.Items.Count)]+ ' ' + listbox2.items[random(listbox2.Items.Count)]+ ' trinken !'; end else begin label17.Caption:='Wer muss Trinken? ' + listbox1.Items[random(listbox1.items.count)]+' muss einen Kurzen ' + listbox3.items[random(listbox3.Items.Count)]+ ' trinken !'; end; end; end; end; end; end;
procedure TForm1.FormCreate(Sender: TObject); begin Randomize; end; procedure TForm1.Timer1Timer(Sender: TObject); begin Label7.Caption := TimeToStr(StrToTime(Label7.Caption)-0.000001); end;
end. |
Hab einfach mal so ziemlich alles reingemacht vielleicht liegt es ja auch an was anderem oder so
|
|
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 12.03.06 21:13
wie gewünscht ein beispiel. einfach einen button als button1 und einen ttimer als timer1 auf ein formular und schon läuft dein count down.
ups, beinahe hätt ich es noch vergessel, ein tpanel brauchste auch noch, benant als MSG.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149:
| unit uTimerTest;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;
const cZeit = '00:02:00'; type tZeit = record Stunde, Minute, Sekunde: integer;
class operator implicit(value: string): tZeit; class operator implicit(value: tZeit): string; class operator implicit(value: tDateTime): tZeit; class operator implicit(value: tZeit): tDateTime; class operator dec(Value: tZeit): tZeit; class operator equal(Value1, Value2: tZeit): boolean; end;
type TForm5 = class(TForm) msg: TPanel; Button1: TButton; Timer1: TTimer; procedure Button1Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure FormCreate(Sender: TObject); private zeit: tZeit; public end;
var Form5: TForm5;
implementation {$R *.dfm}
class operator tZeit.dec(Value: tZeit): tZeit; begin result := value; if value.Sekunde > 0 then begin dec(result.Sekunde); end else begin if value.minute > 0 then begin dec(result.minute); result.Sekunde := 59; end else begin if value.Stunde > 0 then begin dec(result.Stunde); result.Minute := 59; result.Sekunde := 59; end else begin result.Sekunde := 59; result.Minute :=59; result.Stunde := 23; end; end; end; end;
class operator tZeit.equal(Value1, Value2: tZeit): boolean; begin if (value1.Stunde = value2.stunde) and (value1.Minute = value2.Minute) and (value1.Sekunde = value2.Sekunde) then result := true else result := false; end;
class operator tZeit.implicit(value: tZeit): string; begin result := format('%2.2d:%2.2d:%2.2d', [value.Stunde, value.Minute, value.Sekunde]); end;
class operator tZeit.implicit(value: string): tZeit; begin result := StrToDateTime(value); end;
class operator tZeit.implicit(value: tDateTime): tZeit; var s, m, sek: word; msec: word; begin decodetime(value, s, m, sek, msec); result.Stunde := s; result.Minute := m; result.Sekunde := sek; end;
class operator tZeit.implicit(value: tZeit): tDateTime; begin result := EncodeTime(value.Stunde, value.Minute, value.Sekunde, 0); end;
procedure TForm5.Button1Click(Sender: TObject); begin timer1.Enabled := not timer1.Enabled; if timer1.enabled then begin button1.Caption := 'Stop'; end else begin button1.Caption := 'Start'; zeit := cZeit; end; end;
procedure TForm5.FormCreate(Sender: TObject); begin zeit := cZeit; msg.caption := zeit; timer1.Enabled := true; end;
procedure TForm5.Timer1Timer(Sender: TObject); begin dec(zeit); msg.Caption := zeit; if zeit = '00:00:00' then begin timer1.Enabled := false; close; end; end;
end. |
edit: leg noch kurz die demo bei
Einloggen, um Attachments anzusehen!
|
|
delphineuling 
      
Beiträge: 113
XP
wat dat
|
Verfasst: So 12.03.06 21:47
das ist ja wieder sowas heftiges könnt ihr nich meinen code oben so verändern das es funktionirt und das ich das halt in nem edit verändern kann also die zeit und pausieren und starten mi button und ergebnisausgabe wie jetzt ohne timer nur noch mit timer vereinbaren und nach ablauf der zeit unten ausgeben
wäre echt super nett weil dann könnte ich es auch nachvollziehen und weiß was ich da gemacht habe und wie auch mit bruchstücken kann ich nicht viel anfangen da mit kenntnisse fehlen um sie richtig einzubauen am besten komplett und funktionstüchtig dann kann ich es mir nochmal angucken und nachvollziehen dann muss ich irgendwann vielleicht auch nicht mehr solche fragen stellen
ich danke sehr für antworten die auf meine wünsche eingehen
|
|
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 12.03.06 21:58
brauchst doch nur statt cZeit --> myEDIT.TEXT einsetzen. dann hast du es doch. wenn du willst kann ich dir auch das das code fragment dazugeben...
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56:
| const cZeit = '00:02:00'; type tZeit = record Stunde, Minute, Sekunde: integer; ... end;
type TForm5 = class(TForm) msg: TPanel; Button1: TButton; Timer1: TTimer; procedure Button1Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure FormCreate(Sender: TObject); private zeit: tZeit; end;
....
procedure TForm5.Button1Click(Sender: TObject); begin timer1.Enabled := not timer1.Enabled; if timer1.enabled then begin button1.Caption := 'Stop'; end else begin button1.Caption := 'Start'; end; end;
procedure TForm5.FormCreate(Sender: TObject); begin zeit := cZeit; msg.caption := zeit; timer1.Enabled := true; end;
procedure TForm5.Timer1Timer(Sender: TObject); begin dec(zeit); msg.Caption := zeit; if zeit = '00:00:00' then begin timer1.Enabled := false; close; end; end; |
|
|
delphineuling 
      
Beiträge: 113
XP
wat dat
|
Verfasst: So 12.03.06 22:22
am besten wäre wenn du das mit meinem code von meinem programm oben so einbauen zusammenbauen würdest mit allem drum und drann das ich das nur noch einfügen bräuchte! (bis auf ein paar veränderung z.b. welches label und so kannst du ja net wissen)
und das es dann läuft sonst mach ich da nur wieder irgend ein mist und alles is kaputt.
so wäre das auch am besten für mich weil ich mir dann meinen delphi ordner schnappen kann und das schritt für schritt durchgehen kann und am ende hab ich dann wieder was gelernt denn so lerne ich das am besten und ich kann meinem lehrer nachher auch erklären was was macht und schreib in der nächsten arbeit wieder ne 1.
wäre echt nett und super
|
|
Blackheart666
      
Beiträge: 2195
XP
D3Prof, D6Pers.
|
Verfasst: So 12.03.06 22:26
Bisschen Eigeninitiative könnte nichts schaden.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, DateUtils,ExtCtrls;
type TForm1 = class(TForm) Timer1: TTimer; Start: TButton; Stop: TButton; Edit1: TEdit; procedure Timer1Timer(Sender: TObject); procedure StartClick(Sender: TObject); procedure StopClick(Sender: TObject); procedure FormCreate(Sender: TObject); private public end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Timer1Timer(Sender: TObject); begin edit1.text:=timetostr(incsecond(strtotime(edit1.text),-1)); if Edit1.Text ='00:00:00'then Timer1.Enabled:=False; if Edit1.Text ='00:00:00'then ShowMessage('Zeit um !'); end;
procedure TForm1.StartClick(Sender: TObject); begin Timer1.Enabled:=True; end;
procedure TForm1.StopClick(Sender: TObject); begin Timer1.Enabled:=False; end;
procedure TForm1.FormCreate(Sender: TObject); begin Timer1.Enabled:=False; Timer1.Interval:=1000; Edit1.Text:='00:00:10'; end;
end. |
|
|
Fabian W.
      
Beiträge: 1766
Win 7
D7 PE
|
Verfasst: Mo 13.03.06 18:24
| Zitat: | | Also mein Quelltext sieht jetzt so aus |
Wenn du probleme hast einen teil zu implementieren warum baust du dann am Programm weiter? vlt baust du dadurch zusätzlich fehler ein die dir alles erschweren... Im übrigen hab ich dir oben eine genaue Beschreibung gepostet, wenn du die mal befolgen würdest würdest du den Code auch verstehen und hättest keine Probleme. Du kannst dir deinen Code doch nicht andauernd vorkauen lassen, Mann... 
|
|