16.1 Übersicht

Die Dialog-Klasse leitet sich von Window-Klasse ab (Fenster) und erzeugt modale (oder nicht-modale) Dialoge. Modale Dialoge sind spezielle Top-Level-Fenster, die den Rest des Programmes blockieren, bis sie geschlossen werden. Dialoge erden typischerweise verwendet, wenn Benutzeraktionen erforderlich sind, um mit dem Programm fortzufahren oder um anzuzeigen, dass das Programm gerade beschäftigt ist. Ein Dialog könnte dann z.B. einen Fortschrittsbalken anzeigen.

Wie bei Fenstern muss das Wurzelelement eines Dialogs immer ein einzelnes Gruppenobjekt sein, d.h. eine Instanz der Group-Klasse (Gruppen). Siehe Group-Klasse für Details. Darüber hinaus ist es nicht erlaubt, mehrere Elemente auf der Stammebene des Dialogs zu haben. Sie müssen nur ein einzelnes Gruppenobjekt als Wurzel-Element verwenden. Hier ein Beispiel für einen einfachen Fortschrittsdialog in XML:

 
<dialog id="mydlg" title="Working...">
   <vgroup>
      <progressbar id="prg"/>
      <button id="cancel">Cancel</button>
   </vgroup>
</dialog>

Sie sollten Dialoge nur dann erstellen, wenn Sie sie brauchen, und sie aus dem Speicher löschen, sobald Sie damit fertig sind. Es wird nicht empfohlen, alle Ihre Dialoge beim Start mit moai.CreateApp() zu erstellen und sie ständig im Speicher zu behalten. Stattdessen sollten Sie moai.CreateDialog() verwenden, um einen Dialog zu erstellen, wenn Sie ihn benötigen und ihn dann anschliessend aus dem Speicher löschen. Der Grund dafür ist, dass Fenster auf einigen von RapaGUI unterstützten Betriebssystemen eine begrenzte Ressource sind. Zum Beispiel gibt es unter Windows ein Limit von ungefähr 10.000 Fenstern pro Prozess. Das klingt vielleicht ausreichend genug, aber bedenken Sie, dass unter Windows jedes Widget ein "Fenster" für das Betriebssystem ist, z.B. alle Beschriftungen, Schaltflächen, Rahmen, Auswahlkästchen, Gruppe, etc. in Ihrem Programm ist ein Fenster. So sollten Sie darauf achten, dass Sie Ihre Dialoge nur bei Bedarf mit moai.CreateDialog() erstellen und anschließend direkt wieder löschen.

In der Praxis empfiehlt es sich, für jeden Ihrer Dialoge eine eigene XML-Datei zu erstellen und dann moai.CreateDialog() zu verwenden, um die XML-Datei zur Laufzeit in einen Dialog zu konvertieren und anschliessend den Dialog automatisch von RapaGUI löschen zu lassen, sobald der Benutzer ihn schließt.

Als Unterklasse der Window-Klasse können die meisten Attribute und Methoden der Window-Klasse auch mit der Dialog-Klasse verwendet werden. Siehe Window-Klasse für Details. Beachten Sie jedoch, dass modale Dialoge nicht durch Setzen von Window.Open geöffnet werden dürfen, sondern durch die Ausführung der Methode Dialog.ShowModal. Um einen modalen Dialog zu schließen, rufen Sie einfach die Methode Dialog.EndModal auf. Dies löscht auch automatisch den Dialog aus dem Speicher, d.h. es wird implizit moai.FreeDialog() auf den Dialog aufgerufen, es sei denn, Sie fordern ausdrücklich, dass der Dialog durch Setzen eines optionalen Arguments auf True nicht gelöscht werden soll.

In ähnlicher Weise wird der Dialog auch automatisch gelöscht, wenn der Benutzer auf das Schließsymbol eines Dialogs klickt. Wenn Sie dies nicht möchten oder wenn Sie das Verhalten des Programmes für das Schließsymbol anpassen müssen, brauchen Sie eine Überwachung mit dem Attribut Window.CloseRequest. Wenn für dieses Attribut keine Überwachung vorhanden ist, ruft RapaGUI einfach Dialog.EndModal mit dem Parameter 0 auf, sobald auf das Schließsymbol des Dialogs geklickt wird.

Wenn Sie einen nicht-modalen Dialog öffnen möchten, d.h. einen Dialog, der Ihr Skript nicht blockiert, während es geöffnet ist, dürfen Sie nicht Dialog.ShowModal verwenden, sondern stattdessen Window.Open für den Dialog auf True setzen (und eventuell auch Application.Sleep auf True setzen, wenn Sie das Programm in eine Art Ruhezustand versetzen möchten, während der Dialog geöffnet ist). Das eigentliche Verhalten des Dialogs implementieren Sie (z.B. ein ständig aktualisierter Fortschrittsbalken), indem Sie wiederholt einen Verwaltungsbefehl aufrufen, entweder mit SetTimeout() oder des neuen Befehls RunCallback() von Hollywood 9.0. Wenn Sie mit einem nicht-modalen Dialog fertig sind, setzen Sie Window.Open darauf auf False. Verwenden Sie nicht Dialog.EndModal mit nicht-modalen Dialogen! Ein Beispiel für einen nicht-modalen Dialog finden Sie im Beispiel "Dialoge", das mit RapaGUI geliefert wird (wählen Sie "Test progress bar dialog" im Menü).


Navigation zeigen