3.8 Dynamische Objekte

Die meisten Programme erstellen ihre GUI durch einen einfachen Aufruf von moai.CreateApp(), dem eine XML-Definition übergeben wird, welche die komplette Benutzeroberfläche des gesamten Programms enthält. In manchen Situationen kann es jedoch notwendig sein, MOAI-Objekte nach dem Aufruf von moai.CreateApp() zu erzeugen und in die bestehende Anwendung einzufügen.

Dies ist möglich, indem Sie den Befehl moai.CreateObject() verwenden. Dieser Befehl ermöglicht es Ihnen, ein MOAI-Objekt aus einer XML-Definition zu erstellen, ähnlich wie moai.CreateApp(), außer dass moai.CreateObject() Ihnen nicht erlaubt ein GUI-Application-Objekt (Anwendung) zu erstellen, da es nur ein GUI-Application-Objekt geben kann.

Zum Beispiel können Sie eine Schaltfläche erstellen, indem Sie moai.CreateObject() wie folgt verwenden:

 
moai.CreateObject([[<button id="mybutton">Click me</button>]])

Es ist sehr wichtig, eine ID für das MOAI-Objekt zu setzen, welches Sie mit moai.CreateObject() erstellen, da der Identifikator später für das Objekt benötigt wird. Nachdem wir die Schaltfläche erstellt haben, können wir sie in ein bestehendes Fensterlayout einfügen. Nehmen wir an, unser Fensterlayout sieht momentan so aus:

 
<window>
   <hgroup id="mygroup">
      <button id="ok">OK</button>
      <button id="cancel">Cancel</button>
   </hgroup>
</window>

Wir könnten nun die Methode Group.Insert verwenden, um die neu erstellte Schaltfläche nach der Schaltfläche "OK" einzufügen. Dazu müssten wir den folgenden Code verwenden:

 
moai.DoMethod("mygroup", "initchange")
moai.DoMethod("mygroup", "insert", "mybutton", "ok")
moai.DoMethod("mygroup", "exitchange")

Sie sehen, dass wir auch die Methoden Group.InitChange und Group.ExitChange aufrufen. Das ist sehr wichtig. Diese Methoden müssen immer dann ausgeführt werden, wenn Sie die Elemente einer Gruppe ändern, d.h. wenn Sie Elemente entfernen oder hinzufügen. RapaGUI benötigt den Aufruf dieser Methoden, da nach dem Entfernen oder Hinzufügen von Gruppenelementen ein Neuzeichnen des Fensterlayout notwendig wird. Deshalb reicht es nicht aus, einfach Group.Insert oder eine andere Methode aufzurufen, die die Anzahl der Gruppenelemente ändert.

Natürlich können wir auch Elemente aus Gruppen entfernen. Dies ist mit Group.Remove möglich. Der folgende Code entfernt die Schaltfläche "Abbrechen" aus dem obigen Fensterlayout:

 
moai.DoMethod("mygroup", "initchange")
moai.DoMethod("mygroup", "remove", "cancel")
moai.DoMethod("mygroup", "exitchange")

Nach diesem Aufruf ist das MOAI-Objekt mit der ID "cancel" ein losgelöstes Objekt geworden. Das bedeutet, dass Sie es jetzt auch wieder an eine Gruppe anhängen können, indem Sie Group.Insert oder eine ähnliche Methode verwenden. Beachten Sie, dass alle Methoden, die MOAI-Objekte in bestehende Layouts einfügen, nur losgelöste Objekte akzeptieren. Es ist nicht möglich, dasselbe MOAI-Objekt in mehrere Gruppen einzufügen. Sobald Sie ein MOAI-Objekt in eine Gruppe (oder einen Menübaum) einfügen, ändert es seinen Zustand von losgelöst in angehängt. Sobald ein MOAI-Objekt im angehängten Zustand ist, kann es nicht mehr an Methoden übergeben werden, die ein losgelöstes Objekt erwarten. Um ein MOAI-Objekt vom angefügten in den gelösten Zustand zu versetzen, müssen Sie eine Methode wie Group.Remove verwenden, um ein MOAI-Objekt von einer Gruppe zu trennen.

Als letzte Anmerkung: Der XML-Code, den Sie an moai.CreateObject() übergeben, kann auch ein vollständiger Baum sein, z.B. könnten Sie ein vollständiges Fenster mit nur einem Aufruf mit dem Befehl moai.CreateObject() erstellen. Das ist alles möglich. moai.CreateObject() ist nicht auf das Erzeugen einzelner MOAI-Objekte beschränkt, sondern kann auch mehrere Objekte für Sie erstellen. Wenn Sie jedoch ein Fenster oder ein Dialog mit moai.CreateObject() erstellen, vergessen Sie nicht, es zum Applications-Objekt hinzuzufügen, indem Sie Application.AddWindow aufrufen. Fensterobjekte sind standardmäßig im gelösten Zustand, sofern sie keinem Application-Objekt hinzugefügt wurden. Für Dialoge können Sie einfach moai.CreateDialog() verwenden, welches Application.AddWindow einschließlich aufruft.


Navigation zeigen