Freitag, 23. November 2007

Arbeiten mit Parameterobjekten / Working with parameter objects

PUBLIC Variablen wurden und werden immer noch gerne als alternative Variante für Parametereinstellungen genutzt. In der heutigen objektorienten Welt ist dies jedoch nicht mehr angebracht. Sie widersprechen dem Grundgedanken des gekapselten und unabhängigen Objekts.

Die Auswertung von Parametern in einem Objekt erfolgt häufig durch das vorherige Füllen von Objekteigenschaften durch das aufrufende Objekt. Bei globalen Parametrisierungen, die von den verschiedensten Formularen und Objekten genutzt werden macht es jedoch wenig Sinn, immer wieder aufs Neue die selben Vorgaben zu setzen. An dieser Stelle macht ein zentrales Parameterobjekt mehr Sinn.

Wichtig hierbei ist jedoch die Unterscheidung zwischen Aufrufparametern und Konfigurationsparametern. 

Beim Aufruf einer Anwendung können dieser bspw. eine Mandanten- und eine Auftragsnummer mitgeben werden. Diese Aufrufparameter haben keinen Einfluss auf das grundsätzliche Verhalten der Anwendung selbst. Sie sorgen nur dafür, dass bereits bestimmte Informationen automatisch geladen und angezeigt werden.

Welche Informationen des Auftrags zur Anzeige kommen, wie der Aufbau des Formulars aussieht und welche Tätigkeiten der Anwender innerhalb der Form durchführen darf, all das sind Konfigurationsparameter, die in einem gesonderten Parameterobjekt vorgehalten werden können, da sie sich während der Sitzung nicht mehr ändern werden.

Ein Parameterobjekt läßt sich sehr einfach erstellen. Als Basis sollte hierbei die 'Empty'-Klasse dienen. Sie enthält keine Eigenschaften, Methoden oder Ereignisse. Neue Eigenschaften lassen sich deswegen nicht durch myEmptyClass.AddProperty() hinzufügen. Schliesslich handelt es sich um eine tatsächlich gänzlich leere Klasse. Neue Eigenschaften und Werte lassen sich jedoch mit der Funktion ADDPROPERTY() sowie mit SCATTER NAME...ADDITIVE erzeugen.
 
oParam = CREATEOBJECT([empty])
ADDPROPERTY(oParam, [Caption], [Überschrift])
ADDPROPERTY(oParam, [startdatum], DATE())
ADDPROPERTY(oParam, [endedatum], DATE()+14)

Mit o.a. Code erhalten wir ein Objekt, das beliebig viele Werte 'huckepack' mit sich tragen kann. Ähnlich einem Array, nur viel einfacher anzusprechen und zu verarbeiten.
Der Einsatz dieses Objektes kann zum Einen über die Bereitstellung in einem globalen Parameterhandler oder auch, sozusagen als Ersatz für einzeln übergebene Parameter beim Formularaufruf erfolgen. In diesem Post werde ich gezielt auf den Einsatz beim Aufruf eines Forms eingehen.

Ein entsprechender Aufruf könnte wie folgt aussehen:
 
DO FORM DatumsEingabe WITH oParam TO oErgebnis

Obiger Mustercode nutzt das zu Beginn definierte Parameterobjekt oParam. Nach dem Beenden der aufgerufenen Form befinden sich die Ergebnisse im Objekt oErgebnis. Damit dies auch tatsächlich der Fall ist, müssen zwei Dinge beachtet werden.
  • Erstens ist die aufzurufende Form vom Windowstype auf MODAL einzustellen.
  • Zweitens muss die Form DatumsEingabe über eine Eigenschaft namens oParameters (zumindest in diesem Beispiel) verfügen. Im INIT dieser Form steht folgender Code:
LPARAMETERS vParameterObj as Object
Thisform.oParameters = m.vParameterObj

Somit wird das beim Aufruf übergebene Object an die dafür vorgesehene Formulareigenschaft weitergereicht. Nun können die Parameterwerte aus dem Objekt ausgelesen und an die verschiedenen Eigenschaften und Objekte des Forms übergeben werden.

WITH Thisform
 .caption = .oParameters.Caption
 .text1.value = .oParameters.Startdatum
 .text2.value = .oParameters.Endedatum
ENDWITH

Die Rückgabe der Werte geschieht üblicherweise im UNLOAD-Event des Formulars.

RETURN Thisform.oParameters

Zuvor sollten im DESTROY-Event des Forms die aktuellen Werte in das Parameterobjekt geschrieben werden:

WITH Thisform
  .oParameters.Startdatum = .Text1.Value
  .oParameters.Endedatum = .Text2.Value
ENDWITH

Dies kann nicht innerhalb von UNLOAD erfolgen, da zu diesem Zeitpunkt bereits sämtliche Objekte auf der Form zerstört wurden.
Nachdem die aufgerufene Form beendet wurde stehen dem aufrufenden Objekt die modifizierten Werte in oErgebnis zur Verfügung und können weiterverarbeitet werden. 

Ergänzung vom 04.06.2008:
JoKi hat heute eine Optimierung zu o.a. Code gepostet, den ich gerne an dieser Stelle hinzufüge.
Berechtigterweise schlägt er vor, anstelle der VALUE-Zuweisung ins Textobjekt und dem späteren zurückschreiben ins Parameterobjekt direkt die jeweilige Parameterobjekt-Eigenschaft der ControlSource der korrespondierenden Textbox zuzuordnen.

Somit reduziert sich dieses Codemuster:
 
WITH Thisform
 .text1.value = .oParameters.Startdatum
 .text2.value = .oParameters.Endedatum
ENDWITH
...
WITH Thisform
  .oParameters.Startdatum = .Text1.Value
  .oParameters.Endedatum = .Text2.Value
ENDWITH

auf diesen Code: 

WITH Thisform
 .text1.ControlSource = .oParameters.Startdatum
 .text2.ControlSource = .oParameters.Endedatum
ENDWITH

@JoKi: Danke für den Hinweis :-)

Keine Kommentare:

Kommentar veröffentlichen