Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Prism Ereignis bei Timer.Tick funktioniert nicht (https://www.delphipraxis.net/108550-ereignis-bei-timer-tick-funktioniert-nicht.html)

blade236 15. Feb 2008 19:01


Ereignis bei Timer.Tick funktioniert nicht
 
Guten Abend,
Ich habe vor kurzen mit Delphi.net angefangen und wollte jetzt in ein kleines Spiel das ich programmiere, einen einen Sekunden Timer einbauen.
Ich wollte in einem Intervall von 1000 ms, die Zahl in einem Label in jeder Sekunde +1 nehmen.
Leider wird das Tick Ereignis nur 1mal ausgeführt :wall: .
Delphi-Quellcode:
 

unit WinForm;

interface

uses
  System.Drawing, System.Collections, System.ComponentModel,
  System.Windows.Forms, System.Data, sysutils;

procedure TWinForm.Timer1_Tick(sender: System.Object; e: System.EventArgs);
var zahl:integer;
begin
label1.Text:=inttostr(zahl+1);

end;

procedure TWinForm.Button1_Click(sender: System.Object; e: System.EventArgs);

begin
     timer1.enabled:=true;

end;

end.
Ist sicher ein dummer Fehler aber helft mir trotzdem bitte.
mfG blade236

inherited 15. Feb 2008 19:07

Re: Ereignis bei Timer.Tick funktioniert nicht
 
Du weist deinem Label bei jedem Tick zahl+1 zu
das ist beim ersten Durchlauf 1, beim zweiten Durchlauf wieder 1 usw, weil du zahl an sich nicht inkrementierst ;)

mkinzler 15. Feb 2008 19:07

Re: Ereignis bei Timer.Tick funktioniert nicht
 
Bist du sicher das der Event nur einmal auftritt oder wird die Anzeige nur einmal aktualisiert?

blade236 15. Feb 2008 19:14

Re: Ereignis bei Timer.Tick funktioniert nicht
 
mit inkrementieren meinst du wohl sowas oder?

zahl:=zahl+1;
label1.Text:=inttostr(zahl);

Delphi-Quellcode:
unit WinForm;

interface

uses
  System.Drawing, System.Collections, System.ComponentModel,
  System.Windows.Forms, System.Data, sysutils;

procedure TWinForm.Timer1_Tick(sender: System.Object; e: System.EventArgs);
var zahl:integer;
begin
zahl:=zahl+1;
label1.Text:=inttostr(zahl);

end;

procedure TWinForm.Button1_Click(sender: System.Object; e: System.EventArgs);

begin
     timer1.enabled:=true;

end;

end.
klappt immernoch nicht

Amateurprofi 15. Feb 2008 19:21

Re: Ereignis bei Timer.Tick funktioniert nicht
 
Zitat:

Zitat von blade236
mit inkrementieren meinst du wohl sowas oder?

zahl:=zahl+1;
label1.Text:=inttostr(zahl);

Delphi-Quellcode:
unit WinForm;

interface

uses
  System.Drawing, System.Collections, System.ComponentModel,
  System.Windows.Forms, System.Data, sysutils;

procedure TWinForm.Timer1_Tick(sender: System.Object; e: System.EventArgs);
var zahl:integer;
begin
zahl:=zahl+1;
label1.Text:=inttostr(zahl);

end;

procedure TWinForm.Button1_Click(sender: System.Object; e: System.EventArgs);

begin
     timer1.enabled:=true;

end;

end.
klappt immernoch nicht

Das wird erst dann klappen, wenn du zahl global definierst.

blade236 15. Feb 2008 19:27

Re: Ereignis bei Timer.Tick funktioniert nicht
 
Danke klappt, wieso Global kapier ich aber trotzdem nich.

mkinzler 15. Feb 2008 19:30

Re: Ereignis bei Timer.Tick funktioniert nicht
 
Zitat:

Zitat von blade236
Danke klappt, wieso Global kapier ich aber trotzdem nich.

Da es sich sonst bei jedem Durchlauf um eine neue Variable handelt, also wieder bei 0 beginnt.

Custom 15. Feb 2008 19:41

Re: Ereignis bei Timer.Tick funktioniert nicht
 
Zitat:

Zitat von blade236
Danke klappt, wieso Global kapier ich aber trotzdem nich.

dann werfen wir dochmal einen blick auf den codeschnipsel ;)

Delphi-Quellcode:
unit WinForm;

interface

uses
  System.Drawing, System.Collections, System.ComponentModel,
  System.Windows.Forms, System.Data, sysutils;

procedure TWinForm.Timer1_Tick(sender: System.Object; e: System.EventArgs);
var zahl:integer;
begin
zahl:=zahl+1;
label1.Text:=inttostr(zahl);

end;

procedure TWinForm.Button1_Click(sender: System.Object; e: System.EventArgs);

begin
     timer1.enabled:=true;

end;

end.
in diesem code wird die Variable nach dem Timer1_Tick event definiert.
Delphi-Quellcode:
procedure TWinForm.Timer1_Tick(sender: System.Object; e: System.EventArgs);
var zahl:integer;
Die Variable, die ja nur temporär existiert hat also zuerst mal den wert 0.
Dann wird Zu dem wert 0 der wert 1 dazu addiert.
Delphi-Quellcode:
zahl:=zahl+1;
dann wird der wert 1 in dein panel geschireben
Delphi-Quellcode:
label1.Text:=inttostr(zahl);
und an dieser stelle endet die prozedur und die temporäre variable ist nichtmehr vorhanden.

Sobald dann der nächste "Tick" erfolgt wird die prozedur wiederholt.
Der wert wird "erstellt", auf 0 gesetzt, + 1 addiert und in dein panel geschrieben

das problem ist also nicht der timer sondern dein Wert!

schriebt man den code jetzt etwa so:
Delphi-Quellcode:
unit WinForm;

var
zahl:integer;

interface

uses
  System.Drawing, System.Collections, System.ComponentModel,
  System.Windows.Forms, System.Data, sysutils;

procedure TWinForm.Timer1_Tick(sender: System.Object; e: System.EventArgs);
begin
zahl:=zahl+1;
label1.Text:=inttostr(zahl);

end;

procedure TWinForm.Button1_Click(sender: System.Object; e: System.EventArgs);

begin
     timer1.enabled:=true;

end;

end.
existiert die variable ja immer, da sie ja global ist. soll heißen: sie wird nie gelöscht oder neu erstellt.

einfacher wäre es aber den Timer so zu gestalten:
Delphi-Quellcode:
procedure TWinForm.Timer1_Tick(sender: System.Object; e: System.EventArgs);
begin

label1.Text:=inttostr(strtoint(label1.Text)+1);

end;
dann mpsstest du den text auf dem label am anfang nur auf "0" setzen und das selbe würde dabei herauskommen. mit dem unterschied das du keine variablebräuchtest.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:08 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz