Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Button soll Wert einer Variable +1 erhöhen - ohne globale V.


theevilworm - Do 25.02.10 14:06
Titel: Button soll Wert einer Variable +1 erhöhen - ohne globale V.
Guten Tag Community,

ich habe eine kleine Frage. Ich habe einen Button, der pro Klick die Variable "zaehler" um eins erhöhen soll, ausgehend von 0.

Das habe ich gemacht, indem ich zaehler als eine globale Variable deklariert habe und sie mit 0 initialisiert habe.
In Button1.Click steht nur noch


Delphi-Quelltext
1:
zaehler:=zaehler+1;                    


Jetzt frage ich mich: Ist das auch möglich, ohne globale Variablen zu nutzen?


Xion - Do 25.02.10 14:08

Naja, du kannst die Variable in die Klasse packen...dann ist es nicht mehr ganz so global :D

Alternativ könntest du auch mit Button.Tag arbeiten, die Variable ist nur in der Klasse vom Button verfügbar, wäre also noch etwas lokaler als in Form ^^ (nicht zu verwechseln mit der property Tag, verfügbar in ganz TForm ;) )


Narses - Do 25.02.10 14:27

Moin!

user profile iconXion hat folgendes geschrieben Zum zitierten Posting springen:
Alternativ könntest du auch mit Button.Tag arbeiten, die Variable ist nur in der Klasse vom Button verfügbar, wäre also noch etwas lokaler als in Form ^^ (nicht zu verwechseln mit der property Tag, verfügbar in ganz TForm ;) )
Hä? :gruebel: Du redest hier in beiden Fällen von der Eigenschaft .Tag, aber einmal die des Objekts Form1 und einmal die von Button1 (mal sie Standard-Namen unterstellt). Beide sind im gleichen Namespace, also gibt´s da keinen Sichtbarkeitsunterschied. Oder ich habe dich nicht richtig verstanden. :nixweiss:

user profile icontheevilworm hat folgendes geschrieben Zum zitierten Posting springen:
Das habe ich gemacht, indem ich zaehler als eine globale Variable deklariert habe und sie mit 0 initialisiert habe.
In Button1.Click steht nur noch

Delphi-Quelltext
1:
zaehler:=zaehler+1;                    
Jetzt frage ich mich: Ist das auch möglich, ohne globale Variablen zu nutzen?
Klar ist das möglich, aber macht keinen Sinn: ;)

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.Button1Click(Sender: TObject);
  var
    Zaehler: Integer;
begin
  Inc(Zaehler); // Zaehler := Zaehler +1;
end;
Bei dieser Version steht dir aber die Variable Zahler nur innerhalb der Methode zur Verfügung, du kannst auf den Wert nicht ausserhalb davon zugriefen. :!:

Da das wohl nicht das sein wird, was du willst, musst du dir überlegen, wo in deinem Programm die Variable sichtbar sein soll:Mal so als grober Überblick. Generell gilt: so lokal wie möglich, so global wie nötig. :idea: ;)

cu
Narses


Xion - Do 25.02.10 16:39

user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
Moin!

user profile iconXion hat folgendes geschrieben Zum zitierten Posting springen:
Alternativ könntest du auch mit Button.Tag arbeiten, die Variable ist nur in der Klasse vom Button verfügbar, wäre also noch etwas lokaler als in Form ^^ (nicht zu verwechseln mit der property Tag, verfügbar in ganz TForm ;) )
Hä? :gruebel: Du redest hier in beiden Fällen von der Eigenschaft .Tag, aber einmal die des Objekts Form1 und einmal die von Button1 (mal sie Standard-Namen unterstellt).

Ne, Button.Tag hat ja ne Variable, die ist nur im Button sichtbar. Das property macht die zwar sichtbar nach außen, aber eigentlich ist sie ja private. Also die Variable selbst ist nur im Button sichtbar, Button.Tag aber in ganz TForm (bzw wo der Button halt ist) :mrgreen:

user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.Button1Click(Sender: TObject);
  var
    Zaehler: Integer;
begin
  Inc(Zaehler); // Zaehler := Zaehler +1;
