Autor Beitrag
Tony-S
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 184
Erhaltene Danke: 6

Windows 7, XP, Ubtuntu
Delphi 7, Visual Basic.net
BeitragVerfasst: Di 28.07.09 18:58 
Hallo Community,

Ich habe eine kleine Stpuhr programmiert mit hilfe einer Zeitvariable (bei mir Temp), einem Timer, einem Panel und ein paar Buttons.

Start und Stop funktioniert in so weit schonmal wie es soll, nur an an einem button der die Stopuhr weiterlaufen lässt scheitere ich..

Hier erstmal das was ich bis jetzt habe:
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:
26:
27:
var
  Form1: TForm1;
  temp:ttime;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
Panel1.caption := formatdatetime('hh:mm:ss:zzz',temp - time);
end;

procedure TForm1.Btn_StartClick(Sender: TObject);
begin
temp := time;
Timer2.Enabled:=True;
end;

procedure TForm1.Btn_StopClick(Sender: TObject);
begin
Timer2.Enabled:=False;
end;

// und hier so wie ich mich das vorgestellt hatte..

procedure TForm1.Btn_go_onClick(Sender: TObject);
begin
Timer2.Enabled:=True;
Temp:=StrTotime(Panel1.Caption);
end;

Wenn ich die Zeile mit Temp weglasse, läuft die Zeit im Hintergrund weiter, aber das soll ja so nicht sein ^^.

Wäre nett wenn ihr mir n Tipp geben oder mir helfen könntet.

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Di 28.07.09 19:22 
Hm, mit deinem Ansatz kriegst du das nicht hin. Du speicherst ja nur den Anfangspunkt und ziehst ihn vom Endpunkt ab. Abhilfe könnte sowas verschaffen:

  1. Beim Pausieren eine weitere Variable auf Now stellen
  2. Beim Fortfahren die Zeit der Pause berechnen und diese Zeit zur Variable temp dazuzählen.

Wenn du um 12:00 Uhr angefangen hast mit Zählen, um 12:07 Uhr bis 12:11 Uhr Pause machst, tust du so, als hättest du um 12:04 angefangen. Denn: 12:11 - 12:04 = 7 Minuten. Und das ist ja genau das, was der Timer beim Fortfahren anzeigen soll.

PS: Verwende statt einer globalen Variable (temp) lieber ein privates Feld:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
type
  TForm1 = class(TForm)
    {...}
  private
    FTemp: TTime;
  end;

Das ist im Sinne von moderner objektorientierter Programmierung.
Tony-S Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 184
Erhaltene Danke: 6

Windows 7, XP, Ubtuntu
Delphi 7, Visual Basic.net
BeitragVerfasst: Mi 29.07.09 00:28 
Danke hab mir das mal zu Herzen genommen

und mich ne weile lang damit beschäftigt :D...
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:
var
  Form1: TForm1;
  zeit,temp,last:ttime;

// Jetzt die geänderte Prozedur:

procedure TForm1.XButton1click(Sender: TObject);
begin
if not(timer.enabled) then begin temp:= time;zeit := last end else last := zeit;
// also wenn der timer aus ist, wird die letzte Zeit gespeichert,
timer.enabled := not(timer.enabled);
// und wenn er an ist wird die letzte reale Zeit gespeichert

// dafür brauch ich halt 3 variablen, würde mich interessieren ob es auch mit 2 geht

XButton1.Visible:=False;
//XButton1 ist der Button mit der Caption "Start"

XBtn_Pause.Visible:=True;
end;

und eben noch pause und weiter

procedure TForm1.XBtn_go_onclick(Sender: TObject);
begin
XButton1.click;
XBtn_Pause.Visible:=True;
XBtn_go_on.Visible:=False;
end;

procedure TForm1.XBtn_Pauseclick(Sender: TObject);
begin
XButton1.click;
XBtn_Pause.Visible:=False;
XBtn_go_on.Visible:=True;
end;

Danke das du mir helfen konntest, aber das mit dem Private hab ich nicht ganz verstanden, wozu braucht man das, oder besser was macht das?

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

achja den timer vergessen xD
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.timerTimer(Sender: TObject);
begin
zeit := last + temp - time;
XPanel1.Caption:= formatdatetime('hh:mm:ss:zzz',zeit);
end;


Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Mi 29.07.09 11:44 
user profile iconTony-S hat folgendes geschrieben Zum zitierten Posting springen:
Danke das du mir helfen konntest, aber das mit dem Private hab ich nicht ganz verstanden, wozu braucht man das, oder besser was macht das?

In diesem Fall ist es eigentlich egal, aber du solltest dir Suche in der Entwickler-Ecke GLOBALE VARIABLEN abgewöhnen. Wenn du später mal mit mehrere Instanzen einer Klasse arbeitest, also ein Fenster öfters anzeigst, bekommst du sonst Probleme.
ffgorcky
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 573

WIN XP/2000 & 7Prof (Familie:Win95,Win98)

BeitragVerfasst: Mi 29.07.09 18:39 
user profile iconTony-S hat folgendes geschrieben Zum zitierten Posting springen:

das mit dem Private hab ich nicht ganz verstanden, wozu braucht man das, oder besser was macht das?

