Autor Beitrag
Sebi82
Hält's aus hier
Beiträge: 9

Win XP
D7 Enterprise
BeitragVerfasst: So 12.08.07 23:07 
Hallo !

Vereinfachte Problemstellung:
- Auf einer Form sind 2 Buttons.
- Ich habe ein TList Objekt "Liste"

Ich möchte beim Klick des ersten Buttons, dass meinem TList-Objekt "Liste" einfach per 'add'-Methode ein weiterer Pointer hinzugefügt wird. Soweit kein Problem.

Beim Druck auf einen zweiten Button möchte ich dann meine ganzen dereferenzierten Pointer der Liste ausgeben. Auch kein Problem.

Jedoch habe ich das TList Objekt "Liste" bisher immer global definiert. Könntet Ihr mir eine Hilfe geben, wie ich das besser lösen könnte?

Viele Grüße und Danke,
Sebi
cuejo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 142

Win XP
Delphi 7 Personal und 2005 PE
BeitragVerfasst: So 12.08.07 23:32 
Es wäre zum Beispiel möglich eine Verwaltungsklasse zu erstellen. Die Liste könnte man darin als Feld einfügen. So könnte man über Properties sauber darauf zugreifen und auch die Erstellung und die Freigabe darin regeln. Meine Meinung. Was sagen die anderen dazu?

_________________
Computer sind dumm, aber fleißig. Deshalb arbeite ich so gerne damit.
Reinhard Kern
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 591
Erhaltene Danke: 14



BeitragVerfasst: Mo 13.08.07 00:08 
user profile iconSebi82 hat folgendes geschrieben:
Hallo !

Vereinfachte Problemstellung:
- Auf einer Form sind 2 Buttons.
- Ich habe ein TList Objekt "Liste"

Ich möchte beim Klick des ersten Buttons, dass meinem TList-Objekt "Liste" einfach per 'add'-Methode ein weiterer Pointer hinzugefügt wird. Soweit kein Problem.

Beim Druck auf einen zweiten Button möchte ich dann meine ganzen dereferenzierten Pointer der Liste ausgeben. Auch kein Problem.

Jedoch habe ich das TList Objekt "Liste" bisher immer global definiert. Könntet Ihr mir eine Hilfe geben, wie ich das besser lösen könnte?

Viele Grüße und Danke,
Sebi


Hallo,

so global betrachtet ist das Vermeiden globaler Variablen um jeden Preis eine globale Dummheit. Leider melden sich hier immer wieder ideologische Eiferer, für die das Teufelszeug ist, aber es gibt in Wirklichkeit überhaupt keine Software ohne globale Variable - in Delphi z.B. ist Application global.

Für globale Objekte ist eine globale Variable immer die richtige Wahl - bei einer Werkzeugmaschine z.B. gibt es nur die eine X,Y,Z Position, die der Werktisch hat (er kann ja nicht an 2 Stellen gleichzeitig sein), also ist das sinnvollerweise auch global gespeichert und was auch immer mit der Position was zu tun hat (Anzeige z.B.) greift auf diese globale Variable zu - so sind Position und Anzeige immer konsistent. Das gleiche gilt für den Sollwert der Position - ein Softwaredesign mit mehreren Sollwerten ist in jedem Fall logisch falsch, denn der Tisch kann sich auch nur zu einer einzigen Position hinbewegen.

In deinem Fall ist das (noch) nicht klar - beide Methoden, die mit der Liste arbeiten, sind ja in der Form (bzw. die Buttons dazu), also könnte Liste problemlos ein Feld von Form sein, so ergibt sich das ja auch, wenn du eine Formkomponente auf die Form ziehst. Andrerseits, wenn Liste das Zentrale ist, was dein Programm bearbeitet, dann ist eine globale Variable durchaus angemessen.

Gruss Reinhard
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mo 13.08.07 00:18 
user profile iconReinhard Kern hat folgendes geschrieben:
bei einer Werkzeugmaschine z.B. gibt es nur die eine X,Y,Z Position, die der Werktisch hat (er kann ja nicht an 2 Stellen gleichzeitig sein), also ist das sinnvollerweise auch global gespeichert
Hätte ich jetzt als Eigenschaften von TWerktisch gemacht :gruebel:

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Sebi82 Threadstarter
Hält's aus hier
Beiträge: 9

Win XP
D7 Enterprise
BeitragVerfasst: Mo 13.08.07 08:33 
Ja, ok, vielen Dank für die Antworten.

Ich denke, das macht durchaus Sinn.

Wo wir aber gerade nochmal beim Thema sind: Gibt es eigentlich auch statische Variablen in Delphi, die man in Funktionen setzen kann?

So wie in c++ :

void foo()
{
static int myInt;
myInt++;
cout << myInt << endl;
}

Somit geht der Wert in myInt nie verloren, trotz erneutem Funktionsaufruf. Es würde also nach dreimaligem Aufruf der Funktion foo() dann "1 2 3" auf dem Konsolenfenster stehen.

Gibt's sowas in Delphi auch, oder muss man hier ebenfalls auf globale Variable bzw. Klassenattribute von z.B. TForm1 (z. B. zaehler : Integer) zurückgreifen?

Grüße,
Sebi
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 13.08.07 09:33 
Deklarier sie unter private von deiner Formklasse. Das sollte genügen.
Reinhard Kern
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 591
Erhaltene Danke: 14



BeitragVerfasst: Mo 13.08.07 09:41 
user profile iconSebi82 hat folgendes geschrieben:
Ja, ok, vielen Dank für die Antworten.

Wo wir aber gerade nochmal beim Thema sind: Gibt es eigentlich auch statische Variablen in Delphi, die man in Funktionen setzen kann?

...
Grüße,
Sebi


speichertechnisch gesehen sind statische Variablen global (sie leben solange wie das Programm), sie sind aber ausserhalb der Funktion nicht sichtbar - so etwas gibt es meines Wissens in Delphi nicht, eine globale Variable erfüllt aber die Funktion. Dass man diese globale Variable auch ausserhalb der Funktion ansprechen kann, ist je nachdem ein Vorteil oder Nachteil, man muss halt aufpassen, dass man keinen Blödsinn damit anstellt. Soll beim Programmieren allgemein zu empfehlen sein.

Gruss Reinhard
Sebi82 Threadstarter
Hält's aus hier
Beiträge: 9

Win XP
D7 Enterprise
BeitragVerfasst: Mo 13.08.07 10:04 
Alles klar, dann nochmals danke!

Grüße,
Sebi