Zum Inhalt springen

Programmieren mit dBASE PLUS: Benutzerdefinierte Klassen

Aus Wikibooks


Einleitung:

[Bearbeiten]

dBase bietet eigentlich schon eine Menge an Klassen. Warum soll man denn diese Klassen ändern, speichern und neu erstellen?

Es geht einfach darum, die Klassen an die persönlichen Bedürfnisse anzupassen. Diese neuen Klassen sind die Basis für die weitere Arbeit und vererben dann natürlich auch die persönlichen Einstellungen die jeder User für sich festlegen will.

Weiterhin ist es nicht möglich, die Basisklassen zu ändern. In der letzten Versionen 2.6 sind z.B. neue Eigenschaften in den Basisklassen eingeführt worden.

Hier ist die Eigenschaft systemTheme in vielen Klassen angefügt worden, die den Programmen ein Windows-XP aussehen geben soll.

Wenn man dann alle Pushbuttons von seiner eigenen Benutzerdefinierten Klasse abgeleitet hatte, so brauchte man nur in dieser eine Änderung vorzunehmen (systemTheme = false) und schon war alles beim alten. Es ist also sehr wichtig, wenn man sich von Weiterentwicklungen der Company nicht ins Programmieren funken lassen möchte, wie nachstehend beschrieben vorzugehen.

Vorgehensweise:

[Bearbeiten]

Die Vorbereitung.

Es ist sinnvoll die Basisklassen von dBase in Benutzerdefinierten Klassen abzuspeichern. Dazu erstellt man eine Datei mit der Endung .cc, eine CustomClass-Datei. Diese enthält später alle benutzerdefinierte Klassen.

Im Regiezentrum wählen Sie dafür in der Menueleiste Datei\Neu\Programm. Es ist zwar kein Programm, welches wir erstellen wollen, man kann an dieser Stelle jedoch nicht (*.cc) auswählen.

Jetzt öffnet sich der Quelltexteditor und zeigt Ihnen Neu1:prg an. Mit dem Menüpunkt Datei\speichern unter öffnet sich ein Dialogfenster und hier können Sie dann den Dateityp (*.cc) auswählen.

Geben Sie der Datei z.B. den Namen meineKlassen.cc und speichern diese ab.

Sie können diese Datei dann im Regiezentrum bei dem Tabreiter Andere sehen. Ein Doppelklick auf die Datei öffnet diese dann im Quelltext und schon kann es losgehen.

Erstellen Sie zunächst einen Einleitenden Text, der Ihnen später erklärt, was Sie mit dieser .cc eigentlich wollten.

Kommentare können mit // beginnen.

Möchten Sie mehrere Zeilen benutzen dann beginnen Sie mit /* und beenden mit */ den Kommentar. Zeilen, die so beginnen werden vom Compiler ignoriert und dienen dazu, den Quelltext lesbarer zu machen.

Unsere erste Klasse

Der Quelltext könnte nun wie folgt aussehen

/*
Ableitung der Basisklassen von dBase
Erstellt am 10.11.2005 von Winfried Schneller
*/

Damit die Klassen übersichtlicher werden, verwende ich zu Beginn der Klasse eine optische Hilfe. Diese könnte wie folgt aussehen.

//--------------------------------------------------


Beginnen wir nun, die Klasse zu erstellen.

Beispiel:

CLASS Ws_Text(oForm) OF Text(oForm) CUSTOM
with (this)
  text := "Textfeld"
endwith
ENDCLASS

Diese Klasse hat den Namen Ws_Text und ist von der Basisklasse Text abgeleitet. Die einzige Änderung, die hier gemacht wurde, ist das Zuweisen des Wertes "Textfeld" zu der Eigenschaft Text.

Das Hinzufügen der Parameter (oForm) ist wichtig, damit beim Einfügen der Komponente im Form oder in dem Report eine Referenz erzeugt wird. Diese zeigt dann auf das Objekt, in dem Sich die Komponente befindet. In den meisten Fällen ist das die Referenz auf das Form.

