Autor |
Beitrag |
knie
Hält's aus hier
Beiträge: 4
|
Verfasst: Mi 25.02.09 20:47
Hi Delphianer,
ich habe vor längerer Zeit mal mit Delphi gearbeitet, also verzeiht mir wenn ich keinen Durchblick mehr habe.
Ich versuche gerade einen Countdown (siehe Frage weiter unten) zu programmieren, dazu hab ich erstmal einen Counter gebastelt.
So einen Counter der verbleibende:
Jahre, Monate, Wochen, Tage ... anzeigt bis zu dem eingegebenen Datum.
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:
| var a, b, c, d, g, h, m, n : TDateTime; var e, i:String;
begin
a:=Date; i:=edit9.text; b:=StrToDate (i); e:=FloatToStr (b-a); edit1.text:=e; g:=(b-a)/7; h:=round(g); edit6.Text:=FloatToStr(h); c:=Now; d:=b-c; n:=d/30; m:=round(n); edit7.text:=FloatToStr(m); edit8.text:=FormatDateTime('yy',d); edit2.Text:=FormatDateTime('hh',d); edit3.Text:=FormatDateTime('nn',d); edit4.Text:=FormatDateTime('ss',d); edit5.Text:=FormatDateTime('zzz',d); end;
procedure TForm1.Button2Click(Sender: TObject); begin Timer1.Enabled:=True; end;
procedure TForm1.Button3Click(Sender: TObject); begin Timer1.Enabled:=False; procedure TForm1.FormCreate(Sender: TObject); begin timer1.Enabled:=false; end; |
Nicht schön, aber so hab ich das mal in der Schule gemacht.
Nun meine Frage:
Wie mach ich einen Countdown der nach eingabe von Stunden/Minuten/Sekunden diese rückwärts auf Null zählt und dann bei Null einen Sound abspielt.
Als Extrafunktion, sofern das überhaupt geht, soll nach dem sound der Timer sofort wieder anfangen zu Zählen usw. (Schleife?).
Kann man diesen Quelltext als Grundlage nehmen um mir meine Frage evtl daran zu erklären?
PS: Arbeite mit Delphi 6 unter Vista.
Mit freundlichen Grüßen
knie
Moderiert von Narses: Code- durch Delphi-Tags ersetzt
|
|
Webo
      
Beiträge: 577
Erhaltene Danke: 14
Win 7, Debian
C# (Visual Studio 2013), PHP, C, C++ (Eclipse, KDevelop)
|
Verfasst: Mi 25.02.09 21:32
Das ist gar nicht mal so schwer. Du lässt im Timer nur die Sekunden runterzählen: 58,57, ... ,0,59 . Bei 59 sec subtrahierst du vom Minutenwert einen ab, sodass statt 30 min jetzt nur noch 29 min da steht. Als nächstes musst du jetzt prüfen, ob wir bei 59 Minuten angekommen sind (dann wie bei den Minuten eine Stunde abziehen). Bevor du allerdings die Minuten abziehst überprüfst du auf IF (Minute = 0) and (Stunde = 0) then lasseesklingen
Du zählst immer nur die Sekunden mit dem Timer runter, den Rest fragst du dann nur ab und subtrahierst dementsprechend.
Das Runterzählen sollte ja eigentlich kein Problem sein, IF-Abfagen kennst du sicherlich auch noch, oder ?
Zum Soundabspielen kannst du ja mal hier im Forum nach "Sound abspielen" suchen ...
Und das mit dem wieder anfangen ist ja auch nicht kompliziert: Du speicherst dir in weiteren Variablen die Anfangswerte deines Countdowns und nach dem du bei 0 angekommen bist und den Sound abgespielt hast, setzt du die Werte wieder auf die Anfangswerte und lässt einfach weiterzählen.
Hoffe ich habe mich nicht ganz so umständlich ausgedrückt, vllt bekommst du es ja mit meinem Ansatz hin ?!
_________________ Man kann nur das aus dem Ärmel schütteln, was man auch vorher reingesteckt hat.
|
|
knie 
Hält's aus hier
Beiträge: 4
|
Verfasst: Mi 25.02.09 21:48
Ohh Gott^^ If/Then und konsorten hab ich damals schon nicht gemocht und daher nicht verstanden.
Also das Prinzp dürfte ich noch hinbekommen...glaube ich.
Aber das mit dem Sound abspielen ist noch so eine Sache, da kommt Delphi mit der Meldung: Undefinierter Bezeichner "sndPlaySound"
Und wie genau lass ich wieder die Anfangswerte setzen nachdem der Timer auf Null ist?
Hast du oder Ihr evtl ein Beispielcode? Es müssen nur die Grundfuntkionen sein, keine fehlerkorrekturabfragen usw.
mfg knie
|
|
Webo
      
