Модальные диалоги отключают окно AutoCAD, пока сами не будут закрыты. Модальными диалогами легче управлять, потому что состояние AutoCAD остается неизменным в течение всей работы диалога. Модальные диалоги возвращают код свего статуса когда они закрываются, и, как правило основной код приложения выполняет дополнительные действия в зависимости от этого статуса.
Немодальные диалоги представляют дополнительные проблемы. Немодальные диалоги могут работать одновременно с выполнением приложения AutoCAD и должны учитывать изменения в состоянии AutoCAD, такие как открытие или закрытиедокумента . Кроме того, поскольку каждый документ AutoCAD имеет свое собственное пространство имен AutoLISP, активация нового документа означает, что обработчики событий, определенные в отключенном документе больше не будут доступны в новом активизированном документе.
Эти означает, что единственный способ управлять немодальным диалогом - обеспечить определение обработчиков событий в каждом новом файле чертежа. На практике это обычно означает, что файл приложения Lisp (или файлы) должны быть загружены с помощью файла acaddoc.lsp или аналогичным методом, который автоматически загружает прописанные в нем файлы каждый раз при открытии нового документа.
Кроме того, так как диалог может быть уже активным во время запуска нового документа (или, например, при открытии второго файла чертежа), то он должен действовать соответственно. Например, если приложение должно прочитать некоторые параметры инициализации из реестра, это, вероятно, нужно сделать, только при активации немодального диалога. Если такая инициализация выполняется в событии OnInitialize, она выполнится только один раз, при активации диалога. Если приложение должно определить во время выполнения открыт ли уже диалог или нет, то можно использовать выражение следующего типа:
(and MyProject-MyForm (dcl-Form-IsActive MyProject-MyForm))
В дополнение программированию соответствующим образом, когда открыт более чем один чертеж, немодальные диалоги должны также вести себя правильно, когда все открытые чертежи закрыты (состояние называется «no doc state»), или когда пользователь переключается между несколькими активными чертежами. Если немодальный диалог содержит элементы управления, параметры или свойствакоторых зависят от состояния чертежа, то в нем должны быть определены обработчики событий для OnDocActivated и OnEnteringNoDocState для обновления элементов управления при изменении состояния документов.
Обработчики событий немодальных диалогов, как правило, вызываются в контексте приложения AutoCAD, а не в контексте документа. Код AutoLISP, выполняемый в пространстве приложения не может вызызвать фунцкии пространства документа, такие как (command). Чтобы справиться с этим, можно использовать свойство 'Event Invoke' элемента управления для вызова обработчика события асинхронно в контексте документа, что позволяет вызывать (command). Однако, обработчик события может выполняться и синхронно, но вместо вызова документо-зависимых функций, можно записать новую команду для выполнения прямо в контексте документа с помощью функции (dcl-SendString).