
Database-Handle global deklarieren
Database-Handle global deklarieren
Ich möchte ein Database-Handle global deklarieren, um aus jeder beliebigen Stelle im Code darauf zugreifen zu können. Außerdem möchte ich Zustandvariablen, die im Zusammenhang mit der DB-Verbindung stehen, gleichermaßen global deklarieren. In den meisten objektorientierten Sprachen benutzt dafür z. B. eine statische Klasse, wie sieht's denn da in Lazarus/Free Pascal aus? 

-
- Beiträge: 90
- Registriert: Fr 2. Nov 2007, 13:32
- OS, Lazarus, FPC: Win (L 1.0 FPC 2.6.0)
- CPU-Target: 32Bit
- Wohnort: Ulm
Re: Database-Handle global deklarieren
Einfach eine neue Unit mit einer TDatenbankVerbindungsKlasse erstellen. Darin die Datenbankverbindungskomponenten (z.B. ZEOS) und andere Zustandsvariablen (mit Sichtbarkeit "private") kapseln, und und und...
Und dann noch im Interface-Teil auch eine Instanz von der Klasse ("MeinNeuesObjekt: TDatenbankVerbindungsKlasse;") benennen und z.B. im "Initialization" Abschnitt erzeugen ("MeinNeuesObjekt := TDatenbankVerbindungsKlasse.Create()").
Sobald Du dann diese Unit irgendwo anders im Programm (mit "uses") einbindest, kannst Du das Objekt nutzen, dass bei Programmstart beim "laden" der Unit in dessen Initialization Abschnitt erzeugt wurde.
Nicht vergessen z.B. im "Finalization" Abschnitt das Objekt wieder freigeben.
Komplizierter wird das u.a. bei Multithreading.
Globale Variablen gehen auch zu deklarieren, aber ich rate Dir lieber mit public/published Eigenschaften von Objekten (Klasse) zu arbeiten. ==> Objektorientierte Programmierung
Ich glaube Du solltest Dir erst einmal die Freepascal oder Delphi Grundlagen genauer anschauen, z.B. hier: http://lazarus-ccr.sourceforge.net/fpcdoc/ref/ref.html, und hier u.a. Kapitel 6
Und dann noch im Interface-Teil auch eine Instanz von der Klasse ("MeinNeuesObjekt: TDatenbankVerbindungsKlasse;") benennen und z.B. im "Initialization" Abschnitt erzeugen ("MeinNeuesObjekt := TDatenbankVerbindungsKlasse.Create()").
Sobald Du dann diese Unit irgendwo anders im Programm (mit "uses") einbindest, kannst Du das Objekt nutzen, dass bei Programmstart beim "laden" der Unit in dessen Initialization Abschnitt erzeugt wurde.
Nicht vergessen z.B. im "Finalization" Abschnitt das Objekt wieder freigeben.
Komplizierter wird das u.a. bei Multithreading.
Globale Variablen gehen auch zu deklarieren, aber ich rate Dir lieber mit public/published Eigenschaften von Objekten (Klasse) zu arbeiten. ==> Objektorientierte Programmierung
Ich glaube Du solltest Dir erst einmal die Freepascal oder Delphi Grundlagen genauer anschauen, z.B. hier: http://lazarus-ccr.sourceforge.net/fpcdoc/ref/ref.html, und hier u.a. Kapitel 6
-
- Lazarusforum e. V.
- Beiträge: 3178
- Registriert: Di 22. Jul 2008, 19:27
- OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
- CPU-Target: 32bit x86 armhf
- Wohnort: Köln
- Kontaktdaten:
Re: Database-Handle global deklarieren
Ich denke, es sind eher Best Practices denn Pascal Grundlagen gefragt.Thomas B. hat geschrieben:Ich glaube Du solltest Dir erst einmal die Freepascal oder Delphi Grundlagen genauer anschauen, z.B. hier: http://lazarus-ccr.sourceforge.net/fpcdoc/ref/ref.html, und hier u.a. Kapitel 6
Neben Thomas' Variante mit einer entsprechenden Klasse und einer globalen Variable fährt man auf jeden Fall besser als mit einem Haufen unzusammenhängender globaler Variablen. In Delphi und Free Pascal bietet sich als Oberklasse TDataModule an. Verwendet man die GUI-Datenbank-Komponenten hat man die angenehme Möglichkeit, die entsprechende Klasse mit der Maus mit entsprechenden Verbindungs-Komponenten zu versehen (und noch einige andere nützliche Dinge hinzuzufügen).
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Re: Database-Handle global deklarieren
Danke für eure Antworten! Verstehe ich das richtig, dass wenn ich ein "Datenbankobjekt" auf meine Form im GUI-Designer ziehe, dieses automatisch global verfügbar ist? (Zumindest in der jeweiligen Form.)
-
- Lazarusforum e. V.
- Beiträge: 3178
- Registriert: Di 22. Jul 2008, 19:27
- OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
- CPU-Target: 32bit x86 armhf
- Wohnort: Köln
- Kontaktdaten:
Re: Database-Handle global deklarieren
Ein Datenobjekt legst du über das Menü "Datei" -> "Neu ..." an. Damit es in einer anderen Unit verfügbar ist, musst du die Unit des Datenmoduls dort in die Uses-Klausel aufnehmen.twinkle hat geschrieben:Danke für eure Antworten! Verstehe ich das richtig, dass wenn ich ein "Datenbankobjekt" auf meine Form im GUI-Designer ziehe, dieses automatisch global verfügbar ist? (Zumindest in der jeweiligen Form.)
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
-
- Beiträge: 90
- Registriert: Fr 2. Nov 2007, 13:32
- OS, Lazarus, FPC: Win (L 1.0 FPC 2.6.0)
- CPU-Target: 32Bit
- Wohnort: Ulm
Re: Database-Handle global deklarieren
Werden Objekte auf der GUI-Form abgelegt, dann erstellt Lazarus automatisch die entsprechenden Verweise im Quellcode.
Alle andere Methoden innerhalb dieser Klasse (TForm) können auf Eigenschaften vom "Datenbankobjekt" zugreifen.
Sollen andere Objekte auch auf diese Eigenschaften (werden in FreePascal gern als private Felder mit Präfix "f" gekennzeichnet) zugreifen können,
kann man sie "public" stellen, oder noch besser eine Eigenschaft daraus machen --> siehe Kapitel 6.4 im obigem Link
Alle andere Methoden innerhalb dieser Klasse (TForm) können auf Eigenschaften vom "Datenbankobjekt" zugreifen.
Sollen andere Objekte auch auf diese Eigenschaften (werden in FreePascal gern als private Felder mit Präfix "f" gekennzeichnet) zugreifen können,
kann man sie "public" stellen, oder noch besser eine Eigenschaft daraus machen --> siehe Kapitel 6.4 im obigem Link