Beiträge: 577
Erhaltene Danke: 14
Win 7, Debian
C# (Visual Studio 2013), PHP, C, C++ (Eclipse, KDevelop)
|
Verfasst: Mi 25.02.09 22:07
@ "sndPlaySound": Zusätzlich muss die Unit mmsystem eingebunden werden.
- Dieses realisierst Du, indem Du ganz oben in deine Unit scrollst und in dem uses-Abschnitt (die ganzen Namen wie Windwos, Messages ...) mmsystem miteinfügst.
@ Wieder auf den Startwert setzen:
- Du speicherst am Anfang, wenn der Countdown starten soll, die Werte, welche z.B. in einem Edit drin stehen, in eine Variable:
Delphi-Quelltext 1: 2: 3:
| StStunde := edStunde.Text; StMinute := edStunde.Text; StSekunde := edStunde.Text; |
Dies steht jetzt zum Beispiel in der Procedure von einem Button, den du betätigst, wenn der Countdown starten soll. Jetzt, wenn der Countdown = 0 ist:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| [...] If (Stunde = 0 ) and (Minute = 0 ) then begin sndPlaySound(PChar(Deine Wave-Datei),SND_ASYNC); Stunde := StStunde; Minute := StMinute; Sekunde := StSekunde; end; [...] |
Dieses steht jetzt im Timer direkt drin, bzw. wird von da aufgerufen. Den Timer kann man einfach weiter laufen lassen.
Hoffe, ich hab dir weitergeholfen, falls nicht, oder nicht ausreichend genug, gehe ich gerne auch noch etwas genauer drauf ein !
_________________ Man kann nur das aus dem Ärmel schütteln, was man auch vorher reingesteckt hat.
|
|
knie 
Hält's aus hier
Beiträge: 4
|
Verfasst: Mi 25.02.09 22:51
Also ich glaube ich stell mich nicht gerade schlau an.
Ist wohl doch zu lange her wo ich zuletzt Delphi genutzt habe...
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:
| unit timer_1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, mmsystem;
type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Timer1: TTimer; Button3: TButton; Label1: TLabel; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Label2: TLabel; Label3: TLabel; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure Button3Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Edit1Change(Sender: TObject); private public end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); var zahl,val:Integer; begin zahl:=StrToInt(Edit1.Text); Timer1.Tag:=zahl; Timer1.Interval:=1000; Timer1.Enabled:=true; end;
procedure TForm1.Button2Click(Sender: TObject); begin close; end;
procedure TForm1.Timer1Timer(Sender: TObject); var a,b,c:Integer; begin a:=Timer1.Tag; a:=Timer1.Tag-1; Label1.Caption:=IntToStr(a); Timer1.Tag:=a; if a<1 then Timer1.Enabled:=false; if Not Timer1.Enabled then begin SndPlaySound( 'ringin.wav', SND_ASYNC ); end;
end;
procedure TForm1.Button3Click(Sender: TObject); begin timer1.Enabled:=false; end;
procedure TForm1.FormCreate(Sender: TObject); begin timer1.Enabled:=false; end;
procedure TForm1.Edit1Change(Sender: TObject); begin StStunde := edStunde.Text; StMinute := edStunde.Text; StSekunde := edStunde.Text; end;
end. |
Sorry wenn ich nicht weis wie ich hier den DelphiQuelltext richtig einbinde.
Am besten schreibst auf wie das Gesammte Programm aussehen müsste (Quelltext), sonst wird das nie was hier.
Oder ist mein Quelltext schon auf einen guten weg?
mfg knie
Moderiert von Narses: Code- durch Delphi-Tags ersetzt
|
|
Webo
      
