Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   globale Variablen (https://www.delphipraxis.net/116742-globale-variablen.html)

lord.paddington 5. Jul 2008 15:27


globale Variablen
 
Hallo!

Habe eine globale Varibale in der Unit Balken erstellt und möchte in der Unit senden auf diese Variable zugreifen.
Leider bekomme ich eine Fehlermeldung und weiß nicht warum...

Delphi-Quellcode:
uses
  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls,
  Buttons, Balken;
Folgende Felermeldung wird ausgespuckt:
Zitat:

senden.pas(9,18) Fatal: Circular unit reference between senden and Balken
Eigentlich klappte e bisher immer so...was ist falsch?

CK_CK 5. Jul 2008 15:32

Re: globale Variablen
 
Du wirst wahrscheinlich in der "Balken"-Unit auf die Unit "Senden" zugreifen und so rufen sie sich gegenseitig auf.
Füg' doch
Delphi-Quellcode:
uses
  Balken;
mal nach dem Wörtchen implementation ein...

Chris

Phoenix 5. Jul 2008 15:33

Re: globale Variablen
 
Deine Unit Balken benutzt die Unit Senden.
Zwei Units dürfen sich nicht gegenseitig benutzen (zumindest nicht im Interface-Teil).

Das Deutet auf einen Design-Fehler hin. Der Zwang zu einer globalen Variablen übrigens genauso: Sowas sollte man nicht brauchen ;-)

Wenn Du aber darauf bestehst eine globale Variable zu benutzen, dann packe die eben in eine dritte Unit (z.B. GlobalVars) und benutze GlobalVars aus Senden und aus Balken. Damit wäre die Zirkuläre Referenz aufgehoben.

Dennoch lohnt es sich bei sowas meist, ein paar Gehirnwindungen in ein Redesign der Anwendung zu stecken. Wenn man sowas braucht hat man meistens schon ein Problem im Design und das macht die Wartung der Software gegen später immer ungeheuer unangenehm und schwierig.

Assertor 5. Jul 2008 15:50

Re: globale Variablen
 
Zitat:

Zitat von Phoenix
Der Zwang zu einer globalen Variablen übrigens genauso: Sowas sollte man nicht brauchen ;-)

Wobei es immer berechtigte Ausnahmen gibt - ich brauche diese schon recht häufig (globale Variable, die Instanzen hält z.B. von "threadsafen" AppEventLogger, Auto-Updater-Instanz, CriticalSections etc.pp) ;)

Gruß Assertor

lord.paddington 5. Jul 2008 15:52

Re: globale Variablen
 
Volltreffer!


Danke!!!


Warum sind globale Variablen so verpönt???
Habe ich bis heute nicht begriffen!!

Christian Seehase 5. Jul 2008 19:48

Re: globale Variablen
 
Moin lord.paddgington,

Zitat:

Zitat von lord.paddington
Warum sind globale Variablen so verpönt???

Weil diese von jeder beliebigen Stelle des Programmes aus geändert werden können, was zu unangenehmen Seiteneffekten, in Form von Fehlern führen kann.
Einer Stelle des Programmes wird, unter Umständen, ein erforderliche Wert überschrieben, und man erhält ein unerwartetes Verhalten.

Wenn ich denn mal eine globale Variable benötige, bekommt diese immer den Prefix G, damit immer schnell deutlich wird, dass es sich hier um eine solche handelt, und diese mit besonderer Vorsicht behandelt werden muss.
I.d.R. werden die dann aber auch nur beim Programmstart initialisiert (Abschnitt Initialization), und anschliessend, eigentlich, nur noch gelesen, wie, z.B., DecimalSeparator in der Unit SysUtils. Das ist auch eine globale Variable.

lord.paddington 5. Jul 2008 21:46

Re: globale Variablen
 
Danke für die Antwort!
Klingt alles sehr plausibel!

Werde versuchen, zukünftig darauf zu achten, sehr sparsam mit globalen Variablen umzugehen!


Schönes WE


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:59 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz