Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - mein Timer funktioniert nicht!


greendesire - Fr 23.01.09 13:01
Titel: mein Timer funktioniert nicht!
Wir programmieren im Moment zu dritt Sudoku und haben leider nur sehr wenige Grundkenntnisse.
Jetzt wollen wir noch einen Timer einfügen.
Er soll starten wenn man auf "Spiel starten" klickt und dann so lange laufen bis derjenige das Spiel geschafft hat.
wir haben es jetzt mit einem ttimer versucht: hier der quelltext:


Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
 Zeit := GetTickCount;
 Zeit := GetTickCount - Zeit;
end;


damit der Timer auch startet, haben wir einen Button Spiel starten:


Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.NeuesSpiel1Click(Sender: TObject);
begin
label5.Caption:=timetoStr(zeit);
end;


Wenn wir jetzt das Spiel starten und auf den Button klicken, steht in dem Label nur 00:00:00 und der Timer läuft nicht.

Was machen wir falsch?
Wäre nett, wenn uns wer helfen kann.

Liebe Grüße

Moderiert von user profile iconGausi: Delphi-Tags hinzugefügt


Delete - Fr 23.01.09 13:04


Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.NeuesSpiel1Click(Sender: TObject);
begin
  Timer1.Enabled := true; //Timer einschalten
  label5.Caption:=timetoStr(zeit);  
end;


[edit] Achja, und was soll der Timer da eigentlich machen?
Zitat:

Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
 Zeit := GetTickCount;
 Zeit := GetTickCount - Zeit;
end;

Da dürfte aber eine sehr kleine Zahl bei herauskommen.[/edit]


greendesire - Fr 23.01.09 13:09

Haben den Befehl eingefügt. Funktioniert aber nicht.
der Timer steht immer noch auf 00.00.00.

edit: wir dachten, dass er da die Anfangszeit nimmt und dann wenn man den Button klickt, soll er von der Anfangszeit die Zeit abziehen, damit die Zeit abläuft.


Gausi - Fr 23.01.09 13:13

@DeddyH: Das wird nicht reichen, wenn ich mir den Rest so ansehe. Im Timer wird das Label ja gar nciht verändert. Ich würde es mal so probieren:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.NeuesSpiel1Click(Sender: TObject); 
begin 
  Startzeit := GetTickCount;
  label5.Caption := '0';
  timer1.Enabled := True; 
end;



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.Timer1Timer(Sender: TObject); 
var Zeitvergangen: Int64;
begin 
 Zeitvergangen := GetTickCount - StartZeit; 
 label5.Caption := IntToStr(Zeitvergangen Div 1000); // ergibt dann eine Anzeige in Sekunden
end;


elundril - Fr 23.01.09 13:16

@Gausi: Funktionierts nicht auch so? da wirs dann wenigstens schön mit Stunde:Minute:Sekunde angezeigt.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.Timer1Timer(Sender: TObject);
var verbrauchteZeit: TDateTime
begin
 verbrauchteZeit := now -Zeit;
 Label1.Caption := TimeToStr(verbrauchteZeit);
end;



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.NeuesSpiel1Click(Sender: TObject); 
begin 
  Zeit := now;
  label5.Caption := '0';
  timer1.Enabled := True; 
end;


das getTickCount ist total unnötig, weil das nur die Sekunden zählt die seit dem Systemstart vergangen sind.

lg elundril


Gausi - Fr 23.01.09 13:20

Ja, das sollte auch funktionieren. Allerdings könnte es sein, dass dabei um Mitternacht was schiefläuft. Deswegen habe ich das so gelassen. ;-)


elundril - Fr 23.01.09 13:50

grad ausprobiert, gibt eine Konflikte mit der Uhrzeit 00:00:00. :)

lg elundril


der organist - Fr 23.01.09 16:07
Titel: Re: mein Timer funktioniert nicht!
user profile icongreendesire hat folgendes geschrieben Zum zitierten Posting springen:
[...]


Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
 Zeit := GetTickCount;
 Zeit := GetTickCount - Zeit;
end;


[...]
Moderiert von user profile iconGausi: Delphi-Tags hinzugefügt


Naja, da zwischen dem Ausführen der beiden Befehle doch recht wenig Zeit liegt, können wir davon ausgehen, dass markierte Gettickcount (nahezu) gleich mit dem davor ist. dementsprechend ergibt sich für die Zweite ZEile: Zeit := GetTickCount - GetTickCount;, was nahezu 0 ist, wenn nicht auf 0 gerundet wird.

Andere Frage: Warum schreibt ihr nicht einfach (je nach Intervall, hab mal 1000 angenommen):


Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.Timer1Timer(Sender: TObject);
begin  
 if start then  //globale Variable, Boolean, bei Start-Button-Drücken auf true setzen
   inc(Zeit);   //natürlich in Sekunden
end;


elundril - Fr 23.01.09 16:13

warum dann nicht gleich nur inc(Zeit);? Die Variable Start kann ja dann mit Timer1.Enabled erledigt werden. mann müsst halt den counter immer wieder zurücksetzen. und man müsst es richtig formatieren.

lg elundril


Maweki - Fr 23.01.09 16:14
Titel: Re: mein Timer funktioniert nicht!
user profile iconder organist hat folgendes geschrieben Zum zitierten Posting springen:


Andere Frage: Warum schreibt ihr nicht einfach (je nach Intervall, hab mal 1000 angenommen):


Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.Timer1Timer(Sender: TObject);
begin  
 if start then  //globale Variable, Boolean, bei Start-Button-Drücken auf true setzen
   inc(Zeit);   //natürlich in Sekunden
end;


Weil Timer sehr ungenau ist.
GetTickCount ist die genauste Möglichkeit, ohne den Prozessor zu sehr zu belasten (Echtzeitthread usw.).

Das ist schon der richtige Weg.


greendesire - Sa 24.01.09 14:09

danke wir werden es mal testen, da wird bestimmt was davon funktionieren.
Leider treffen wir uns immer nur Freitag und ich hab das Programm nicht auf meinem PC.
Danke erstmal für die Hinweise ich melde mich dann nochmal obs geklappt hat.