Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Durch Klick auf Button eine Integervariable erhöhen (https://www.delphipraxis.net/61936-durch-klick-auf-button-eine-integervariable-erhoehen.html)

Elachiim 28. Jan 2006 11:45


Durch Klick auf Button eine Integervariable erhöhen
 
Ich will durch Klick auf Button eine Integervariable erhöhen.
Also wenn ich schreibe:

var i:integer; //als globale Variable in anderer Prozedur Wert 0 zugewiesen

in folgender procedure soll, wenn man auf einen Button klickt, die Variable erhöht werden
begin
i:i+1 (inc(i) geht auch nicht)
end;

, dann wird der letzte Wert nie gespeichert. Ich möchte ja nur bei jedem Klick erst 1, dann 2 usw. haben

Danke für eine Antwort, wenn ihr mich versteht

mkinzler 28. Jan 2006 11:50

Re: Durch Klick auf Button eine Integervariable erhöhen
 
Eigentlich sollte es gehen. Gibt es vielleicht mehrerer Variablen mit dem Namen i?

fwsp 28. Jan 2006 11:53

Re: Durch Klick auf Button eine Integervariable erhöhen
 
Delphi-Quellcode:
i:= i + 1;

Hobby-Programmierer 28. Jan 2006 12:13

Re: Durch Klick auf Button eine Integervariable erhöhen
 
Hallo :) ...,
Zitat:

Zitat von Elachiim
Ich will durch Klick auf Button eine Integervariable erhöhen.

Zunächst einmal solltest Du diese Variable auch global deklarieren oder aber diese der Procedure lokal mit übergeben! Wichtig ist auch das eben diese Variable vor der ersten Benutzung initialisiert wird.

zb.:
Delphi-Quellcode:
procedure TDeineHauptForm.FormCreate(Sender: TObject);
begin
  i:= 0;
end;
dann sollte das ebenso funktionieren
Delphi-Quellcode:
procedure TDeineHauptForm.ButtonClick(Sender: TObject);
begin
  Inc(i); // ebenso i:= i+1;
end;
Falls nicht dann zeig mal Deinen Code.
Gruss Mario :dancer:

SirThornberry 28. Jan 2006 12:23

Re: Durch Klick auf Button eine Integervariable erhöhen
 
und bitte NICHT global declarieren! Man kann Variablen ebenso im Private, Public und Protected declarieren.

Hobby-Programmierer 28. Jan 2006 12:32

Re: Durch Klick auf Button eine Integervariable erhöhen
 
Hallo ...,
Zitat:

Zitat von SirThornberry
und bitte NICHT global declarieren! Man kann Variablen ebenso im Private, Public und Protected declarieren.

Warum nicht? Hängt das nicht von der Verwendung und der Verfügbarkeit der Variable ab?
Gruss Mario :dancer:

SirThornberry 28. Jan 2006 12:58

Re: Durch Klick auf Button eine Integervariable erhöhen
 
Zitat:

Zitat von Hobby-Programmierer
Hallo ...,
Zitat:

Zitat von SirThornberry
und bitte NICHT global declarieren! Man kann Variablen ebenso im Private, Public und Protected declarieren.

Warum nicht? Hängt das nicht von der Verwendung und der Verfügbarkeit der Variable ab?
Gruss Mario :dancer:

In deinem Beispiel verwendest du doch aber auch Methoden von "TDeineHauptForm.". Und da es hier um Objectpascal handelt sollte man doch auch Objectorientiert arbeiten.
Wenn die Variable also nur in "TDeineHauptForm" verwendet wird dann sollte sie auch nur in dieser Klasse verfügbar sein und gehört somit ins Private oder Protected.

Hobby-Programmierer 28. Jan 2006 14:02

Re: Durch Klick auf Button eine Integervariable erhöhen
 
Hallo SirThornberry ...,
wenn ich Global schreibe meine ich das auch so. Sie wird ja nicht in TDeineHauptForm deklariert sondern dort nur initialisiert und mitbenutzt. Meinem Verständniss zu folge deklariere ich Unitübergreifend eine Variable die ich in mehreren Units benötige, eben als Global und nicht lokal. Der OP ging in seinem Bsp. von einer globalen Variable aus, nur deshalb habe ich mich dem angeschlossen! Spricht etwas dagegen das ich diese Variable in TDeineHauptForm initialisiere?
Bei sonstigen lokalen Variablen hast Du natürlich recht.
.. hoffe das dies jetzt nicht OT ist, Gruss Mario

