![]() |
GlobalObjects
|
Damit GlobalObjects arbeiten kann, sind einige Vorbereitungen zu treffen. Es werden hier alle benötigten Dateien und Einstellungen angesprochen, welche GlobalObjects benötigt um Objekte speichern, lesen und löschen zu können. Dieses kann durch das GlobalObjects-Tool GloDeveloper erledigt werden. Der GloDeveloper ist die Anwendung, mit der GlobalObjects-Objektdatenbanken erstellt und alle benötigten Header- und Source-Dateien für Klassen persistenter Objekte erstellt bzw. gewartet werden.
Der GloDeveloper ist eine typische MDI-Anwendung. Die eigenständig zu bearbeitenden Objekte, wie z.B. Klassen, werden in eigenen Dokumentfenstern bearbeitet, nur abhängige Objekte, wie z.B. Attribute, werden in Dialogen bearbeitet.
GloDeveloper nach dem ersten Start.
Hinweis: Der GloDeveloper kann mit der Übergabe einer Projektdatei (z.B.: GloDeveloper.exe "D:\Projekte\GlobalObects xx.xx\GloExamples\Bases\FirstGloProject.prj"
) gestartet werden, welche dann eingelesen wird.
Objektdatenbanken werden in Projekten angelegt. Der GloDeveloper kann mehrere Objektdatenbanken in einem Projekt verwalten. Das ist z.B. hilfreich, wenn eine Klasse in mehreren Objektdatenbanken vorkommen soll; man kann diese von einer Objektdatenbank in eine andere kopieren oder verschieben.
In diesem Beispiel soll die Objektdatenbank bzw. das GlobalObjects-Schema im Verzeichnis "D:/Projekte/GlobalObects xx.xx/GloExamples/Bases/"
angelegt werden.
Nach dem Start des GloDeveloper kann ein Projekt angelegt werden. Es kann auch eine Beschreibung verfasst werden.
Das neue Projekt wird unter dem Namen "FirstGloProject"...
...gespeichert. Die Ausgabe sieht ungefähr so aus:
Nun können wir eine Objektdatenbank (bzw. ein GlobalObjects-Schema,) anlegen.
Die Bezeichnung der Objektdatenbank ist FirstGloBase.
Das GlobalObjects-Schema wird im Verzeichnis "D:/Projekte/GlobalObects xx.xx/GloExamples/Bases/"
abgelegt.
Im Daten-Unterverzeichnis "D:/Projekte/GlobalObects xx.xx/GloExamples/Bases/FirstGloBase"
werden später die Daten gespeichert.
Die zu generierenden Header- und Source-Dateien der einzelnen Klassen werden in die Verzeichnisse "D:/Projekte/GlobalObects xx.xx/GloExamples/Bases/include/"
und "D:/Projekte/GlobalObects xx.xx/GloExamples/Bases/source/"
gespeichert.
Wenn der Dialog mit [OK] bestätigt, wird die Datenbank mit der Basisklasse glo::Persistent angelegt.
Jetzt kann die erste persistente Klasse angelegt werden.
Die Klasse bekommt die Bezeichnung FirstClass. Wenn das Eingabefeld "Klassen-Name" zum ersten mal nach der Eingabe einer Bezeichnung verlassen wird, wird diese als "Objektdatei-Name" und als "Headerdatei-Name" übernommen; wir belassen es bei diesen Bezeichnungen (könnten aber überschrieben werden). Diese Klasse wurde automatisch als Unterklasse von glo::Persistent angelegt.
Ein persistentes Attribut, welches die Bezeichnung FirstAttribute bekommt, wird über einen Dialog angelegt. Wenn das Eingabefeld "Attribut-Name" zum ersten mal nach der Eingabe einer Bezeichnung verlassen wird, wird diese als "Objektdatei-Feldname" übernommen (könnten aber überschrieben werden). Zusätzlich bekommt das Attribut eine Beschreibung.
Noch ist die neue Klasse nicht im GlobalObjects-Schema. Das wird mit den Button [Übernehmen] bzw. [OK] erreicht.
Die neue Klasse wird im Projekt-Katalog angezeigt.
Die Datenbank bzw. das Datenbankschema kann jetzt oder später gespeichert werden.
Die Ausgabe sieht ungefähr so aus:
Um alle benötigten Dateien zu generieren, muss das Menü Erzeugen / Alle Files des selektierten Objekts generieren sichtbar werden. Dafür reicht ein rechter Maus-Klick im Projekt-Katalog. Damit alle Dateien für die Objektdatenbank generiert werden, muss der Eintrag FirstGloBase bzw. der darunter liegende Eintrag Klassen selektiert sein.
Es wird in der Ausgabe angezeigt, was gemacht wurde. Wenn das Erstellen der Dateien zum ersten mal angestoßen wird, sieht die Ausgabe ungefähr so aus:
Im folgenden werden die resultierenden Dateien des Projektes "FirstGloProject" aufgezeigt und ihre Bedeutung beschrieben.
Die vom GloDeveloper erstellte Projektdatei "FirstGloProject.prj"
kann für eine weitere Verarbeitung vom diesem wieder geladen werden. Sie sollte vom Nutzer nicht direkt bearbeitet werden.
So sieht die FirstGloProject.prj aus.
GlobalObjects braucht für jede Objektdatenbank eine GlobalObjects-Schemadatei, um aus Objektdateien C++ Objekte und aus C++ Objekten Objektdateien bauen zu können. Die Datei "FirstGloBase.ini"
, erstellt vom GloDeveloper, ist der Vollständigkeit halber hier mit aufgeführt und sollte vom Nutzer nicht bearbeitet werden.
Weitere Informationen zur GlobalObjects-Schemadatei.
Damit GlobalObjects aus der Objektdatenbank Objekte erstellen kann, wird eine Objektersteller-Klasse benötigt, die weiß, welche Objekte einer Klassen-ID entsprechen und diese instanziieren kann. Die im angegebenen Header-Verzeichnis vom GloDeveloper generierte Datei "FirstBaseObjCreator.h"
wird in das eigene Projekt eingebunden und sollte vom Nutzer nicht direkt bearbeitet werden. Es werden vom Objektersteller alle persistenten Klassen eingebunden.
Beispiel der FirstBaseObjCreator.h.
Die im angegebenen Header-Verzeichnis, vom GloDeveloper generierte Header-Datei "FirstClass.h"
der persistenten Klasse FirstClass, kann weitestgehend vom Nutzer verändert und erweitert werden. Der einzige Bereich, welcher vom GloDeveloper benötigt wird, ist der zwischen den Einträgen "private persistent:" und "private transient:". Wenn die Kommentare beginnend mit "//@@glo" entfernt werden, wird der GloDeveloper diese Bereiche nicht mehr aktualisieren. Es wird empfohlen, diese Kommentare nicht zu entfernen.
Bitte fügen sie ,wie unten zu sehen, zusätzlich eine Get- und Set-Methode ein, um im anschließenden Programm das Attribut "FirstClass.FirstAttribute"
lesen und setzen zu können. Dieser Bereich wird bei Änderungen durch den GloDeveloper nicht "angefasst".
Die vom GloDeveloper im angegebenen Source-Verzeichnis generierte Source-Datei "glo_FirstClass.cpp"
der persistenten Klasse FirstClass muss im Softwareprojekt eingebunden werden. Sie enthält Anweisungen für GlobalObjects und sollten vom Nutzer nicht bearbeitet werden.
Beispiel der glo_FirstClass.cpp
Damit die zu erstellende Applikation weiß, wo die Objektdatenbank zu finden ist, muss im Verzeichnis der Applikation eine "DB.ini"
mit folgendem Inhalt erstellt werden:
Wenn der GloServer ausprobiert werden soll, sollte die "DB.ini"
im Verzeichniss des GloServer stehen und so aussehen:
Für jede persistente Klasse wird vom GloDeveloper eine Objektdatei angelegt, in welche die Werte der einzelnen Attribute geschrieben werden.
Im folgenden wird beschrieben, wie Objekte der persistenten Klasse FirstClass in die Objektdatenbanken gespeichert und aus dieser wieder gelesen werden.
Voraussetzungen:
"$(EUCPPDIR)/GlobalObjects/include"
, "$(EUCPPDIR)/EuTools/include"
, "$(EUCPPDIR)/PtlContainer/include"
und "D:/Projekte/GlobalObects xx.xx/GloExamples/Bases/include"
müssen eingebunden sein. "EUCPPDIR"
hält den Pfad zum Verzeichnis "Src"
, siehe auch GlobalObjects Umgebungsvariablen und Setup GlobalObjects C++ Header. GLOAvXXXXXXXX.dll
muss eingebunden sein. Siehe auch Setup Biblioteken (LIBs und DLLs). Es stehen zwei kommentierte Beispiel Main.cpp Dateien zur Verfügung.
Wichtig sind folgende Zeilen, welche hier nochmals erklärt sind:
Um Objekte aus GlobalObjects lesen bzw. schreiben und ändern zu können, muss eine glo::Base mit einem entsprechenden Objektersteller instanziiert werden. Siehe auch Beschreibung des Konstruktors von glo::Base.
bzw.
Noch kann mit der Objektdatenbank nicht gearbeitet werden, dafür muss man sich mit dieser verbinden und öffnen. Dieses wird in der Methode glo::Base::openBaseComfortably (...) zusammengefasst.
Der Rückgabewert (int t_iErr) sollte ausgewertet werden.
Um durch die Menge von persistenten Objekten eines Typs zu iterieren ist der glo::TAllSet die richtige Klasse. Der AllSet wird mit dem Template-Parameter der gewünschten Klasse und mit der geöffneten Objektdatenbank als Parameter instanziiert.
Folgende Zeile holt das erste gespeicherte Objekt im übergebenen Parameter "t_spShowPersObject"
aus der Objektdatenbank.
Das geladene Objekt ist wie man es erwartet mit seinen Werten im Speicher!
Nun kommen wir zum Anmelden und Speichern eines persistenten Objekts. Dafür wird erst mal ein persistentes Objekt instanziiert. Da ein persistentes Objekt nur über glo::BasePersistent::forget() aus dem Speicher entfernt werden darf, wird ein entsprechender "Deleter" mit übergeben:
Es können die Werte im Objekt gesetzt werden. Bevor das Objekt gespeichert werden kann, muss dieses eine eindeutige Objekt-ID (siehe auch glo::ObjID) bekommen. Dieses wird mit dem Anmelden an die Objektdatenbank erledigt. Ein persistentes Objekt muss nur einmal, vor dem ersten Speichern an die Objektdatenbank, angemeldet werden. Danach behält es seine eindeutige Objekt-ID.
Wenn alles gut, kann das Objekt gespeichert werden.
Zu guter Letzt muss die Objektdatenbank geschlossen werden, weil unter anderem die aktuellen Indizes geschrieben werden.