Countdown - Wie realisier ich das?

Gleich vorne weg...ich bin blutiger Anfänger ;)

Also ich wollte einen Countdown programmieren,der von einer beliebigen Zahl bis Null runterzählt.Nur bei mir gibts halt das Problem,dass überhaupt nicht gezählt wird :)

Code:
counterlaenge := StrToInt(Form2.Edit2.Text); <---- Zähler wird festgelegt
sec:=StrToInt(FormatDateTime('ss',now));    <- Aktuelle Sekundenzahl der Uhr wird ausgelesen
Label11.Caption := IntToStr(sec);       <- Zahl wird in Label geschriebn (wollte testen obs auch geht)
While sec < (sec+counterlaenge) Do    <- völlig falsche while-Schleife, die eigentlich laufen sollte,bis der Zähler bei der festgelegten Zahl ist
begin
Label11.Caption := IntToStr(sec);
sec:=StrToInt(FormatDateTime('ss',now));
end;

Der Counter wird per Button aktiviert,dann hängt sich aber Delphi auf.Ich hab im Netz auf diversen Seiten nach nem Beispiel für einen Countdown gesucht,aber irgendwie scheinen die alle nicht recht zu funktionieren.
Ich glaub,ich hab hier ein Logikproblem,weil so wie ich das sehe,liest er momentan pausenlos die Zeit aus und schreibt sie immer in den Label rein...

Ich bräucht dringend nen Tipp,wie ich nen Counter mach ;)

PS: Am Ende wird hier mit "sec" natürlich nicht 0 ausgegeben,soweit komm ich schon mit
 
Ein Counter ist relativ einfach zu realisiern, mit einem Timer.
Eine Beispielanwendung:
Der User soll in die EditBox1 ein Zeit eingeben und dann Button1 Drücken.
Nachdem die Zeit, die der User eingegeben hat, abgelaufen ist, erscheint eine MessageBox, die besagt die Zeit ist um.

Das Realisiert man wie folgt:
Man plaziert wie oben gesagt eine EditBox einen Button und einen Timer.
Den Timer findest du in der Komponentenauswahl unter System.
Du plazierst den Timer und stellst ihn auf enabled:=false .
Das Intervvall gibt an, wie oft das , was im Timer Ereigniss steht, aufgeführt wird, in Millisecunden. (Eher gesagt in welchen Zeitabständen)
Sobald der User auf den Button klickt, wird der Inhalt von EditBox1 in der Variable "Zeit" gespeichert. Dann stellst du Timer enabled auf true.
Dadruch wird der Timer aktiviert.
Das Ereigniss OnTimer des Timers wird dadruch ab jetzt immer alle "Intervall" Milesec. aufgerufen.

In OnTimer erhöst du den Wert der Zuvor angelegten Variable "Counter" um eins.
Und stellst du if Abfrage, ob der Wert von "Counter" gleich dem von "Zeit" ist. Ist dies der Fall, stellst du Timer enabled auf false, gibst eine Nachricht aus, und gibtst den Variablen "Zeit" und "Counter" den Wert null.

Hoffe das war verständlich.
Hier nochmal der Sorce:

PHP:
var
  Form1: TForm1;
  Zeit : Integer;
  Counter : Integer;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
Zeit := StrToInt(Edit1.Text);
Timer1.Enabled:=true;

end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
counter:= counter+1;
if(counter=zeit) then
begin
ShowMessage('Zeit abgelaufen');
Timer1.Enabled:=False;
counter:=0;
zeit   :=0;
end

end;
 
Hmm,danke :)
Sieht sehr vielversprechend aus,werd ich nachher testen ;)

Allerdings wurde in diversen anderen Foren behauptet,dass es mit einem Timer nicht sehr schön programmiert bzw ungenau wäre,ist das wirklich so?

Aber ich werde dennoch auf das Beispiel zurückgreifen ;)
 
Ruud Van Nistelrooy hat gesagt.:
Gleich vorne weg...ich bin blutiger Anfänger ;)

