![]() |
Delphi-Version: 5
Delphi Stoppuhr Problem (GetTickCount)
Hi,
habe mir gerade eine Stoppuhrfunktion geschrieben die die Zeit zwischen dem ersten und dem zweiten Button click stoppen soll. Beim ersten Klick wird die Systemzeit genommen(z.B. 14039419), beim zweiten wird nochmal die Systemzeit(z.B. 14040776) abgerufen und daraufhin wird die erste von der zweiten abgezogen(was 1357 ergeben sollte, auf dem Ausgabepanel erscheint aber 9668144), die Startzeit hat sich nach dem ersten KLick einfach von 14039419 in 4372632 geändert wie kann das sein? Gruß
Delphi-Quellcode:
unit Unit2;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm2 = class(TForm) Button1: TButton; Panel1: TPanel; Panel2: TPanel; Panel3: TPanel; Panel4: TPanel; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form2: TForm2; Status: string; // start, stop implementation {$R *.dfm} procedure TForm2.FormCreate(Sender: TObject); begin Status := 'start'; end; procedure TForm2.Button1Click(Sender: TObject); var Ti1, Ti2: Integer; // Ti1:Startzeit Ti2: Stoppzeit begin if Status = 'start' then begin Ti1 := GetTickCount; // Startzeit := Systemnzeit(ms) Status := 'stop'; Button1.Caption := Status; Panel1.Caption := IntToStr(Ti1); end else if Status = 'stop' then begin Ti2 := GetTickCount; // Stoppzeit := Systemzeit Status := 'start'; Button1.Caption := Status; // Zeitspanne := Stoppzeit - Startzeit; Panel4.Caption := IntToStr(Ti1); Panel2.Caption := IntToStr(Ti2); Panel3.Caption := IntToStr(Ti2 - Ti1); end; end; end. |
AW: Delphi Stoppuhr Problem (GetTickCount)
nimm mal Cardinal statt integer
|
AW: Delphi Stoppuhr Problem (GetTickCount)
Eigentlich Int64, aber das tiefere Problem ist, dass lokale Variablen eben lokal sind, und nicht über einen einzelnen Methodenaufruf hinaus gelten. Du musst deine Startzeit in etwas mit größerem Scope speichern, um sie über einen Klick hinaus zu sichern. Anbieten würde sich ein Feld in deiner Formularklasse.
|
AW: Delphi Stoppuhr Problem (GetTickCount)
Zitat:
Beim Start wird Ti1 zugewiesen, aber der Wert ist nicht mehr vorhanden wenn die Methode verlassen wird (lokale Variable)! Daher ist beim 'Stop' bei der Berechnung
Delphi-Quellcode:
das Ti1 wieder, weil nicht initialisiert, irgendein zufälliger Wert.
IntToStr(Ti2 - Ti1);
|
AW: Delphi Stoppuhr Problem (GetTickCount)
Der Typ ist Cardinal, aber das mit den lokalen variablen hatte ich tatsächlich übersehen :pale:
|
AW: Delphi Stoppuhr Problem (GetTickCount)
Laut MSDN gibt GetTickCount eine DWORD zurück, also 32Bit ohne Vorzeichen. Aber der Hinweis auf die Gültigkeit lokaler Variablen ist wohl das Entscheidende, außerdem kann man dann die globale Variable status gleich eliminieren, wenn man schon dabei ist, private Felder zu deklarieren ;)
|
AW: Delphi Stoppuhr Problem (GetTickCount)
Oh, okay. Dann hab ich mir das Int64 vermutlich angewöhnt, in dem ich in manchen Projekten auch addierte TickCounts brauchte. Sorry für Quarkinfo :)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz