Есть более изящный способ отлова и отмены закрытия окна. Я создал свой класс Window унаследовав его от HostWindows.Window, и переопределил метод Close своим, в котором я вызываю функцию-коллбэк типа BOOLEAN и на основе её значения решаю, выполнять супервызов метода HostWindows.Window.Close или нет...
Потом я переписал некоторые общие процедулы из модулей StdCmds, StdApi и StdDialog и сделал экспортированные методы, идентичные методам StdCmds, но уже с заданием процедуры-коллбэка.
Процедура коллбэка описывается как:
Код:
PROCEDURE ProcName*(): BOOLEAN;
вы описываете её в своём модуле
и передаёте как параметр при открытии окна вызовом
Код:
SternCmds.OpenAuxDialog("Stern/Rsrc/Form","Test",[b]ProcName[/b]);
При попытке закрыть окно выполняется процедура ProcName и возвращает TRUE -- если нужно закрыть форму, и FALSE -- если нельзя...
Также присутствуют процедуры OpenAuxDub и OpenToolDub -- позволяют открыть экземпляр формы если форма с таким названием уже существует.