end;
Bei dieser Version steht dir aber die Variable Zahler nur innerhalb der Methode zur Verfügung, du kannst auf den Wert nicht ausserhalb davon zugriefen. :!:

ist nicht vielmehr das Problem, dass der Wert beim nächsten Aufruf weg ist?


Narses - Do 25.02.10 17:18

Moin!

user profile iconXion hat folgendes geschrieben Zum zitierten Posting springen:
Ne, Button.Tag hat ja ne Variable, die ist nur im Button sichtbar. Das property macht die zwar sichtbar nach außen, aber eigentlich ist sie ja private. Also die Variable selbst ist nur im Button sichtbar, Button.Tag aber in ganz TForm (bzw wo der Button halt ist) :mrgreen:
Und was ist dann der von dir beschriebene Unterschied zu Form1.Tag? :nut: Wer nimmt hier wen auf den Arm? :lol:

user profile iconXion hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.Button1Click(Sender: TObject);
  var
    Zaehler: Integer;
begin
  Inc(Zaehler); // Zaehler := Zaehler +1;
end;
Bei dieser Version steht dir aber die Variable Zahler nur innerhalb der Methode zur Verfügung, du kannst auf den Wert nicht ausserhalb davon zugriefen. :!:
ist nicht vielmehr das Problem, dass der Wert beim nächsten Aufruf weg ist?
Und der nächste Aufruf erfolgt nicht vielleicht zufällig auch "ausserhalb der Methode"? :zwinker:

cu
Narses


Gammatester - Do 25.02.10 17:41


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.Button1Click(Sender: TObject);
{$j+}
const
  zaehler: integer = 0;
begin
  inc(zaehler);
  Button1.Caption := IntToStr(Zaehler);
end;


Tilman - Do 25.02.10 17:58

user profile icontheevilworm hat folgendes geschrieben Zum zitierten Posting springen:
Ich habe einen Button, der pro Klick die Variable "zaehler" um eins erhöhen soll [..] Ist das auch möglich, ohne globale Variablen zu nutzen?


Eher nicht. Wenn man eine globale Variable um eins erhöhen will, braucht man eine globale Variable. Wenn man einen Teller Suppe essen will, wird das ohne einen Teller Suppe zu haben schwierig.

Wenn es dir aber weniger um die Variable, als das registrieren des Button-Klicks geht, dann kannst du wie bereits von anderen angesprochen die Property Tag verwenden. Von der Idee mit der Konstante würde ich abraten, auch wenn sie funktioniert.


theevilworm - Fr 26.02.10 21:20

Hallo,
danke für die zahlreichen Antworten!
Ich brauch nicht unbedingt eine globale Variable. Ich benutze die Variable nur in dem Button. Mein Problem war, dass ich ja genau das nicht machen kann:


Delphi-Quelltext
1:
2:
procedure TForm1.Button1Click(Sender: TObject);
var zaehler: integer = 0;


mit einer lokalen Variable. Und nn wusste ich nicht, wie ich die Variable in der gleichen Prozedur zaehler auf 0 setzen konnte, in der ich zaehler auch immer um eins erhöhen will. Wie mache ich das?


Delphi-Quelltext
1:
2:
const
  zaehler: integer = 0;


Hm, was ist const - ich schätze mal Konstante? Was ist der Unterschied zu einer Variable?


ffgorcky - Fr 26.02.10 21:52

Du könntest auch -wie von user profile iconTilman angesprochen- die Eigenschaft Tag des Buttons nehmen und dort Deine Zahl reinschreiben,
wie es z.B. auch in Thread 593378 [http://www.delphi-forum.de/viewtopic.php?p=593378#593378] vorgeschlagen wird.

user profile icontheevilworm hat folgendes geschrieben Zum zitierten Posting springen:

Hm, was ist const - ich schätze mal Konstante? Was ist der Unterschied zu einer Variable?

Naja, wie es der Name doch schon sagt, bekommt diese "Variable" ja schon von vornherein einen festen - nicht zu ändernden - Wert zugewiesen. Sie bleibt eben konstant bei diesem Wert.