Also ich wollte einen Countdown programmieren,der von einer beliebigen Zahl bis Null runterzählt.Nur bei mir gibts halt das Problem,dass überhaupt nicht gezählt wird :)

Code:
counterlaenge := StrToInt(Form2.Edit2.Text); <---- Zähler wird festgelegt
sec:=StrToInt(FormatDateTime('ss',now));    <- Aktuelle Sekundenzahl der Uhr wird ausgelesen
Label11.Caption := IntToStr(sec);       <- Zahl wird in Label geschriebn (wollte testen obs auch geht)
While sec < (sec+counterlaenge) Do    <- völlig falsche while-Schleife, die eigentlich laufen sollte,bis der Zähler bei der festgelegten Zahl ist
begin
Label11.Caption := IntToStr(sec);
sec:=StrToInt(FormatDateTime('ss',now));
end;

Der Counter wird per Button aktiviert,dann hängt sich aber Delphi auf.Ich hab im Netz auf diversen Seiten nach nem Beispiel für einen Countdown gesucht,aber irgendwie scheinen die alle nicht recht zu funktionieren.
Ich glaub,ich hab hier ein Logikproblem,weil so wie ich das sehe,liest er momentan pausenlos die Zeit aus und schreibt sie immer in den Label rein...

Ich bräucht dringend nen Tipp,wie ich nen Counter mach ;)

PS: Am Ende wird hier mit "sec" natürlich nicht 0 ausgegeben,soweit komm ich schon mit
Hey wie geht´s. Ich bin in Delphi Profi und hab da schon sehr viel gemacht. Bin eben neu hier und hab auch ein paar fragen: Gibt es so etwas wie eine Bewertung?
Also: Du hast mehrere Möglichkeiten. Entweder du realisierst es mit einem Timer, oder mir einer Schleife. Mit einem Timer brauchst du einfach eine allgemeine Variable z. B. Zähler. Die setzt du beim ButtonClick auf irgendeine Zahl. Dann akrivierst du den Timer (Timer1.enabled := true)
In seiner ausführmethode (OnExecute oder so) gibst du dann rein:

{beliebige Anweisung}

If Zähler = 1 then
begin
Timer1.Enabled := false;
Exit;
end;
Dec(Zähler);

oder die Zweite möglichkeit: im ButtonOnClick:

procedure Button1Click(Sender: TObject);
Var Zähler: Integer;
begin
Zähler := irgendeinWet;
For I := Zähler downto 1 do
begin
{beliebiger Code}
end;

end;

So das wars auch. Für mehr Infos antworte einfach
 
Ich hätte gern noch eine Info, auch wenn ich nicht die Frage gestellt hab: Warum antwortest du auf den ersten Beitrag noch mal? Die Frage war so gut wie beantwortet, er wollte es probieren. Das mit dem Timer wurde schon vorgeschlagen. Eigentlich hast du wenig neues erzählt... Außerdem solltest du als Profi darauf achten, dein Wissen auch korrekt darzustellen, damit andere was von dir lernen. Dazu gehören zum Beispiel das richtige Benennen der Prozeduren (z.B. Timer1Timer) oder das Verwenden der richtigen Algo-Strukturen (mir hat es die Fußnägel gekräuselt bei deiner Timer-Prozedur).

Und zu dem bewerten (auch wenn es OT ist): sehr weit unten auf der Seite kannst du das Thema bewerten (von 1 bis 5). Andere Bewertungen gibt es imho nicht.

Ich möchte dich in meinem Post nicht kritisieren, sondern dich nur bitten, in Zukunft evtl ein Bisschen darauf zu achten.

Vielen Dank

lg Hellie
 