Der_Unwissende 28. Jan 2006 14:34

Re: Durch Klick auf Button eine Integervariable erhöhen
 
Hi,
die Idee in der OOP ist es halt gerade, dass du keine globalen Variablen kennst. Es gibt nur noch Objekte, die interagieren. Ein Objekt kann bestimmte Eigenschaften anderer Objekte sehen (auf/abrufen). Das ist auch alles was du brauchst um ein sauberes Programm zu erstellen. Wenn du echte OOP hättest, würde es nichts ausser Objekten geben (die zur Laufzeit existieren, Klassen und Interfaces zur Designzeit).
Soetwas wie eine Unit übergreifende Variable braucht man halt in der Regel einfach nicht. Wenn du die Variable i (solltest du lieber sinnvoller benennen) nur aus dem Formular TDeineHauptform heraus verändert wird (durch Knopfdruck hochzählen), dann braucht kein anderer dieses i zu sehen. Also kannst du i einfach als private in deiner Hauptform deklarieren. Willst du den Wert von i in einer anderen Klasse abfragen, brauchst du nur eine Funktion die dir den Wert zurückgibt (das ganze kannst du natürlich auch als Eigenschaft kapseln). Dann hast du etwas wie

Delphi-Quellcode:
type
  TDeineHauptform = class(TForm)
  ....
  ....
  private
    FAnzahlButtonClicks : Integer;
  public
    property AnzahlClicks : Integer read FAnzahlButtonClicks;
  end;
Und der Aufruf aus einem anderen Objekt würde dann einfach die Eigenschaft AnzahlClicks aus der Instanz von TDeineHauptForm abfragen :
Delphi-Quellcode:
begin
  ShowMessage(IntToStr(DeineHauptForm1.AnzahlClicks));
end;
Wie du siehst, ist die Variable i (AnzahlClicks) von aussen nur lesbar. Damit kann die Variable nur noch von TDeineHauptForm direkt geschrieben werden. Da sie (soweit es deinen Beschreibungen zu entnehmen war) auch nur in dieser Klasse verändert wird, ist es sauberer in OOP.
Globale Variablen brauchst du damit nicht mehr (sieht man mal von statischen Variablen ab). Es ist einfach eine andere Herangehensweise, die durchaus ihren Sinn hat. Du wirst kaum ein Problem finden (ich behaupte einfach mal gar keins), dass du nicht auch ohne globale Variablen lösen könntest. Umgekehrt gilt das gleiche, kannst auch jedes OO Programm in Imperative Programmierung umwandeln, über Sinn und Unsinn lässt sich da streiten.
Details zu Pro und Contra findest du auch in der DP viele, einfach mal Suchen. Aber ganz schlecht ist es wie SirThornberry schon sagte Programmierparadigmen zu vermischen.

Sorry auch hier an SirThorberry, dass ich eine an ihn gerichtete Frage beantwortet habe (oder auch nicht beantwortet)

Gruß Der Unwissende

sniper_w 28. Jan 2006 14:39

Re: Durch Klick auf Button eine Integervariable erhöhen
 
Wer rein OOP programmieren will, dann bitte mit c#. Gegen eine globale Variable spricht nichts. Und unsauber wird´s auch nicht.
OOP oder nicht OOP, ist eine ANSICHTSSACHE, die immer wieder heftig diskutiert wird.

IMO, die Hauptsache ist, dass das Programm seine Aufgabe erfühlt.


EDIT:
Lösung des Problemms:
Delphi-Quellcode:
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    Zahl:Integer;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Inc( Zahl );
  Caption := IntToStr( Zahl );
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Zahl := 0;
end;

Der_Unwissende 28. Jan 2006 14:42

Re: Durch Klick auf Button eine Integervariable erhöhen
 
Zitat:

Zitat von sniper_w
Wer rein OOP programmieren will, dann bitte mit c#. Gegen eine globale Variable spricht nichts. Und unsauber wird´s auch nicht.
OOP oder nicht OOP, ist eine ANSICHTSSACHE, die immer wieder heftig diskutiert wird.

IMO, die Hauptsache ist, dass das Programm seine Aufgabe erfühlt.

[OT]
Sorry, wir sind doch jetzt schon richtig OT. Möchte deshalb auch nicht weiter drauf eingehen (gibt da wie gesagt genug Diskussionen), aber die bitte an alle folgenden Leser/Schreiber : "Bitte nicht mir oder sniper_w folgen und noch mehr OT, danke"
[/OT]

