Autor |
Beitrag |
theevilworm
      
Beiträge: 61
|
Verfasst: 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
Delphi-Quelltext
Jetzt frage ich mich: Ist das auch möglich, ohne globale Variablen zu nutzen?
|
|
Xion
      

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)
|
Verfasst: Do 25.02.10 14:08
Naja, du kannst die Variable in die Klasse packen...dann ist es nicht mehr ganz so global
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
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 25.02.10 14:27
Moin!
Xion hat folgendes geschrieben : | 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ä?  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.
theevilworm hat folgendes geschrieben : | 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 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); 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.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Xion
      

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)
|
Verfasst: Do 25.02.10 16:39
Narses hat folgendes geschrieben : | Moin!
Xion hat folgendes geschrieben : | 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ä? 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)
Narses hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| procedure TForm1.Button1Click(Sender: TObject); var Zaehler: Integer; begin Inc(Zaehler); 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
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 25.02.10 17:18
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Gammatester
      
Beiträge: 328
Erhaltene Danke: 101
|
Verfasst: 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
      
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: Do 25.02.10 17:58
theevilworm hat folgendes geschrieben : | 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 
      
Beiträge: 61
|
Verfasst: 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
      
Beiträge: 573
WIN XP/2000 & 7Prof (Familie:Win95,Win98)
|
Verfasst: Fr 26.02.10 21:52
Du könntest auch -wie von Tilman angesprochen- die Eigenschaft Tag des Buttons nehmen und dort Deine Zahl reinschreiben,
wie es z.B. auch in Thread 593378 vorgeschlagen wird.
theevilworm hat folgendes geschrieben : |
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.
|
|
|