Klasse Klassen!

Eine weitere Hürde für alte Programmierhasen beim Aneignen eines objektorientierten Programmierstils ist die konsequente Behandlung aller möglichen Dinge als Klassen. Klassen können Sie als Bauplan für Objekte ansehen, die Sie dann im Programm verwenden. Damit haben Sie vom allerersten Moment mit Xojo direkten Kontakt:

Wenn Sie ein Desktop-Projekt anlegen, erscheint im Layout-Editor von Xojo ein Fenster. Das ist ziemlich praktisch, denn in den allermeisten Fällen wollen Sie bei einem Desktop-Programm auch eine Kommunikation mit dem Benutzer etablieren – und die läuft in der Regel in Fenstern ab.

Neues Fenster

Schauen Sie mal in den Inspector (das ist die Spalte rechts im Hauptfenster. Wenn es dort anders aussehen sollte, sofern Sie das Fenster im Layout-Editor angeklickt haben, haben Sie wahrscheinlich die Library geöffnet, aus der Sie neue Steuerelemente in das Fenster ziehen können. Klicken Sie in diesem Fall auf das Inspector-Symbol oben rechts.)

Sie sehen ganz oben einen Namen – in diesem Fall Window1 –, den Sie frei verändern können. Das ist nicht der Titel des Fensters, sondern der Name seiner Instanz (dazu unten mehr), unter dem Sie das Fenster in Ihrem Programm ansprechen können.

Direkt darunter jedenfalls finden Sie ein Feld „Super“. Das ist die Klasse des Fenster – in diesem Fall heißt sie sinnigerweise Window.

Und ganz weit unten finden Sie einen Schieber „Implicit Instance“, der auf „On“ gesetzt ist.

Wie geht das jetzt alles zusammen?

Die Xojo-Programmierer haben schon fertige Schablonen für alle möglichen Arten von Steuerelementen angelegt (Steuerelemente oder Controls sind Objekte, die Sie in Ihrem Programm verwenden können. Viele davon haben grafische Repräsentationen, wie etwa ein Button oder eben ein Fenster. Einige sind auch unsichtbar, stellen aber trotzdem Kommunikationsmöglichkeiten zur Verfügung – ein Socket beispielsweise, das Sie zur Kommunikation über eine Schnittstelle verwenden können).

Diese Steuerelemente sind Klassen – Schablonen, die den Bauplan für ein bestimmtes Objekt liefern. Klassen selbst existieren nicht als ansprechbare Objekte in Ihrem Programm. Um Sie zu nutzen, müssen Sie eine Instanz einer Klasse erschaffen – sozusagen den Bauplan einmal abarbeiten lassen und dem Ergebnis einen eindeutigen Namen zuweisen.

Library DesktopFür Klassen, die Sie in der Library vorfinden (klicken Sie einmal auf das Symbol und schauen Sie, was darin alles so liegt – hier links ein kleiner Auszug), ist dieser Vorgang sehr einfach: Sie ziehen Sie in das Fenster – voilà! Eine neue Instanz!

Dieser wird automatisch ein neuer, eindeutiger Name zugeteilt (es ist aber sehr ratsam, diesen zu ändern, damit Sie in Ihrem Programm nicht überlegen müssen, ob Sie nun Button21 oder Button121 ansprechen müssen, um eine Aktion auszuführen), und damit hat es sich.

Praktisch sieht das so aus: Nehmen wir an, Sie ziehen einen Default Button (das ist ein hervorgehobener Knopf, der auf „Return“ reagiert) auf Ihr Fenster. Schalten Sie dann wieder auf den Inspector um, sehen Sie, dass der Knopf den Titel „Pushbutton1“ trägt. Die Instanz des Fensters wiederum, wir erinnern uns, heißt „Window1“.

Nun doppelklicken Sie einmal auf PushButton1. Es erscheint die „Add Handler“-Dialogbox. Da ein Button eine Vielzahl von Events erkennen und signalisieren kann, können Sie hier auswählen, zu welcher Art von Geschehnis Sie Programmcode hinzufügen wollen.

Das Naheliegendste ist hier der „Action“-Event. Sie sehen, wenn Sie ihn in der Liste anklicken, seine Beschreibung: Der (linke) Mausknopf wurde geklickt, während die Maus über dem Button war. Klicken Sie in der Add-Handler-Liste daher auf OK.

Das Fenster verändert sich – Sie sind nun im Code-Editor. Der Navigator (die Spalte links) zeigt Ihnen, wo im Code Sie sich befinden: Im Action-Event von PushButton1 nämlich.

Sagen wir mal, der Klick auf den Button soll das Fenster schließen – keine großartige Programmfunktionalität, aber schon mal ein bisschen was. Fangen Sie an, in den Code-Editor den Begriff Window1 einzugeben, und schauen Sie, was passiert:

Autocomplete WindowSobald Sie die ersten drei Zeichen eingegeben haben, wird der Text dahinter grau ergänzt. Sie müssen also gar nicht viel Text in Xojo eingeben, in der Regel wird Ihnen sehr dabei geholfen – Autocomplete macht‘s möglich.

Tippen Sie einmal auf TAB …

… und der Text wurde zu Window ergänzt. Es stehen aber immer noch drei Punkte (oder auf Schlau: eine Ellipse) dahinter. Autocomplete hat noch mehr Vorschläge! Tippen Sie beherzt erneut TAB, und ein Popup-Menü erscheint. Sie finden darin wahrscheinlich drei Begriffe:

Window, Window1 und WindowPtr.

