Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Counter mit Timer und Label (https://www.delphipraxis.net/5898-counter-mit-timer-und-label.html)

Trouble_Maker 22. Jun 2003 15:49


Counter mit Timer und Label
 
Hiho
wie kann ich ein Label beispielsweiße von 10 ... 0 zählen lassen ?!?
Dies ist ja eigentlich kein Probelem. Doch mein Code ist dazu recht lange! Ich weiss aber, dass man dieses simple Problem auch mit nur 2-3 Zeilen Code lösen kann.

Könnt ihr mir diesen Code mal posten ?!?

danke


Trouble_Maker

Daniel B 22. Jun 2003 15:53

Hallo,
Delphi-Quellcode:
for i := 10 downto 0 do
begin
  Label1.Caption := IntToStr(i);
end;
Das müsstest Du ncoh mit einem Timer noch Verbinden sonst sieht man da nciht viel. Oder vor/nach der Label-Zeile noch ein Sleep/Delay mit reinnehmen.
Grüsse, Daniel :hi:

Luckie 22. Jun 2003 16:00

Wie soll man das mit einen Timer in Verbindung bringen? Wenn du den Code in einem OnTimer Ereignis aufrufst, zählt er jedes mal auf null runter.

Wenn schon dann so:
Delphi-Quellcode:
type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Label1: TLabel;
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    FCounter: Integer;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;


implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if FCounter = 0 then
    Timer1.Enabled := FALSE;
  Label1.Caption := IntToStr(FCounter);
  Dec(FCounter);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FCounter := 10;
end;

Daniel B 22. Jun 2003 16:01

Zitat:

Zitat von Luckie
Wie soll man das mit einen Timer in Verbindung bringen?

Weil die Schelfie sonst zu schnell ist und man das runterzählen gar nciht sehen würde.

Grüsse, Daniel :hi:

Trouble_Maker 22. Jun 2003 16:02

hiho

@Daniel: ja sowas ähnliches habe ich gesucht, aber irgendwie klappt das nich so, wie ich mir das vorgestellt habe. (Habe erstmal noch i als Integer deklariert, weil es sonst erst garnicht geklappt hätt)

Aber er Springt direkt von der 10 auf die 0 !!! Also zählt nicht runter (10,9,8, ... 0 )


wieso ?!?

danke


Trouble_Maker

Daniel B 22. Jun 2003 16:04

Zitat:

Zitat von Trouble_Maker
Aber er Springt direkt von der 10 auf die 0 !!! Also zählt nicht runter (10,9,8, ... 0 )

Das ist nicht ganz richtig, siehe mein letztes Posting. Die Schleife ist so schnell, das Du nur noch gleich die 0 angezeigst bekommst. Die Schleife an sich zählt schon richtig runter und zeigst es auch richtig an. Daher habe ich noch gesagt das ganze mithilfe eines Timers oder Sleep oder Delay verzögern, um auch wirklich jede Zahl an sich runterzählen sieht.

Grüsse, Daniel :hi:

Luckie 22. Jun 2003 16:06

Weil die Schleife so schnell ist, dass du nichts siehst - ganz einfach.

@Daniel: Könntest du mir mal bitte Code zeigen, wie du dir das mit einen Timer vorstellst? :shock:

@Trouble_Maker: Und was ist gegen meine Lösung einzuwenden? Die geht und ist sauber gelöst. Und nicht so ein gebastel mit einer Schleife und einer eingebauten Timer-Verzögerung. Wenn ich so wieso einen Timer brauche, dann brauche ich auch die Schleife nicht.

Luckie 22. Jun 2003 16:11

Aber wenn du es unbedingt mit einer Schleuife machen willst, dann bitte so, dass die anwendung noch reagiert:
Delphi-Quellcode:
procedure delay(msec:longint);
var
  start,stop:longint;
begin
  start := gettickcount;
  repeat
  stop := gettickcount;
  application.processmessages;
  until (stop - start ) >= msec;
end;

procedure TForm1.Button1OnClick(Sender: TObject);
var
  i : Integer;
begin
  for i := 10 downto 0 do
  begin
    Label1.Caption := IntToStr(i);
    Delay(1000);
  end;
end;

Trouble_Maker 22. Jun 2003 16:13

heyho ...

@Luckie: Danke deine Lösung funktioniert perfekt !!!


danke für eure Mühe


cu Trouble_Maker

flomei 22. Jun 2003 16:17

Delphi-Quellcode:
var
  Form1: TForm1;
  i: Integer;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
  begin
    Timer1.Enabled := true;
  end;

procedure TForm1.FormCreate(Sender: TObject);
  begin
    i := 10;
  end;

procedure TForm1.Timer1Timer(Sender: TObject); //Timer Intervall 1000ms
  begin
    i := i -1;
    Label1.Caption := IntToStr(i);
  end;

end.
Wäre auch eine (nicht ganz so elegante) Möglichkeit. Dann muss man nur noch überprüfen ob i nicht 0 ist und fertig.

MfG Florian :hi:

Luckie 22. Jun 2003 16:21

@flomei: Sag mal was soll denn das jetzt? Kuck mal in mein erstes Posting (die Lösung mit dem Timer). Warum bringst du noch mal das gleiche nur schlechter und unvollständig?

flomei 22. Jun 2003 16:35

Zitat:

Zitat von Luckie
...noch mal das gleiche nur schlechter

Wieso schlechter? Der funktioniert genau so gut wie dein Code nur das ein Anfänger beim Suchen meinen vielleicht leichter versteht.

Zitat:

Zitat von Luckie
und unvollständig?

Ich hab geschrieben, dass man noch überprüfen muss ob i nicht 0 ist.

Also: Keep cool 8)! Ich hab keine Lust mich mit dir deshalb zu streiten... :cheers:

MfG Florian :hi:

Luckie 22. Jun 2003 16:42

Er ist aus zwei Gründen, meiner Meinung nach, schlechter:
Erstmal hast du eine globale Variabel i (allein der Name ist schlecht, da man die meisten Zählvariablen mit i benennt.). Meine Variable FCount hingegen ist ein Feld der Klasse TForm1, und somit OOP gerecht.
Zweitens:
Delphi-Quellcode:
i := i-1;
Steht
Delphi-Quellcode:
Dec(i);
gegenüber. Ab D5 erzeugt der Compiler zwar identischen Assembler Code, nur halte ich meine Schreibweise für einfacher lesbar.

Und gerade wenn es ein Anfänger ist sollte man ihm nicht eine schlechtere aber einfach verstehbare Lösung geben, sondern eine richtige und OOP gerechte. Sonst lehrnt er es nie bzw. gewöhnt sich einen schlechten Stil an, weil er es nicht besser weiß bzw. gelernt hat.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:27 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