![]() |
|
|||||||
| Newsgroup de.comp.lang.delphi.misc Borlands Delphi, Anwendung + Programmierung. |
![]() |
|
|
Themen-Optionen | Ansicht |
|
#1
|
|||
|
|||
|
Moin,
ich möchte z.B. Paramstr() einmal beim Programmstart auslesen und danach in verschiedenen Units benutzen. Jetzt habe ich viel gelesen das Globale Variablen pfui sind. Aber durch die Tips und Anleitungen blicke ich eigentlich nicht durch. Kann mir jemand hier mit einfachen verständlichen Worten erklären wie und wo ich Werte hinterlege, auf die ich von mehreren Stellen zugreifen kann.? Bitte jetzt nicht" Du hast doch so viele Delphi-Bücher, lese es nach" Auch nach dem 10ten mal lesen bekomme ich höchstens einen Knoten im Kopf. Ein kleines Beispiel bleibt bei mir eher hängen. (Ja, ich weiß das ich seit Jahren hier lese und schreibe, aber mit Chance komme ich im Monat ein bis zwei Stunden dazu an einem Projekt zu basteln) Gruss der "alte" Heiko |
|
|
||||
|
||||
|
|
|
#2
|
|||
|
|||
|
Heiko Rompel wrote:
> Moin, > > ich möchte z.B. Paramstr() einmal beim Programmstart auslesen und > danach in verschiedenen Units benutzen. > Jetzt habe ich viel gelesen das Globale Variablen pfui sind. > > Aber durch die Tips und Anleitungen blicke ich eigentlich nicht durch. > Kann mir jemand hier mit einfachen verständlichen Worten erklären > wie und wo ich Werte hinterlege, auf die ich von mehreren Stellen > zugreifen kann.? Globale Variablen, oder besser noch: nur-lesbare Klasseneigenschaften einer Klasse für diesen Zweck. Globale Variablen sind nur ein Problem weil jeder sie modifizieren (und versauen) kann. Also kannst du sie z.B. in nur-lesbare Klasseneigenschaften ablegen. -- Rudy Velthuis http://rvelthuis.de "He can compress the most words into the smallest idea of any man I know." -- Abraham Lincoln (1809-1865) |
|
#3
|
|||
|
|||
|
Heiko Rompel schrieb:
> ich möchte z.B. Paramstr() einmal beim Programmstart auslesen und > danach in verschiedenen Units benutzen. > Jetzt habe ich viel gelesen das Globale Variablen pfui sind. Wie Rudy schon schrieb: nimm am Besten ein Singleton. Type TpGlobal = class(TObject) private FPfad: string; protected constructor InternCreate; // ruft inherited create auf public constructor create; override; // wirft exception property Pfad: string read FPfad; //oder getPfad... end; function pGlobal: TpGlobal; implementation var gpGlobal: TpGlobal; function pGlobal: TpGlobal; begin if not assigned(gpGlobel) then gpGlobel := TpGlobal.InternCreate; result := gpGlobal; end; .... init gpGlobal := NIL; //sicher ist sicher final FreeAndNil(gpGlobal); end. Irgendwie so, mal spontan ins posting getippselt. Logik klar? MfG, Sven. |
|
#4
|
|||
|
|||
|
Sven Lanoster wrote:
> Heiko Rompel schrieb: > > > ich möchte z.B. Paramstr() einmal beim Programmstart auslesen und > > danach in verschiedenen Units benutzen. > > Jetzt habe ich viel gelesen das Globale Variablen pfui sind. > > Wie Rudy schon schrieb: nimm am Besten ein Singleton. > > Type > TpGlobal = class(TObject) > private > FPfad: string; > protected > constructor InternCreate; // ruft inherited create auf > public > constructor create; override; // wirft exception > property Pfad: string read FPfad; //oder getPfad... > end; In Delphi 2010 kann man das vereinfachen: type TGlobals = class private class var GCommandLinePath: string; class constructor ClassCreate; // initialisiert GCommandLinePath public class property CommandLinePath: string read GCommandLinePath; end; Dann braucht man gar kein Objekt zu kreieren, MAW, das Singleton ist die Klasse selbst. ClassCreate setzt die Variable vor dem ersten Gebrauch der Klasse und damit hat sich's. -- Rudy Velthuis http://rvelthuis.de "I do not believe that any type of religion should ever be introduced into the public schools of the United States." -- Thomas Edison |
|
#5
|
|||
|
|||
|
Heiko Rompel wrote:
> Jetzt habe ich viel gelesen das Globale Variablen pfui sind. Sie sind nicht pfui. Allohol ist ja auch nicht pfui. Täglich 'ne Flasch Whisky ist pfui. > Aber durch die Tips und Anleitungen blicke ich eigentlich nicht durch. > Kann mir jemand hier mit einfachen verständlichen Worten erklären > wie und wo ich Werte hinterlege, auf die ich von mehreren Stellen > zugreifen kann.? Ne Unit Bibliothek z.B. die in allen Modulen aufgerufen wird. > Ein kleines Beispiel bleibt bei mir eher hängen. Startunit liest Parameter und schreibt in Variable in Bibliotheksunit. Diese wird dann von allen genutzt. So mach ich das zur Zeit. Carsten -- http://www.nichtlustig.de/toondb/081028.html |
|
#6
|
|||
|
|||
|
Heiko Rompel schrieb:
> Moin, > > ich möchte z.B. Paramstr() einmal beim Programmstart auslesen und > danach in verschiedenen Units benutzen. > mit > Chance komme ich im Monat ein bis zwei Stunden dazu an einem Projekt > zu basteln Dann verwende ruhig globale Variablen. Man kann es mit OOP auch übertreiben. Also in unit1 var Form1: TForm1; heikosparamstr1: string; procedure TForm1.FormCreate(Sender: TObject); begin if paramcount > 0 then heikosparamstr1:= paramstr(1) else heikosparamstr1:= ''; end; Falls Du mehr als 50 units verwendest, dann empfehle ich allerdings eine andere Implementierung. Gruß K. |
|
#7
|
|||
|
|||
|
> ich möchte z.B. Paramstr() einmal beim Programmstart auslesen und
> danach in verschiedenen Units benutzen. > Jetzt habe ich viel gelesen das Globale Variablen pfui sind. Ach, mit solchen Dogmen sollte man vorsichtig sein. Sicherlich sollte man beim Gebrauch globaler Variablen aus den bekannten Gründen ein wenig Vorsicht walten lassen. Das heißt aber nicht, dass es nicht sinnvolle Anwendungsbereiche gibt. Wenn man es begründen kann, darf man durchaus auch globale Variablen, exit, Variants und was sonst noch so verteufelt wird einsetzen. In meinen Programmen gibt es für gewöhnlich eine global zugängliche Klasse, in der ich alle Konfigurationseinstellungen ablege. Es ist eine Klasse, weil ich hier auch gleich die Prozeduren zum Ablegen der Einstellungen in der Ini-Datei oder der Registry einbaue. In diese Klasse lege ich aber auch Daten, die nicht gespeichert werden. So habe ich einen zentralen Ort für alle Konfigurationseinstellungen. Gruß Torge |
|
#8
|
|||
|
|||
|
Sven Lanoster schrieb:
> Wie Rudy schon schrieb: nimm am Besten ein Singleton. > > Type > TpGlobal = class(TObject) > private > FPfad: string; > protected > constructor InternCreate; // ruft inherited create auf > public > constructor create; override; // wirft exception Ich nehme dafür lieber class function Create: TpGlobalObject; Läßt sich verwenden wie ein Konstruktor, liefert aber bei mehrfachem Aufruf die zuvor konstruierte Instanz. Man kann auch ganz auf die Erzeugung einer Instanz verzichten, und die Properties mit "class" Methoden implementieren (soweit der Compiler da mitmacht). Oder Object oder Record mit entsprechenden Methoden verwenden, die brauchen keinen Konstruktor. DoDi |
|
#9
|
|||
|
|||
|
K. Schubser schrieb:
> Also in unit1 > > var Form1: TForm1; > heikosparamstr1: string; > > procedure TForm1.FormCreate(Sender: TObject); > begin > if paramcount > 0 then heikosparamstr1:= paramstr(1) > else heikosparamstr1:= ''; > end; Warum dann nicht gleich heikoparamstr1 als read-only Eigenschaft der MainForm (Form1) implementieren? Die MainForm ist doch in GUI Programmen schon ein Singleton... DoDi |
|
#10
|
|||
|
|||
|
Hans-Peter Diettrich schrieb:
> > Warum dann nicht gleich heikoparamstr1 als read-only Eigenschaft der > MainForm (Form1) implementieren? Die MainForm ist doch in GUI Programmen > schon ein Singleton... > Seit wann das denn? Was hindert einen daran, das Hauptformular später als weitere Instanz neu zu erzeugen? |
|
|
|
|
![]() |
| Themen-Optionen | |
| Ansicht | |
|
|
Ähnliche Themen
|
||||
| Thema | Erstellt von | Forum | Antworten | Letzter Beitrag |
| bash: Array Variable in anderer Variable speichern | Michael Schmarck | Newsgroup de.comp.os.unix.shell | 6 | 09-08-2008 06:55 PM |
| OUT or INOUT argument 2 for routine verwaltung.test is not a variable or NEW pseudo-variable in BEFORE trigger | Stephan Menzel | Newsgroup de.comp.datenbanken.mysql | 1 | 08-18-2008 09:53 AM |
| OUT or INOUT argument 2 for routine verwaltung.test is not a variable or NEW pseudo-variable in BEFORE trigger | Stephan Menzel | Newsgroup microsoft.public.de.access | 2 | 08-18-2008 09:49 AM |
| wget aktzeptiert http_proxy nicht, wenn die Variable über eine andere Variable initialisiert wurde. | Pedro Santos | Newsgroup de.comp.os.unix.shell | 16 | 03-22-2008 06:21 PM |
| mit new Objekt erzeugen ohne lokale Variable | Ernst Baumann | Newsgroup de.comp.lang.java | 24 | 10-21-2007 03:57 PM |