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ü).