Entschuldigung, will´s eh schon raus nehmen. Ich war damals sehr in Eile und hab mir die Frage nicht wircklich durchgelesen. Wollt nur helfen ... :(

PS: Wie nimmt man eine Nachricht heraus?
 
Zuletzt bearbeitet:
Eine längere Ärklärung...

Hab grad den Text da gelöscht, weiss aber nicht wie ich den Eintrag löschen kann...
 
Zuletzt bearbeitet:
Eine längere Erklärung...

Also. Nochmal von vorn und diesmal übersichtlich:
1. Allgemeine benuzte Methoden für Datei Ein - und Ausgabe
2. Typen und Typenprüfung
3. Lese und Schreib Exceptions
4. Weiterführende Themen


1. Allgemeine benuzte Methoden für Datei Ein - und Ausgabe
Es gibt ein paar wichtige Methoden, die man alle kennen sollte, wenn man mit Dateien arbeitet.
Hir sind ein paar aufgezählt:

AssignFile: Damit weisst man einer Dateivariablen einen Dateinamen zu.
z. B. : AssignFile(f, 'C:\Spiele.txt');

Reset: Damit öffnet man eine bereits existierende Datei. Man kann aus ihr Daten lesen und hineinschreiben.
z. B. : Reset(f);

Rewrite: Damit legt man eine Datei neu an. Wenn aber bereits eine Datei mit selben Namen existiert, wird sie gelöscht.
z. B. : Rewrite(f);

Append: Hängt Daten an das Ende einer Datei. funktioniert nur bei Textdateien.
z. B. : Append(f);

Seek: Bei File of Deklarierten Variablen kann man jederzeit zu einem beliebigen Datensatz zugreifen. Dafür gibt es Seek. Es bestimmt den Datensatz, wo man liest bzw. schreibt.
z. B. : Seek(f, 8);

Read: Liest aus der Datei einen Datensatz in eine Variable.
z. B. : Read(f, MyVar);

ReadLN: Wie Read, nur fügt noch ein zusätzliches Zeilenende hinzu.
z. B. : ReadLN(f, MyVar);

Write: Schreibt den Inhalt einer Vaiable in eine Datei.
z. B. : Write(f, MyVar);

WriteLN: Wie Write, nur fügt noch ein zusätzliches Zeilenende hinzu.
z. B. : WriteLN(f, MyVar);

CloseFile: Schließt die Datei.
z. B. : CloseFile(f);

Das Schema:

______________________________________________
| |
| Zuweisen einer Dateivariablen mit AssignFile |
|______________________________________________|
|
|
______________________|___________________________
| |
| Öffnen der Datei mit Reset, Rewrite oder Append |
|__________________________________________________|
|
|
______________________|______________________________
| | |
|Lesen aus der Datei mit | Schreiben in die datei mit |
|Read oder ReadLN | Write oder WriteLN |
|________________________|____________________________|
|
|
______________________|_______________________
| |
| Schließen einer Datei mit CloseFile |
|______________________________________________|



2. Typen und Typenprüfung
Bei der Verwendung muss man aufpassen, welchen Typ man in eine Datei speichert bzw. liest.
Es ist z. B. nicht egal ob man zuerst eine Integer - Variable in eine Datei speichert und dann aus der selben Datei mit Read den Datensatz in eine String - Variable lesen. Hier eine kleine Liste.

Textfile: Deklariert eine Dateivariable, vom Typ String, also Text.
z. B. : Var MyVar: Textfile;

File of Typ: Mit File of deklariert man eine Dateivariable mit dem Typ, der nach 'File of' steht.
Hinweis: Man kann nicht jede beliebige Variable einsetzen (z. B. nicht String)
z. B. : Var MyVar: File of Integer;

File: Deklariert eine untypisierte Variable .
Verwendung + Anwendung siehe 4. Weiterführende Themen

TFilestream: Damit deklariert man eine Dateivariable vom Typ Stream. Das ist eine andere Art der
Speicherung, mit anderen Methoden. (Mit TFilestream instanziert man ein Objekt).
Verwendung + Anwendung siehe 4. Weiterführende Themen

3. Lese und Schreib Exceptions

Es gibt Exceptions (Ausnahmen, Fehler). Bei Dateien gibt es I/O Fehler. (Input, Output = Eingabe, Ausgabe). Sie identifizieren einen Fehler eindeutig mit einer Fehlernummer (z. b. 103).
Hier eine kleine Liste der Nummern mit ihrer Bedeutung (es gibt aber noch viele andere!):

1......Ungültiger DOS-Funktionscode
2......Datei nicht gefunden
3......Pfad nicht gefunden
4......Zu viele Dateien geöffnet
5......Zugriff auf die Datei verweigert
6......Ungültiges Datei-Handle
12.....Ungültiger Zugriffscode
15.....Ungültiges Laufwerk
16.....Aktuelles Verzeichnis kann nicht gelöscht werden
17.....Umbennen auf verschiedenen Laufwerken nicht erlaubt
18.....Keine weiteren Dateien
19.....Datentrräger ist schreibgeschützt
21.....Laufwerk nicht bereit
23.....CRC-Fehler in Daten
25.....Seek-Fehler auf Diskette/Plate
27.....Sektor nicht gefunden
102....Dateivariable ist keiner Datei zugeordnet
103....Datei ist nicht geöffnet
104....Datei nicht für Eingabe geöffnet

4. Weiterführende Themen

Zunächst eine erklärung für Seek: Es gibt Datensätze in einer Datei.
z. B. : Man schreibt in einer Datei fünf Integer - Variablen. Daher gibt es fünf Datensätze.
Wenn man also den 5. Datensatz lesen will, muss man zu den 5. Datensatz springen.
Das macht Seek. Man gibt also ein: Seek(f, 5); Um nun den 5. Datensatz zu lesen muss man noch
schreiben: Read(f, MyVar);
Hinweis zu Seek: Funktioniert nicht bei einer Textdatei.

Verwendung von File: Wird verwendet, wenn man den Inhalt nicht wissen will, aber man ihn trotzdem braucht. (z. B. beim Kopieren von Dateien)
Eine Deklaration: Var f: File;

Die zu verwendeten Methoden:
Alle wie bei 'normalen' Dateitypen, außer Read(LN) und Write(LN).
Dafür gibt es einen Ersatz:

BlockRead: Definition:
procedure BlockRead(var f: File, var Buf, Count: Integer [; var Result: Integer]);

BlockWrite: Definition:
procedure BlockWrite(var f: File, var Buf, Count: Integer [; var Result: Integer]);

f: die Variable (untypisierte)

Buf: Gibt eine Vaiable an (die groß genug ist) in der die Bytes gelesen, bzw. von der die Bytes geschrieben werden sollen.

Count: Gibt die Anzahl der Bytes die geschrieben oder gelesen werden sollen an

Result: Um herauszufinden, ob die Bytes tatsächlich gelesen bzw. geschrieben wurden, gibt es optional die Variable Result zur Überprüfung. (in ihr steht dann die tatsächliche Anzahl der bytes)


...Und dann gibt es noch den Compiler Befehl:
Wenn man {$I-} schreibt dann löst der Compiler bei einem Fehler nur eine stille Exception aus.
(Daher es gibt keine Fehlermeldung). Dazu kann man das aber wieder mit dem Schalter {$I+} wieder einschalten.

Hier noch ein kleines Bsp. als Abschluss:

procedure TForm1.Button1Click(Sender: TObject);
Var f: Textfile;
Text: String;
begin
AssignFile(f, 'C:\Text.txt'); // weisst den Dateinamen 'C:\Text.txt' der Variable f zu
Rewrite(f); // legt die Datei neu an
WriteLN(f, 'Ein Text'); // schreibt 'Ein Text' in die Datei
CloseFile(f); // schließt die Datei

AssignFile(f, 'C:\Text.txt'); // weisst den Dateinamen 'C:\Text.txt' der Variable f zu
Reset(f); // öffnet die Datei zum lesen und schreiben
Read(f, Text); // liest den Inhalt der Datei ('Ein Text') in die Variable Text
CloseFile(f); // schließt die Datei

ShowMessage(Text); // zeigt eine Meldung mit den Text in der Variable Text an ('Ein Text')

end;


Also. Das war jetzt eh ein bisschen ausführlicher als beim letzten mal. Später kommt noch etwas dazu. (Das mit dem Stream u. a.)
Wünsche allen, noch viel Spaß damit.
 

Neue Beiträge

Zurück