Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Variable wird gelöscht (https://www.delphipraxis.net/192549-variable-wird-geloescht.html)

tomkupitz 29. Apr 2017 14:26

Variable wird gelöscht
 
Hallo,

ich habe eine globale Variable a, der bei Programmstart (im initialization Abschnitt einer Unit1) ein Pfad zugewiesen wird. Bei Programmende wird diese Variable a im finalization Abschnitt dieser Unit1 nochmals gebraucht, um bestimmte Daten zu speichern. Binde ich nun (in einer anderen Unit2) über uses eine bestimmte Unit3 ein, ist die globale Variable a im genannten finalization Abschnitt leer, ohne das eine Zuweisung erfolgt ist. Lasse ich beschriebene uses Unit3 Zuweisung in Unit2 weg, enthält a am Ende auch wieder den zugewiesenen Pfad.

Klingt kompliziert. Ich hoffe trotzdem, dass es nachvollziehbar ist. Die zugehörigen Quellen kann ich hier nicht veröffentlichen.

Kennt jemand ein solches Verhalten? Kann es mit überkreuzten Bezügen zusammenhängen?

Danke und beste Grüße

Delphi-Laie 29. Apr 2017 14:55

AW: Variable wird gelöscht
 
Nimm mal testhalber statt einer Variablen eine Konstante.

jaenicke 29. Apr 2017 18:25

AW: Variable wird gelöscht
 
Globale Variablen sind eben meistens keine gute Idee...
Eben unter anderem weil sie jeder von überall modifizieren kann ohne dass es einen Setter gibt, auf den man einen Haltepunkt setzen kann.

Um herauszufinden wann und wodurch die Variable geändert wird, gibt es zwei einfache Möglichkeiten:
  • Umbenennen und beim Kompilieren alle Fehlerstellen prüfen
  • Einen Haltepunkt auf die Zuweisung der Variablen setzen und das Programm im Debugger starten. Wenn das Programm dort ankommt, in der Liste der Haltepunkte einen Datenhaltepunkt auf die Variable setzen. Dann hält das Programm an, wenn diese modifiziert wird.

himitsu 29. Apr 2017 19:04

AW: Variable wird gelöscht
 
Jupp, kann so leicht mal passieren, dass jemand ausversehn diese Variable erwischt, wenn es überall im Programm noch mehrere andere Variablen A gibt. :stupid:

p80286 29. Apr 2017 20:04

AW: Variable wird gelöscht
 
Es könnte ja auch sein, daß in der Nachbarschaft die Begrenzung nicht eingehalten wird?

Gruß
K-H

tomkupitz 30. Apr 2017 13:53

AW: Variable wird gelöscht
 
Mache ich eine völlig neue Variable b auf, kopiere zu Progstart b:=a;, dann ist b am Ende auch leer.

Auch interessant:

uses Unit3, Unitx; //a und b leer am Ende

uses Unitx, Unit3; //a und b behalten Pfade

Compiler Bug ???

jaenicke 30. Apr 2017 14:47

AW: Variable wird gelöscht
 
Zitat:

Zitat von tomkupitz (Beitrag 1369490)
Compiler Bug ???

Möglich, aber sehr sehr unwahrscheinlich. Zumal die Verwendung globaler Variablen nicht gerade ein Zeichen sauberen Quelltextes ist und ich somit erst recht auf deinen Quelltext als Ursache tippe.

Hast du denn z.B. mal den Datenhaltepunkt versucht?

tomkupitz 30. Apr 2017 15:03

AW: Variable wird gelöscht
 
Zitat:

Hast du denn z.B. mal den Datenhaltepunkt versucht?
Habe ich. Variable ist nach allen Form Destroy's noch ok. Erst im finalization ist a leer.

Michael II 30. Apr 2017 16:15

AW: Variable wird gelöscht
 
Falls deine Unit eine Form enthält, dann könnest du das Speichern von Dingen doch auch anderswo unterbringen?

( initialization und finalization würde ich nicht mit solchen Dingen "belasten". )

Falls nicht du nicht irgendwo in einer der units den Variablen A und B leer zuweist, dann tönt das interessant... Breakpoints gesetzt und gecheckt, ob du A und B veränderst?

Michael II 30. Apr 2017 17:16

AW: Variable wird gelöscht
 
Hab's rasch gescheckt in XE4, XE6 und Tokyo. Das Verhalten ist immer gleich.

Eine globale Variable wird direkt nach dem finalization Teil der unit. in welcher sie definiert ist geleert.

Wenn du also eine unit1 hast mit einer var a und zum Projekt eine unit2 hinzufügst mit einer var b und das Programm laufen lässt, dann wird unit2 initialisiert, dann unit1 - beim Beenden unit1 finalisiert und dann unit2.
Du kannst bereits im Initialisierungsteil von unit2 a einen Wert zuweisen, aber:

Wenn du im finalization Teil von unit2 auf a zugreifst, dann ist a leer.


[Speichere doch deine Dinge im DestroyForm des Hauptfensters oder sonst irgendwo... ;-), wo noch alle Werte vorhanden sind.]


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:09 Uhr.
Seite 1 von 2  1 2      

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