Hobby-Programmierer 28. Jan 2006 14:58

Re: Durch Klick auf Button eine Integervariable erhöhen
 
Danke für die Ausführungen, werd mich dann mal mit diesem Thema auseinandersetzen!
Gruss Mario

Elachiim 28. Jan 2006 15:22

Re: Durch Klick auf Button eine Integervariable erhöhen
 
Hier ist nochmal elachiim
Ich weiß auch nicht warum, aber wenn ich die Variable global deklariere und in procedure FormCreate deklariere und mir inc[i], dann gehts auf einmal. Weiß auch nicht warum. Davor hats irgendwie nicht geklappt!
Danke für eure Antworten!

Hobby-Programmierer 28. Jan 2006 18:27

Re: Durch Klick auf Button eine Integervariable erhöhen
 
Zitat:

Zitat von Elachiim
Hier ist nochmal elachiim
Ich weiß auch nicht warum, aber wenn ich die Variable global deklariere und in procedure FormCreate deklariere und mir inc[i], dann gehts auf einmal.

:wiejetzt: Du deklarierst 2 Mal?

Christian Seehase 28. Jan 2006 19:35

Re: Durch Klick auf Button eine Integervariable erhöhen
 
Moin Elachiim,

ich weiss ja nicht, wozu Du diese Funktionalität brauchst, aber Du könntest auch, statt einer Variablen, die Eigenschaft Tag des Buttons dafür verwenden (falls Du Tag nicht für etwas anderes brauchst).

Delphi-Quellcode:
procedure TForm1.Form1Create(Sender : TObject);
begin
  Button1.Tag := 0; // Ist zwar bei Programmstart immer = 0, aber sicher ist sicher.
end;

procedure TForm1.Button1Click(Sender : TObject);
begin
  Button1.Tag := Button1.Tag+1;
end;

Elachiim 1. Feb 2006 17:24

Re: Durch Klick auf Button eine Integervariable erhöhen
 
Zitat:

Zitat von Hobby-Programmierer
Zitat:

Zitat von Elachiim
Hier ist nochmal elachiim
Ich weiß auch nicht warum, aber wenn ich die Variable global deklariere und in procedure FormCreate deklariere und mir inc[i], dann gehts auf einmal.

:wiejetzt: Du deklarierst 2 Mal?

Ich glaube, da habe ich was falsch geschrieben. Ich deklariere nur global. Sorry :-D

Luckie 1. Feb 2006 17:35

Re: Durch Klick auf Button eine Integervariable erhöhen
 
Zitat:

Zitat von sniper_w
Wer rein OOP programmieren will, dann bitte mit c#. Gegen eine globale Variable spricht nichts. Und unsauber wird´s auch nicht.

Doch es ist unsauber. Und spätestens wenn die globale Variable ungewollte Werte annimmt und man sich tot sucht, um den Bug zu finden, sollte klar sein, dass man prinzipiell die Sichtbarkeit so gerimng wie irgend möglich halten sollte.

Zitat:

OOP oder nicht OOP, ist eine ANSICHTSSACHE, die immer wieder heftig diskutiert wird.
Eigentlich nicht. Mittlerweile hat sich wohl die Erkenntniss durchgesetzt, dass OOP Sinn ergibt und eigentlich nur Vorteile gegenüber der prozeduralen Programmierung hat. Versucht du mal 2000 Zeilen Basic Spaghetti Code zu warten, viel Spass dabei. ;)

Zitat:

IMO, die Hauptsache ist, dass das Programm seine Aufgabe erfühlt.
Ah ja. Aber auf der anderen Seite dann über Microsoft meckern, wenn durch Patches und Bugfixes dann folge fehler auftreten. Ich will nicht sagen, dass Folgefeheler nur Folgen von nicht angewendeten OOP sind, aber es trägt bestimmt dazu bei den Code schwerer wart- und erweiterbar zu machen. IMHO ist genau diese Einstellung dafür verantwortlioch, dass viele Programme so verbugt sind. Würden die Entwickler auch mal ihr Augenmerk darauf lenken WIE es zum Laufen gebracht wurde und von verneherein sauber programmieren, könnten viele Fehler verminden werden. Man lese nur mal hier http://thedailywtf.com/ etwas mit. ich bete dann jedesmal, dass ich nicht solch ein Programm unwissentlich runtergeladen,´installiert habe und es auch noch benutze.


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