Autor Beitrag
theevilworm
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 61



BeitragVerfasst: Do 25.02.10 14:06 
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

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


Jetzt frage ich mich: Ist das auch möglich, ohne globale Variablen zu nutzen?
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: 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 ;) )

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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
ausblenden 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: ;)
ausblenden 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:
  • im ganzen Programm: im var-Abschnitt des Projektdatei deklarieren
  • in einer Unit: im var-Abschnitt der unit deklarieren
  • in einer Klasse:
    • in der ganzen Klasse: im public/published-Abschnitt deklarieren
    • nur innerhalb der Klasse: im private-Abschnitt deklarieren
Mal so als grober Überblick. Generell gilt: so lokal wie möglich, so global wie nötig. :idea: ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: 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:

ausblenden 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?

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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:

ausblenden 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

_________________
There are 10 types of people - those who understand binary and those who don´t.
Gammatester
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 328
Erhaltene Danke: 101



BeitragVerfasst: Do 25.02.10 17:41 
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1405
Erhaltene Danke: 51

Win 7, Android
Turbo Delphi, Eclipse
BeitragVerfasst: 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.

_________________
Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
theevilworm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 61



BeitragVerfasst: 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:

ausblenden 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?

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 573

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

BeitragVerfasst: 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 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.