![]() |
global Variablen, Mehrfachdeklaration
Hallo,
in zwei units wird zweimal die gleiche Variable deklariert:
Delphi-Quellcode:
unit1;
INTERFACE uses xxx,yyy; var versa_SB_str : string;
Delphi-Quellcode:
in einer dritten unit steht dann unter uses:
unit2;
INTERFACE uses xxx,yyy; var versa_SB_str : string;
Delphi-Quellcode:
In dieser dritten ist dann letztendlich überhaupt nicht mehr, bei einer Zuweisung, klar welche Variablbe "versa_SB_str" gemeint ist.
uses
unit1,unit2; Ich weiss, dass das katastrophaler Programmierstil ist, aber ich habe ein altes Programm zum Überarbeiten bekommen und weiss an der Stelle eigentlich nicht mehr weiter. Mit D2 kann ich das Ganze kompilieren und läuft. Mit D7 bringt er alles durcheinander. Beide Compiler bringen keine Fehlermeldung! Gibts ein Tool oder eine Möglichkeit solche Doppeldeklarationen zu erkennen? Kann mir jemand helfen? Grüsse Rainer |
Re: global Variablen, Mehrfachdeklaration
Hallo,
ich hatte mal das Problem, das TBitmap auch zweimal deklariert ist. Der Compiler nimmt sich die Deklaration, die in deiner Uses-Anweisung als erstes auftaucht (bei dir Unit1), glaube ich zumindest. Du kannst allerdings auch genau auf die Deklaration zugreifen, die du möchtest mit
Delphi-Quellcode:
Ob du solche Mehrfachdeklarationen auch anders erkennen kannst weiß ich leider nicht.
unit1.versa_SB_str
unit2.versa_SB_str Gruß, Guido |
Re: global Variablen, Mehrfachdeklaration
Hallo,
danke für die Antwort. Die Version unit1.variable ist mir bekannt, nur gemacht hat mein Vorgänger das nirgends. Mein Beispiel ist auch nur die Spitze des Eisbergs. Es geht in mehr als 100 Units kreuz und quer durcheinander. Sieht irgendjemand einen Sinn in einer solchen Doppeldeklaration? Kann ich eine Variable "absolut global" machen, sodass der Compiler merkt, dass es hier eine Doppeldeklaration gibt? Eigentlich müsste man daraus eigentlich schliessen, dass es in Delphi nur unit-globale Variablen gibt und keine wirklich globalen. Grüsse Rainer |
Re: global Variablen, Mehrfachdeklaration
Zitat:
ohne uses ist in Delphi nichts sichtbar, in der dpr-Datei kann man zwar Variablen definieren, aber die kann man in anderen Units nicht verwenden. Die sauberste Methode ist, eine Unit "globals" o.ä. anzulegen, alles globale dort rein zu packen (auch z.B. Prozeduren) und die in allen anderen als erste unter uses aufzuführen. Doppeldeklarationen sind für Delphi ein Problem, u.a. wenn man eine Deklaration in eine andere Unit verlegt. Ich behelfe mir mit der Suchfunktion "in allen Projektdateien suchen". Gruss Reinhard |
Re: global Variablen, Mehrfachdeklaration
Die sauberste Variante ist eher soweit wie möglich auf globale Variablen zu verzichten. Dieses Beispiel zeigt sehr schön warum Globale so ungern gesehen sind bei den meisten Programmierern.
Sinn von solchen Doppeldefinitionen war eventuell das man nicht immer die eine Unit einbinden muss nur weil man die Constante daraus braucht. Also definiert man sie sich neu. Pfofessional ist das natürlich nicht, eine ordentliche Planung sorgt eigentlich dafür das Constanten nur an einer Stelle definiert werden und nicht mehrfach. |
Re: global Variablen, Mehrfachdeklaration
Im Grßen und Ganzen stimme ich dem zu. Aber bei Basisdefinitionen geht das manchmal nicht. Zum Beispiel bei der Definiton der Farbwerten oder Styletypen ist es sinnvoll die Systemweit zu definieren. In dem Fall würde ich ein Teil der Unitbezeichnung in den Anfang des Variablennamens legen. Sonst neige ich dazu als zentrale Speicherstelle ein MemImi-Objekt oder einen MemTree zu nehmen und dort zentral alles abzulegen.
Grüße // Martin PS: Die Verwaltung von Optionseinstellungen scheinen bisher in den meisten Delphianwendungen etwas leidlich gelöst zu sein. |
Re: global Variablen, Mehrfachdeklaration
Zitat:
das Gegenteil ist der Fall: das Problem ist nicht, dass jemand globale Variable verwendet, sondern dass Delphi keine kennt. Das geht ja auch aus deinem 2. Satz hervor - bei echten globalen Variablen dürfte es eben keine unangemeckerten Doppeldefinitionen geben. Wenn ich eine Umrechnungskonstante mm2inch definiere, dann will ich selbstverständlich, dass jedes kleinste Stück meiner Software genau diese Konstante benutzt - was soll daran so böse sein, dass man es verbieten muss? Ist sowieso lächerlich, weil es Software ohne globale Variablen garnicht gibt - schreib mal ein Delphi-Programm ohne Application. Auch wenn man alles dynamisch in den Speicher lädt, was sowieso eher unsicher ist, irgendwo muss ja alles anfangen. Das Problem ist also, dass es Doppeldefinitionen gibt, die es für Globales garnicht geben dürfte, und das ist ein reines Delphi-Problem. Selbst jeder Assembler meldet sowas als Fehler. Gruss Reinhard |
Re: global Variablen, Mehrfachdeklaration
@Reinhard Kern: Es geht ohne ein globales ApplicationObject aber das wäre jetzt eine Grundsatzdikussion und hat mit deinem Problem nichts zu tun.
|
Re: global Variablen, Mehrfachdeklaration
Wenn ich solche "globalen" Variablen brauche, mache ich es ungefähr so:
Delphi-Quellcode:
unit MyGlobals;
interface type ... const ... var ...; MyGlobVar: String; implementation end.
Delphi-Quellcode:
unit Unit1;
interface uses Windows, ..., MyGlobals; type ... implementation procedure TForm1.FormCreate (...); begin MyGlobVar := 'Foo'; end; ... end.
Delphi-Quellcode:
Also eine Unit anlegen, in der solche Sachen gesammelt werden (Types, Consts, Vars) und diese Unit dann in den jeweiligen Units einbinden, wo du die Variablen / Typen / ... brauchst.
unit Unit2;
interface uses Windows, ..., MyGlobals; type ... implementation procedure TForm2.FormCreate (...); begin ShowMessage (MyGlobVar); end; ... end. |
Re: global Variablen, Mehrfachdeklaration
Hallo nuclear,
solange du ein neues Projekt hast mach das auch so. Ich hab aber nach wie vor das Problem, dass mein Vorgänger alle möglichen Variablen an alle möglichen Stellen verteilt hat. Es ist extrem mühsam alle Variablen zu suchen und auch Doppeldeklarationen aufzudecken. Das Projekt umfasst ca 320000 Zeilen Code. Hat jemand eine Ahnung ob es vielleicht irgendein Tool gibt mit dem mir geholfen wird? Wenn nicht schreib ich mir selbst eins. Fazit: Wenn schon globale Variablen, dann übersichtlich in eine Unit! Grüsse Rainer |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:06 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