Beiträge: 577
Erhaltene Danke: 14
Win 7, Debian
C# (Visual Studio 2013), PHP, C, C++ (Eclipse, KDevelop)
|
Verfasst: Mi 25.02.09 23:21
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| procedure TForm1.Button1Click(Sender: TObject); var zahl,val:Integer; begin zahl:=StrToInt(Edit1.Text); Timer1.Tag:=zahl; Timer1.Interval:=1000; Timer1.Enabled:=true; end; |
Da weißt du ja nur einen Zahlenwerte zu ! Du willst aber doch den User Stunde:Minute:Sekunde eingeben lassen, oder etwa nicht =
Deshalb solltest Du meinen Vorschlag mit den Variablen oben einführen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure TForm1.Button1Click(Sender: TObject); begin StStunde := StrToInt(edStunde.Text); StMinute := StrToInt(edStunde.Text); StSekunde := StrToInt(edStunde.Text); Stunde := StStunde; Minute := StMinute; Sekunde := StSekunde; Timer1.Interval:=1000; Timer1.Enabled:=true; end; |
Im Timer musst du jetzt mit diesen Werten rechnen:
Delphi-Quelltext 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:
| procedure TForm1.Timer1Timer(Sender: TObject); begin Sekunde := Sekunde - 1; if Sekunde = 0 then begin Sekunde := 60; Minute := Minute - 1;
if Minute = 0 then begin Minute := 60; Stunde := Stunde - 1;
if Stunde = 0 then begin sndPlaySound(PChar(Deine Wave-Datei),SND_ASYNC); Stunde := StStunde; Minute := StMinute; Sekunde := StSekunde; end; end; end; end; |
Die Variablen habe ich oben definiert:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| unit timer_1;
interface
var Form1: TForm1; StStunde, StMinute, StSekunde, Stunde, Minute, Sekunde : integer; |
Ich habe das jetzt aus dem Kopf gemacht, dementsprechend hab ich's (noch) nicht auf Fehler überprüft, ich bin jetzt auch müde und gehe schlafen, es sollte aber nach dem Prinzip funktionieren.
PS: Das Variable := Variable +- 1; sollte man besser mit Inc (Suche mal im Forum danach) realisieren, so ist es aber, zum Verständnis besser.
_________________ Man kann nur das aus dem Ärmel schütteln, was man auch vorher reingesteckt hat.
Zuletzt bearbeitet von Webo am Mi 25.02.09 23:35, insgesamt 1-mal bearbeitet
|
|
Webo
      
Beiträge: 577
Erhaltene Danke: 14
Win 7, Debian
C# (Visual Studio 2013), PHP, C, C++ (Eclipse, KDevelop)
|
Verfasst: Mi 25.02.09 23:34
Ich habe dann natürlich auch gut was vergessen: Den sichtbaren Bereich zu aktualisieren:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| procedure TForm1.Timer1Timer(Sender: TObject); begin [...] lblStunde.Caption := IntToStr(Stunde); lblMinute.Caption := IntToStr(Minute); lblSekunde.Caption := IntToStr(Sekunde); end; |
_________________ Man kann nur das aus dem Ärmel schütteln, was man auch vorher reingesteckt hat.
|
|
Webo
      
Beiträge: 577
Erhaltene Danke: 14
Win 7, Debian
C# (Visual Studio 2013), PHP, C, C++ (Eclipse, KDevelop)
|
Verfasst: Di 03.03.09 21:16
Haben sich deine Schwierigkeiten gelöst oder hast du noch wo Probleme ?
Wenn du was nicht verstehst, dann muss du dir nicht zu schade sein, das nachzufragen, sonst lernt man es nicht.
_________________ Man kann nur das aus dem Ärmel schütteln, was man auch vorher reingesteckt hat.
|
|
|