Vor ihnen jeweils kleine Symbole, die erklären, um was es sich handelt: Window wird mit einem kleinen Warnsymbol angezeigt – wir können eine Klasse nicht sinnvoll auf diese Art ansprechen (wie doch, folgt später). WindowPtr ist ein Pointer, ein Zeiger auf einen Datenbereich. Sowas heben wir uns für fortgeschrittene Schritte auf. Window1 dagegen ist ein Fenster und (nicht wirklich) zufällig auch der Name des Fensters, das wir schließen wollen. Wählen Sie Window1 aus (geht auch mit den Cursortasten) und tippen Sie wiederum auf TAB.

Ok, die Instanz unseres Fensters haben wir damit angesprochen. Wie bringen wir es zum Schließen?

Xojo verwendet wie viele objektorientierte Programmiersprachen die Punktnotation. Das heißt, man hangelt sich von einem Ursprungsobjekt die Hierarchie seiner Möglichkeiten entlang. Diese Möglichkeiten können z. B. Funktionen sein – in Xojo Methoden genannt –, die die Klasse (und damit auch die Instanz) zur Verfügung stellt. Z. B. ein Dateiauswahlfenster anzeigen. Oder Sie können auch Eigenschaften sein – die Farbe eines Texts, die Position eines Fensters auf dem Bildschirm.

In der Punktnotation – der Name lässt‘s vermuten – werden die Elemente durch einen Punkt getrennt. Geben Sie nach Window1 daher einen Punkt ein – und sofort zeigt Ihnen die graue Ellipse an, dass Autocomplete wieder ein paar Vorschläge zu machen hat.

Drücken Sie wieder auf TAB – und lassen Sie sich nicht erschlagen! In dieser Liste sehen Sie Eigenschaften (das sind die runden Elemente), Konstanten (die runden Elemente mit roter Definition dahinter), Methoden (die eckigen Textsymbole) und beinhaltete Steuerelemente (die blauen Objekte – es sollte da der Name Ihres Button auftauchen).

Xojo folgt wie geschrieben ziemlich klarer englischer Sprache, und ein Fenster schließt man auf Englisch mit „Close“. Steht auch dort. Wählen Sie es an oder geben Sie es ein.

Nun klicken Sie mal mutig auf „Run“ – das Programm kompiliert, startet, zeigt das Fenster mit dem Knopf, und wenn Sie nun auf letzteren klicken – ist es weg. Inder Menüzeile steht noch „Test.Debug“ (oder wie immer Sie das Programm beim Anlegen des Projekts genannt haben). Beenden Sie dieses, und Sie finden sich wieder in Xojo zurück.

 

Um dies also noch einmal zu rekapitulieren: Sie haben nun zwei Instanzen zweier verschiedener Klassen erstellt – eine Instanz der Klasse Window und eine der Klasse PushButton. Die Window-Instanz wurde automatisch für Sie angelegt, und die PushButton-Instanz haben Sie durch Ziehen in das Fenster erzeugt.

Nun mag es mal passieren, dass Sie mehrere Fenster in einem Programm benötigen, die aber gar nicht alle gleichzeitig geöffnet sein sollen. Dann schieben Sie einfach den Regler „ImplicitInstance“ im Inspector auf „Off“. Was immer Sie nun mit dem Fenster anstellen: Sie verändern damit nur seine Schablone. Das Fenster wurde automatisch zur Subklasse von Window – deshalb steht im Inspector oben auch „Super“ und nicht „Class“. Eine Subklasse ist eine Klasse, die auf einer anderen basiert. Sie erbt alle Eigenschaften und Methoden von dieser – diese lassen sich allerdings auch überschreiben.

Und wenn Sie nun in Ihrem Programm eine Instanz dieser Window-Subklasse benutzen wollen?

Dann müssen Sie natürlich eine solche anlegen. Dazu kennen Sie eventuell aus anderen Sprachen wie Visual Basic den Begriff DIM. Eventuell so:

DIM i as Integer

DIM kann man sich ganz gut als DIMENSIONIERUNG merken – es wird so viel Speicherplatz reserviert, wie ein entsprechender Typ braucht.

Wenn Sie aber in Ihren Action-Code des Buttons den folgenden Text eingeben (den alten damit überschreiben):

DIM w as Window1

w.show

, dann wird ihr Programm abstürzen, wenn Sie es ausführen und auf den Knopf drücken. Warum? (Falls gar nichts passierte: Setzen Sie ImplicitInstance wieder auf On. Irgendein Fenster soll ja anfänglich da sein.)

DIM reicht in den Fällen, da Sie einen einfachen Speicherbereich reservieren wollen – für eine Ganzzahl (Integer), eine Fließkommazahl (Single oder Double) und dergleichen – die sogenannten intrinsischen Datentypen. Die Instanz einer Klasse benötigt häufig eine Initialisierung, einen Aufbau ihrer optischen Repräsentation beispielsweise, und das ist nicht mit der Reservierung des Speichers getan. Wenn Sie eine neue Klasseninstanz erzeugen wollen, müssen Sie den Code mit dem Wörtchen NEW ergänzen – das sorgt dafür, dass die Instanz auch wirklich initialisiert wird.

Sorgen Sie also dafür, dass der Action-Event-Code so aussieht:

DIM w as NEW Window1

w.show

Und wie Sie sehen, wenn Sie das Programm ausführen: Jetzt wird bei jedem Klick auf den Knopf eine neue Instanz der (Sub)Klasse Window1 erzeugt und angezeigt.

Vergessen Sie das Beispiel aber lieber wieder ganz schnell, denn: Guter Programmierstil ist das nicht! Zum Thema Verständnis von Klassen und Instanzen aber, hoffe ich, hat es ein wenig beitragen können.

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s