Modal vs. Nichtmodal

Modale Dialoge sperren das AutoCAD-Fenster solange, bis sie wieder geschlossen werden. Naturgemäß können modale Dialoge einfacher verwaltet werden, weil AutoCAD in der Zwischenzeit unverändert bleibt. Modale Dialoge geben einen Statuswert zurück, wenn sie geschlossen werden. Die Hauptfunktion der Applikation führt dann auf den Rückgabewert basierend weiterführenden Code aus.

Nichtmodale Dialoge stellen eine größere Herausforderung dar. Da nichtmodale Dialoge während der gesamten AutoCAD-Sitzung aktiv sein können, müssen sie mit dem wechselnden AutoCAD-Status umgehen können. Dazu gehören wechselnde aktive Dokumente genauso wie offene oder geschlossene Zeichnungen. Da darüberhinaus jede AutoCAD-Zeichnung seinen eigenen AutoLISP Namensraum verwendet, bedeutet das Aktivieren eines neuen Dokuments, dass in dem nun deaktivierten Dokument die Ereignisse nicht mehr ausgelöst und auf sie zugegriffen werden können.

Das hat zur Folge, dass nichtmodale Dialoge nur verwaltet werden können, wenn sichergestellt ist, dass die Ereignisse in jeder neuen Zeichnung definiert sind. In der Praxis muss die LSP-, FAS- oder VLX-Datei der Applikation mit der acaddoc.lsp oder einer ähnlichen Methode als Teil der Zeichnungsinitialisierung geladen werden.

Zudem muss beim Öffnen einer weiteren Zeichnung auf einen bereits geöffneten nichtmodalen Dialog reagiert werden. Liest beispielsweise die Applikation einige initialisierende Einstellungen aus der Windows-Registrierung, sollte dies nur geschehen, wenn der Dialog tatsächlich erstmals aufgerufen wird. Eine derartige Initialisierung kann zum Beispiel in dem OnInitialize-Ereignis Anwendung finden, dann wird es nur einmal ausgeführt, wenn der Dialog eingeblendet wird. Mit dem folgenden beispielhaften Ausdruck prüfen Sie, ob der Dialog zur Laufzeit bereits aktiv ist:

(and (MyProject-MyForm (dcl-Form-IsActive MyProject-MyForm))

Zusätzlich zum Programmstart muss der Programmablauf auch mit mehreren Zeichnungen umgehen können und auf den Zustand reagieren, wenn alle Zeichnungen geschlossen werden (sogenannter "NoDocState") oder wenn der Anwender zwischen mehreren offenen Zeichnungen hin- und herschaltet. Enthält der nichtmodale Dialog zeichnungsabhängige Einstellungen und Eigenschaften, sollten diese in den Ereignisfunktionen der aktivierten Ereignisse OnDocActivated und OnEnteringNoDocState aktualisiert und auf die neue Zeichnung hin angepasst werden.

Die Ereignisse nichtmodaler Dialoge werden normalerweise im Kontext der AutoCAD-Anwendung aufgerufen statt im Kontext der Zeichnungsdatei. AutoLISP-Code, der im Kontext der AutoCAD-Anwendung aufgerufen wird, kann nicht jede dokumentenabhängige Funktion (wie die AutoLISP-Funktion (command)) aufrufen. Um dieses Problem zu umgehen, kann die Eigenschaft Event Invoke des Steuerelements verwendet werden, damit die Ereignisfunktion asynchron im Kontext der Zeichnungsdatei aufgerufen wird, was es dann letztlich erlaubt, AutoLISP-Funktionen, wie (command) erfolgreich auszuführen. Alternativ kann die Ereignisfunktion synchron aufgerufen werden, statt jedoch die dokumentenabhängigen Funktionen innerhalb der Ereignisfunktion zu verwenden, kann diese einfach einen Befehl mit Hilfe der OpenDCL-Funktion (dcl-SendString) im Kontext der Zeichnungsdatei aufrufen.