Autor Beitrag
knie
Hält's aus hier
Beiträge: 4



BeitragVerfasst: 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.

ausblenden volle Höhe 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:
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;                          //System Datum
        i:=edit9.text;
        b:=StrToDate (i);                 //Termin von Olympia
        e:=FloatToStr (b-a);              //verbleibende Tage
        edit1.text:=e;                    //Ausgabe der Resttage

        g:=(b-a)/7;                       //berechnung der Wochen
        h:=round(g);                      //Wochen runden
        edit6.Text:=FloatToStr(h);        //umwandlung und Ausgabe der Wochen

        c:=Now;                           //Systemzeit
        d:=b-c;                           //abziehen der Systemzeit vom Termin

        n:=d/30;                          //berechnung der Monate
        m:=round(n);                      //Monate runden
        edit7.text:=FloatToStr(m);        //umwandlund und Ausgabe der Monate

        edit8.text:=FormatDateTime('yy',d);     //Formatierung in Jahren
        //edit7.text:=FormatDateTime('mm',d);   //Formatierung in Monaten
        edit2.Text:=FormatDateTime('hh',d);     //Formatierung in Stunden
        edit3.Text:=FormatDateTime('nn',d);     //Formatierung in Minuten
        edit4.Text:=FormatDateTime('ss',d);     //Formatierung in Sekunden
        edit5.Text:=FormatDateTime('zzz',d);    //Formatierung in Millisekunden

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Timer1.Enabled:=True;               //Timer anschalten

end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  Timer1.Enabled:=False;              //Timer anhalten

procedure TForm1.FormCreate(Sender: TObject);
begin
  timer1.Enabled:=false;         //damit der Timer nicht gleich startet
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 user profile iconNarses: Code- durch Delphi-Tags ersetzt
Webo
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 577
Erhaltene Danke: 14

Win 7, Debian
C# (Visual Studio 2013), PHP, C, C++ (Eclipse, KDevelop)
BeitragVerfasst: 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 = 0and (Stunde = 0then 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 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 577
Erhaltene Danke: 14

Win 7, Debian
C# (Visual Studio 2013), PHP, C, C++ (Eclipse, KDevelop)
BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
2:
3:
StStunde := edStunde.Text; //Da ich nicht weiß, wie du gerne mit den Werten rechnen möchtest, ob als Integer oder als Date/Time-Typ, lasse ich hier mal die Umwandlung weg
StMinute := edStunde.Text; //St steht für Startwert
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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
[...] //Vorher fanden die "Runterzähl"-Zeilen statt.
If (Stunde = 0 ) and (Minute = 0 ) then
  begin
    sndPlaySound(PChar(Deine Wave-Datei),SND_ASYNC); //Sound abspielen
    
    Stunde  := StStunde;  //Stundenwert wieder auf den Anfangswert setzen
    Minute  := StMinute;  //Minutenwert wieder auf den Anfangswert setzen
    Sekunde := StSekunde; //Sekundenwert wieder auf den Anfangswert setzen
  end;
[...] //Es folgen die sichtbaren Aktualisierungen, wo du dann in deine Labels oder Edi-Felder die neuen Stunden-, Minuten-, Sekundenwerte anzeigen lässt.

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 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: 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...
ausblenden volle Höhe 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:
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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var zahl,val:Integer;
        begin
                zahl:=StrToInt(Edit1.Text);                             //Zuweisen
                Timer1.Tag:=zahl;                                       
                Timer1.Interval:=1000;
                Timer1.Enabled:=true;                                   //Timer On
        end;

procedure TForm1.Button2Click(Sender: TObject);
begin
        close;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var a,b,c:Integer;
        begin
                a:=Timer1.Tag;                               //Wert
                a:=Timer1.Tag-1;                             //Verringern
                Label1.Caption:=IntToStr(a);                 //Show label
                Timer1.Tag:=a;
        if a<1 then Timer1.Enabled:=false;                   //Wenn kleiner --> Zähler stoppen
        if Not Timer1.Enabled then                              //Wenn False --> PlaySound
                begin
                        SndPlaySound( 'ringin.wav', SND_ASYNC ); //Play
                end;

        end;

procedure TForm1.Button3Click(Sender: TObject);
begin
        timer1.Enabled:=false;                                  //Timer Stopen
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
        timer1.Enabled:=false;                                  //TimerOff wenn Programm geladen wird
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
StStunde := edStunde.Text; //Da ich nicht weiß, wie du gerne mit den Werten rechnen möchtest, ob als Integer oder als Date/Time-Typ, lasse ich hier mal die Umwandlung weg
StMinute := edStunde.Text; //St steht für Startwert
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 user profile iconNarses: Code- durch Delphi-Tags ersetzt
Webo
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 577
Erhaltene Danke: 14

Win 7, Debian
C# (Visual Studio 2013), PHP, C, C++ (Eclipse, KDevelop)
BeitragVerfasst: Mi 25.02.09 23:21 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.Button1Click(Sender: TObject);
var zahl,val:Integer;
        begin
                zahl:=StrToInt(Edit1.Text);                             //Zuweisen
                Timer1.Tag:=zahl;                                       
                Timer1.Interval:=1000;
                Timer1.Enabled:=true;                                   //Timer On
        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:
ausblenden 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);   //Zuweisen
  StMinute := StrToInt(edStunde.Text);   //  "
  StSekunde := StrToInt(edStunde.Text);  //  "

  Stunde := StStunde;                    //Zuweisen
  Minute := StMinute;                    //  "
  Sekunde := StSekunde;                  //  "

  Timer1.Interval:=1000;                 //Timerintervall setzen
  Timer1.Enabled:=true;                  //Timer aktivieren 
end;

Im Timer musst du jetzt mit diesen Werten rechnen:
ausblenden 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); //Sound abspielen
    
              Stunde  := StStunde;  //Stundenwert wieder auf den Anfangswert setzen
              Minute  := StMinute;  //Minutenwert wieder auf den Anfangswert setzen
              Sekunde := StSekunde; //Sekundenwert wieder auf den Anfangswert setzen
            end
        end;
    end;
end;


Die Variablen habe ich oben definiert:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
unit timer_1;

interface

//[...] Fürs Forum ein wenig gekürzt

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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 577
Erhaltene Danke: 14

Win 7, Debian
C# (Visual Studio 2013), PHP, C, C++ (Eclipse, KDevelop)
BeitragVerfasst: Mi 25.02.09 23:34 
Ich habe dann natürlich auch gut was vergessen: Den sichtbaren Bereich zu aktualisieren:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
[...] //Steht für den Code, den ich die oben gepostet habe

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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 577
Erhaltene Danke: 14

Win 7, Debian
C# (Visual Studio 2013), PHP, C, C++ (Eclipse, KDevelop)
BeitragVerfasst: 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.