Mit der Premium-Lizenz für click.EXE 5.0 ist es möglich, eigene Objekte zu erstellen und diese in einer objektorientierten Weise einzusetzen (OOP, Objektorientierte Programmierung).
Ein in click.EXE erstelltes Objekt stellt dem Hauptskript einen neuen Platzhalterbereich [Objektname.X] zur Verfügung, der wahlweise mit einem Index bzw. einer ID (Instanz-ID) versehen werden kann ([Objektname(ID).X]), ähnlich wie diverse click.EXE-eigene Platzhalterbereiche wie [cX.Stapel(ID).X]. Welche Eigenschaften X hier zur Verfügung stehen und ob diese gelesen und/oder geschrieben werden können, wird im Code des Objekts definiert. Objekte mit unterschiedlichen IDs sind von einander völlig unabhängig, verfügen also über eigene Fenster und Variablenspeicher, welche während der gesamten Lebensdauer des Objekts existieren.
Lebensdauer:
Es existiert eine spezielle, von click.EXE selbst verwaltete Eigenschaft namens ._Zerstören (s.u.), welche gesetzt wird, um das Objekt zu zerstören. Hierdurch wird dessen Stopp-Ereignis aufgerufen und seine privaten Variablen gelöscht. Ein erneuter Aufruf einer seiner Eigenschaften erstellt danach das Objekt wieder komplett neu.
Die Lebensdauer eines Objekts ist, abgesehen von der manuellen Zerstörung, abhängig von der Lebensdauer des Skriptteils, welches es instanziert hat. Ein in einem normalen Skript verwendetes Objekt lebt bis zum Beenden des Skripts. Wird das Objekt jedoch innerhalb eines externen Skripts mit eigenem Variablenspeicher oder gar in einem anderen Objekt instanziert, wird es mit dem Ende dieses Makros bzw. der Zerstörung des Mutterobjekts ebenfalls zerstört.
Die innerhalb des Objekts verwendeten Variablen liegen in einem eigenen Speicher und sind daher völlig unabhängig von denen des Hauptskripts. Um auf Variablen des Mutterskripts (das aufrufende Skript) oder des Hauptskripts (das Skript, welches vom Anwender gestartet wurde) zuzugreifen, kann [cX.Muttervariablen()] bzw. [cX.Hauptvariablen()] verwendet werden.
Um innerhalb des Objekts auf eigene Eigenschaften zuzugreifen, kann auch [DiesesObjekt.X] angegeben werden, wobei X die Objekteigenschaft ist.
Hinweis: Im Skript einmal definierte Objekte können überall verwendet werden (auch in anderen Objekten).
Spezielle, vom System vorgegebene Eigenschaften aller Objekte sind:
._EigenschaftenListe | Liste aller Eigenschaften als Name=Wert-Liste. Als Index kann angegeben werden, welche Eigenschaften ausgelesen werden sollen: 0=alle, 1=alle nicht-festen, 2=nur schreibbare, 3=nur lesbare, 4=nur les- und schreibbar |
._Existiert | Prüft, ob die angegebene Objektinstanz existiert, und liefert 0 oder 1 zurück. |
._ID | ID der Objektinstanz (etwa "ObjID", wenn per [Objektname(ObjID).X] angesprochen) |
._Name | Objektname (Lesen) |
._Serialisiert | Lesen/Schreiben der Daten im Objekt (Eigenschaftswerte) als serialisierter Text, standardmäßig im Base64-Format (mit Präfix "cXV5"), etwa für das Abspeichern/Wiederherstellen der Daten. Optional kann noch als Index ein anderes Format gewählt werden: 1=cX4-Format, 2=XML, 3=JSON, 4=Binär (nur Lesen) (siehe auch cX.Var()-Objekt) |
._Zerstören | Setzen, um das Objekt zu zerstören, wobei auch dessen Variablenspeicher freigegeben wird Hinweis: Da ein Objekt immer zur Verfügung steht und normalerweise nicht automatisch zerstört wird, kann dies zu unnötigem Speicherverbrauch führen, daher ist das Zerstören nicht mehr benötigter Objekte sehr zu empfehlen. |
Anlegen eines Objekts
Anstelle der manuellen Zusammenstellung eines Objekts ist es zu empfehlen, den Vorlagen-Codeschnipsel für Objekte zu verwenden. Dieser erstellt im Dialog mit dem Anwender den Rumpf eines Objekts, wobei der Objektname korrekt eingetragen und auch die gewünschten Eigenschaften angelegt werden.
Aufbau eines Objekts:
Ein Objekt wird innerhalb zweier spezieller Marken erstellt, die Anfang und Ende des Objektcodes sowie dessen Namen definieren:
:: Objekt(Objektname)_Start
:: Objekt(Objektname)_Ende
Diese Marken werden weder aufgerufen noch vom Programmfluss berührt, sondern dienen nur als Definitionen.
Die Info der _Start-Sprungmarke dient als Beschreibung des Objekts und wird an de entsprechenden Stellen im Editor angezeigt.
Innerhalb dieses Objektcodes wird die Funktionalität des Objekts ausschließlich in Form von Unterprogrammen realisiert. Hierbei gibt es drei verschiedene mögliche Arten:
:: Objektname_Start
:: Objektname_Stopp
Diese beiden Unterprogramme werden bei der Erstellung (Instanzierung) bzw. der Zerstörung eines Objekts aufgerufen. Hier können Initialisierungen bzw. Aufräumarbeiten durchgeführt werden.
Objekteigenschaften
Objekte verfügen über Eigenschaften, die geschrieben und/oder gelesen werden können. Sie werden mit den folgenden Marken definiert:
:: Objektname_Eigenschaft_Lesen
:: Objektname_Eigenschaft_Schreiben
Mit diesen beiden Unterprogrammen wird das Lesen bzw. Schreiben einer Eigenschaft definiert. Wird eines der beiden weggelassen, kann die Eigenschaft lediglich geschrieben bzw. gelesen werden - je nachdem, welche Funktion implementiert ist.
Zur Beschreibung der Eigenschaft, die etwa im Variableninspektor angezeigt wird, kann die Info-Eigenschaft der Sprungmarke verwendet werden.
Beim Lesen eines Eigenschaftswertes wird das Ergebnis im Zurück-Befehl als Rückgabeparameter übergeben.
Beim Schreiben einer Eigenschaft findet sich im Platzhalter [Eigenschaftsname_Wert] der geschriebene Wert.
Es kann beim Aufruf auch ein Parameter angegeben werden (einer oder mehrere als Liste), etwa als [Objektname.Eigenschaft(Index)]. Innerhalb des Ereignis-Unterprogramms kann die Abfrage einzelner Elemente aus dem Index (bei Übergabe einer Werteliste) über [cX.Parameter.X] erfolgen.
Über den Platzhalter [Eigenschaftsname_Index] kann auch der gesamte übergebene Index-Text abgefragt werden.
In der Sprungmarke für das Schreiben kann unter "Info" eine Beschreibung der Eigenschaft eingetragen werden. Diese erscheint etwa bei cXtensionen unter der Eigenschaftenliste, wenn die Eigenschaften eines cXtensions-Befehls bearbeitet werden.
Feste Eigenschaften:
Um für feste und nur lesbare Eigenschaften (z.B. Autorenname, Copyright, ...) nicht extra "Lesen"-Unterprogramme anlegen zu müssen, können diese einfach als Liste angegeben werden.
:: Objektname_!FesteEigenschaften
Hier können eine oder mehrere Eigenschaften als Liste im Info-Feld der Sprungmarke angegeben werden (z.B. Autor=Ich)
Weitere Programmzeilen sind hierbei nicht erforderlich.
Diese vordefinierten Eigenschaften können per [Objektname.Variable] (nur Lesen) verwendet werden und stehen innerhalb der Objektereignisse als [DiesesObjekt.Variable] zur Verfügung.
Daten-Eigenschaften:
Für les- und schreibbare Eigenschaften, welche pro Instanz gelten, kann einfach eine Liste angegeben werden:
:: Objektname_!Eigenschaften
Hier können eine oder mehrere Eigenschaften als Liste im Info-Feld der Sprungmarke angegeben werden, wahlweise auch mit Vorbelegung (z.B. Name=NEU).
Weitere Programmzeilen sind hierbei nicht erforderlich.
Diese vordefinierten Eigenschaften können per [Objektname(ID).Variable] verwendet werden und stehen innerhalb des Objektcodes als einfache Variablen zur Verfügung.
Siehe auch: Datenobjekte
Statische Eigenschaften:
Für ebenfalls les- und schreibbare Eigenschaften, welche objektweit (für alle Instanzen gleich) gelten, kann ebenfalls einfach eine Liste angegeben werden:
:: Objektname_!ObjektEigenschaften
Hier können eine oder mehrere Eigenschaften als Liste im Info-Feld der Sprungmarke angegeben werden, wahlweise auch mit Vorbelegung (z.B. Name=NEU).
Weitere Programmzeilen sind hierbei nicht erforderlich.
Diese vordefinierten Eigenschaften können per [Objektname.Variable] verwendet werden und stehen innerhalb der Objektereignisse als [DiesesObjekt.Variable] zur Verfügung.
Hinweis: Die Werte dieser Eigenschaften gelten für das Objekt selbst und werden nicht pro Instanz getrennt gespeichert.
Objektmethoden:
Objekte können auch Funktionen mit beliebig vielen Parametern bereitstellen, die dann auf der Basis der Objektdaten ausgeführt werden und ein Ergebnis zurückgeben können.
Solche Methoden sind Unterprogramme mit folgendem Aufbau:
:: Objektname_Methodenname(Parameter)
oder mindestens
:: Objektname_Methodenname()
Solche Methoden können über den Aufruf-Befehl als "Objektname(Objekt-ID)_Methodenname" aufgerufen werden, wobei dort auch die Parameter sowie eine Variable für das Ergebnis angegeben werden können.
Ereignisse:
Ein Objekt kann während der Verarbeitung aus Ereignisse auslösen, wobei eine bestimmte Unterprogramm-Marke im Hauptskript aufgerufen wird (falls vorhanden). Hierzu muss beim Aufruf der Ereignismarke der Schalter Als Ereignis gesetzt werden.
Soll also beispielsweise von einem Objekt namens MeinObjekt das Ereignis MeinEreignis ausgelöst werden, wird im Objekt ein Aufruf-Befehl mit dem Ziel MeinEreignis mit gesetztem "Als Ereignis"-Schalter eingesetzt. Im Hauptskript kann dieses Ereignis mit der Marke ::MeinObjekt_MeinEreignis bzw. ::MeinObjekt(ID)_MeinEreignis implementiert und bearbeitet werden, gefolgt von einem Zurück-Befehl. Ist diese Marke nicht im Hauptskript enthalten, geschieht nichts.
::Objektname_!Ereignisse (optional)
Diese Marke dient zur Anmeldung von Ereignissen des Objekts. Diese werden unter Info im Format "Text=Beschreibung" angegeben. In diesem Fall entspricht Text dem Namen des Ereignisses. Weitere Programmzeilen sind hierbei nicht erforderlich.
Diese definierten Ereignisse werden dann auch im Marken-Dialog angeboten.(z.B. ::MeinObjekt_Test).
Hinweis: Innerhalb von Objekten darf kein Warte Endlos vorkommen - dieses würde ansonsten wie ein "Zurück" ausgeführt.
Hinweis: Die mitgelieferten Codeschnipsel enthalten auch einen kompletten Rumpf für ein solches Objekt.
cX-Webseite: http://www.clickexe.net