Sollten Sie die Komponente jedoch auf einen Container ziehen, so ist das übergeordnete Objekt dann der Container, der dann wiederum das Form als übergeordnetes Objekt hat. Bis man diese so richtig verstanden hat, dauert es etwas, jedoch brauchten Sie sich darum nicht zu kümmern, wenn (oForm) angegeben wird.

Sind Sie bitte hier vorsichtig und benutzen zum Zuweisen neuer Werte := und nicht =

Der Unterschied liegt darin, dass mit := geprüft wird, ob die Eigenschaft schon existiert.

Sollte man sich mal verschreiben und anstelle der Eigenschaft text tetx schreiben, erstellt man eine neue Eigenschaft mit dem Namen tetx. Also besser := zum Zuweisen neuer Werte benutzen. Gerade bei Ihren Basisklassen darf dies natürlich nicht passieren.

Die Eigenschaften, die Sie in Ihrer abgeleiteten Klasse ändern können, sehen Sie in der Beschreibung der Klasse Text. Folgen Sie einfach dem nachstehenden Link. Die Beschreibung der Eigenschaften sind ebenfals verlinkt und können in der Klassenbeschreibung direkt ausgewählt werden. Viel Spaß beim experimentieren.

Zur Klasse Text

Neue Eigenschaften hinzufügen

[Bearbeiten]

Wozu soll ich neue Eigenschaften erstellen?

Bei der täglichen Arbeit fallen einem immer wieder Dinge ein, die das Programmieren einfacher machen. Mir ging es so, als ich das automatische Anlegen der Komponenten in einem Form brauchte.

Aufgabe war es, die verschiedenen Komponenten in dem Event onOpen des Forms erstellen zu lassen.

Dazu wurde auf die Eigenschaften left, width, top und height Bezug genommen.

Mit left + width lässt sich der rechte Rand des Objektes berechnen, mit top + height der untere Rand.

Wer schon viel im Quelltext geschrieben hat, weiß natürlich, dass oft viel Tipparbeit nötig ist, um das zu erhalten, was man benötigt.

Um den Wert Top der Komponente zu erhalten, müssen Sie die gesamte Referenz auf das Objekt liefern wie z. B.

meinForm.meinContainer.meinNotebook.meinTextfeld.top

Wenn Sie nun den unteren Rand der Komponente haben möchten, so würde die Berechnung folgendermaßen aussehen.

meinForm.meinContainer.meinNotebook.meinTextfeld.top + meinForm.meinContainer.meinNotebook.meinTextfeld.height

Oh, ich glaube, das passt schon garnicht mehr in eine Zeile. Nicht nur, dass es langsam unübersichtlich wird, es schleichen sich auch schnell Tippfehler ein.

Eine bessere Lösung ist es, der Komponente in unserem Beispiel Ws_Text zwei neue Eigenschaften zuzuweisen.

  1. Die Eigenschaft rechts
  2. Die Eigenschaft unten

Unsere neue Klasse würde dann wie folgt aussehen:

CLASS Ws_Text(oForm) OF Text(oForm) CUSTOM
with (this)
  rechts = 0
  unten = 0
  text := "Textfeld"
endwith
ENDCLASS

Da rechts und unten keine Eigenschaften der Basisklasse sind, muss hier natürlich = und nicht := für die Zuweisung erfolgen. Hierauf wurde ja schon weiter oben eingegengen.

Unsere Klasse hat also nun zwei neue Eigenschaften. Ein Problem bei den Klassen ist jedoch, dass diese Eigenschaften im Inspektor nicht zu ändern sind. Man kann sie sich jedoch ansehen.

Diese Eigenschaften befinden sich im Inspektor unter benutzerdefiniert.

Um zu testen, ob dBase die Werte für unsere neuen Eigenschaften richtg berechnen kann, benutzen wir das Event onDesignOpen.

Wir können also unserer neuen Klasse gleich sagen, was passieren soll, wenn wir uns unser Formular im Designer ansehen wollen. Dazu bauen wir in unserer Klasse dieses Event mit ein.

