Meinews.de  


Zurück   Meinews.de > Forum > Newsgroups de.comp.lang.* Forum > Newsgroup de.comp.lang.delphi.misc
Registrieren FAQ Benutzerliste Kalender Suchen Heutige Beiträge Alle Foren als gelesen markieren

Newsgroup de.comp.lang.delphi.misc Borlands Delphi, Anwendung + Programmierung.

Antwort
 
Themen-Optionen Ansicht
  #1  
Alt 11-18-2009, 09:37 PM
Heiko Rompel
 
Beiträge: n/a
Standard Anstatt lokale Variable

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

Mit Zitat antworten
Alt Today
Advertising
Google Adsense
 
This advertising will not be shown
in this way to registered members.
Register your free account today
and become a member on
Meinews.de
Standard Sponsored Links

  #2  
Alt 11-18-2009, 10:39 PM
Rudy Velthuis
 
Beiträge: n/a
Standard Re: Anstatt lokale Variable

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)
Mit Zitat antworten
  #3  
Alt 11-18-2009, 11:52 PM
Sven Lanoster
 
Beiträge: n/a
Standard Re: Anstatt lokale Variable

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.
Mit Zitat antworten
  #4  
Alt 11-19-2009, 12:21 AM
Rudy Velthuis
 
Beiträge: n/a
Standard Re: Anstatt lokale Variable

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
Mit Zitat antworten
  #5  
Alt 11-19-2009, 07:03 AM
Carsten Thumulla
 
Beiträge: n/a
Standard Re: Anstatt lokale Variable

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
Mit Zitat antworten
  #6  
Alt 11-19-2009, 08:00 AM
K. Schubser
 
Beiträge: n/a
Standard Re: Anstatt lokale Variable

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.
Mit Zitat antworten
  #7  
Alt 11-19-2009, 08:20 AM
Torge Ismer
 
Beiträge: n/a
Standard Re: Anstatt lokale Variable

> 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


Mit Zitat antworten
  #8  
Alt 11-19-2009, 10:32 AM
Hans-Peter Diettrich
 
Beiträge: n/a
Standard Re: Anstatt lokale Variable

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
Mit Zitat antworten
  #9  
Alt 11-19-2009, 10:36 AM
Hans-Peter Diettrich
 
Beiträge: n/a
Standard Re: Anstatt lokale Variable

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
Mit Zitat antworten
  #10  
Alt 11-19-2009, 10:55 AM
Ralf Kaiser
 
Beiträge: n/a
Standard Re: Anstatt lokale Variable

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?
Mit Zitat antworten
 
Antwort


Themen-Optionen
Ansicht

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen
Es ist dir nicht erlaubt, auf Beiträge zu antworten
Es ist dir nicht erlaubt, Anhänge anzufügen
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten

vB Code ist An
Smileys sind An
[IMG] Code ist An
HTML-Code ist Aus

Ä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


Alle Zeitangaben in WEZ. Es ist jetzt 05:58 AM Uhr.



Powered by: vBulletin Version 3.6.7 (Deutsch)
Copyright ©2000 - 2010, Jelsoft Enterprises Ltd.
Forum SEO by Zoints