Das steht dafür, dass Du die Variable nicht von außen - also von einer anderen Form aus - z.B. mittels
ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure FormIrgendeineAndere.ButtonClick(Sender: TObject)
begin
FormMitDerVariable.VariablenName:=NeuerVariablenWert;
end;
ansprechen kannst.
Wenn Du das aber doch gerne möchtest, dann musst Du die Deklaration nur in das public statt in das private stellen - wobei es immer besser ist, wenn man die Variablen nur in der eigenen Form "einfach so mal eben" verändern kann.
Wenn Du dann doch diesen Wert aus einer anderen Form abrufen oder sogar ändern möchtest, dann wäre es besser, wenn Du dafür
eine procedure schreibst, in der Du nach einer Prüfung (ob der Wert möglich ist) diesen dann setzt
oder eine function schreibst, durch die Du Dir dann den Wert zurückgeben lässt.

Ich hoffe, dass ich das jetzt nicht "zu hochtrabend" für Dich beschrieben habe.

PS: Funktioniert denn Dein Timer jetzt so, wie er soll?


Zuletzt bearbeitet von ffgorcky am Mi 29.07.09 20:07, insgesamt 3-mal bearbeitet
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 29.07.09 18:56 
Tony-S Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 184
Erhaltene Danke: 6

Windows 7, XP, Ubtuntu
Delphi 7, Visual Basic.net
BeitragVerfasst: Mo 10.08.09 21:01 
Hallo ich hatte jetzt noch mal eine kleine Idee, so eine Art Rundenzeit mit einzubauen, klappt auch fast, nur meine Umsetzung scheint mir etwas naja nicht ganz korrekt :D.

Ich habe also einen Button "Lap", welcher eine 2. mitlaufende Zeit jeweils in eine Listbox schreibt, jetzt habe ich aber das Problem das mein "go on" oder meinetwegen auch weiter Button nicht mehr ganz das macht was er soll, und genau dabei liegt mein Problem.

Ich füge hier nochmal die Hauptprozeduren mit hinzu und die exe, vielleicht kann mir so jemand helfen.
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:
procedure TForm1.XButton2click(Sender: TObject);
// Lap-Button
begin
inc(count);
//count ist global deklariert

Listbox1.items.Add(formatdatetime('hh:mm:ss:zzz',zeit2)+' Lap ' + IntToStr(Count));
Listbox1.ItemIndex:=Count;
temp2:=Time;
end;

procedure TForm1.timerTimer(Sender: TObject);
begin
zeit := last + temp - time;
XPanel1.Caption:= formatdatetime('hh:mm:ss:zzz',zeit);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
zeit2 := last2 + temp2 - time;
XPanel2.Caption:= formatdatetime('hh:mm:ss:zzz',zeit2);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
count:=0;
end;

procedure TForm1.XBtn_Pauseclick(Sender: TObject);
begin
XButton1.click;
//XBtn_Pause.Visible:=False;
//XBtn_go_on.Visible:=True;
end;

procedure TForm1.XBtn_go_onclick(Sender: TObject);
begin
//XButton1.click;
temp2:=time;
Timer.Enabled:=True;
Timer1.Enabled:=True;
//XBtn_Pause.Visible:=True;
//XBtn_go_on.Visible:=False;
end;

procedure TForm1.XButton1click(Sender: TObject);
begin
if not(timer.enabled) then begin temp:= time;zeit := last end else last := zeit;
timer.enabled := not(timer.enabled);

if not(timer1.enabled) then begin temp2:= time;zeit2 := last2 end else last2 := zeit2;
timer1.enabled := not(timer1.enabled);

XButton1.Visible:=False;
//XButton1 ist der Button mit der Caption "Start"

XBtn_Pause.Visible:=True;
end;

Ich hoffe da kann jemand durchblicken :?

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
Einloggen, um Attachments anzusehen!
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Mo 10.08.09 21:20 
Hm.. hat die Frage "Rundenzeit" noch etwas mit der Überschrift "Stoppuhr nach pausieren weiterlaufen lassen " zu tun? Nein? Dann mach bitte einen neuen Thread auf.
In dem kannst du dann auch direkt üben, deinen Quellcode mit Delphi TAGs zu umschließen, wie man es dir schon mehrmals vorgemacht hat ;)

Außerdem wäre es sinnvoller, das Projekt anzuhängen, statt nur die exe. So kann man sich dsa direkt selber kompilieren.

_________________
PROGRAMMER: A device for converting coffee into software.
Tony-S Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 184
Erhaltene Danke: 6

Windows 7, XP, Ubtuntu
Delphi 7, Visual Basic.net
BeitragVerfasst: Mo 10.08.09 21:26 
Hm ich war der Meinung das es noch dazu passt aber ok, mach ich einen neuen thread auf. Wie das mit den Tags geht weiß ich nicht..
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Mo 10.08.09 21:43 
user profile iconTony-S hat folgendes geschrieben Zum zitierten Posting springen:
Wie das mit den Tags geht weiß ich nicht..

Dann klick bei einem deiner früheren Beiträge, wo ein Mod das nachgetragen hat, auf Bearbeiten und schau es dir an.

_________________
PROGRAMMER: A device for converting coffee into software.