Die Klassenkonstruktion sieht nun wie folgt aus:

CLASS Ws_Text(oForm) OF Text(oForm) CUSTOM
with (this)
  onDesignOpen = class::berechne
  rechts = 0
  unten = 0
  text := "Textfeld"
endwith
function berechne
  this.rechts = this.left + this.width
  this.unten = this.top + this.height
return
ENDCLASS

Wenn Sie nun diese Komponente wie unten stehend benutzen, können Sie sich das Verändern der Werte im Objektinspektor ansehen. Ziehen Sie dazu die Komponente Ws_Text aus der Komponentenpalette auf das Form.

Setzen left und top auf 0.

Das Textfeld sollte sich nun in der linken oberen Ecke des Form befinden.

Setzen Sie den Wert width auf 100 und den Wert height auf 50.

Das Objekt hat nun seine Ausgangswerte. Speichern Sie das Formular ab und öffnen es wieder im Designer.

Das Event, welches wir hierfür ja eingesetzt haben, hat den Namen onDesignOpen. Also müssen wir es natürlich im Designer öffnen, damit es feuert.

Ein Blick auf den Inspektor zeigt uns nun die benutzerdefinierten Werte rechts und unten richtig an.

Da die Funktion den Namen berechnen hat, können Sie natürlich den Aufruf berechnen bei jedem Event durchführen lassen. Zum Beispiel im onOpen u.s.w.. Jedes mal wenn Sie berechnen aufrufen, wird Ihnen der aktuelle Wert in die Eigenschaften geschrieben.

Ich hoffe es war bis hierhin nicht zu viel. Aber auch hier kann man sagen, dass es bei der Weiterentwicklung keine Grenzen gibt, und man sich selbst die tollsten Konstruktionen zusammen bauen kann. Einfach nach den eigenen Wünschen und Vorstellungen.

Neue Klasse benutzen

[Bearbeiten]

Jetzt möchten Sie sicher wissen, wie Sie die soeben erstellte Klasse benutzen können?

Nichts einfacher als das. Speichern Sie die Änderungen an der Datei meineKlassen.cc und schließen diese. Markieren Sie die Datei und drücken die rechte Maustaste. In dem Menü sehen Sie den Menüpunkt Benutzerdefinierte Komponenten laden. Bestätigen Sie diesen Menüpunkt oder benutzen Sie die Taste F2. Jetzt kennt auch dBase Ihre neue Klasse.

Wenn Sie nun ein neues Formular erstellen, sehen Sie nachdem Sie im Formulardessigner die Komponentenpalette geladen haben, den Tabreiter Individuell. Wenn Sie diesen Auswählen finden Sie die abgeleitete Textkomponente Ws_Text. Ziehen Sie diese auf das Form. Dieses Textfeld hat nun in der Eigenschaft text das Wort "Textfeld" stehen. Genau wie Sie es wollten.

Sie können natürlich alle anderen Eigenschaften wie die Schrift, Größe, Farbe u.s.w. festlegen und sind nicht mehr von den Vorgaben der Basisklasse Text abhängig.

Grundsätzliches

[Bearbeiten]

Mit dem Befehl:

set procedure to meineKlassen.cc additive

werden diese im Quellcode verfügbar gemacht. Vergessen Sie nicht das Wort additive. Dies bewirkt, dass die Prozedurdatei hinzugefügt wird. Wird dieses Wort vergessen, so werden alle anderen Prozeduren geschlossen und dann die neue geöffnet. Ein kleines Wort mit großer Wirkung.

Diese trifft nur bei dBase Plus Version < 2.5 zu. Ab dieser Version und höhere Versionen ist der Zusatz additive als Standard integriert und braucht deshalb nicht mehr angegeben werden!


Richtlinien zur Groß- und Kleinschreibung

Klassennamen beginnen mit einem Großbuchstaben. Besteht ein solcher Name aus mehreren Wörtern, werden diese Wörter ohne Trennzeichen zusammengefügt. Jedes Wort beginnt mit einem Großbuchstaben:

  • Form
  • PageTemplate