Иногда возникает необходимость сделать приложение, состоящее из одной диалоговой формы. Главное окно Блэкбокса при этом необходимо каким-то образом спрятать. С одной стороны для этого предусмотрен специальный ключ /NOAPPWIN, однако его возможно прописать только в ярлыке, что не подходит для распространения приложения в виде простого архива или непосредственно исполняемого файла exe.
В этой заметке рассмотрен способ разработки приложений без главного окна путем модификации модуля HostMenus.
Первым делом необходимо подготовить ваш файл Config, который определяет, что будет происходить сразу после запуска Блэкбокса. Этот модуль вызывается из модуля Init, который загружает StdLoader сразу после загрузки ядра Блэкбокса.
MODULE Config; IMPORT StdCmds; PROCEDURE Setup*; BEGIN StdCmds.OpenToolDialog('Obx/Rsrc/Dialog.odc', 'ObxDialog Demo') END Setup; END Config.
Вместо 'Obx/Rsrc/Dialog.odc' укажите путь к форме своего модуля, а вместо 'ObxDialog Demo' заголовок формы.
My (а в ней My/Mod и My/Code).Config.odс в папке My/Mod.Code/Config.ocf переместите (не скопируйте) в свою папку My/Code/Config.ocf.
Предполагается, что резервная копия базового модуля Config, находится у вас в System/Code/Config.odc, поэтому никаких действий больше на этом шаге делать не надо. Если это не так, то обязательно скомпилируйте базовый модуль System/Mod/Config.odc до того, как закроете Блэкбокс. Иначе при запуске Блэкбокса будет открываться ваша форма, не будут установлены конвертеры и не будет открываться журнал.
Эта операция должна быть сделана за один раз, не закрывая Блэкбокс.
Host/Mod/Menus.odc.ReadCommandLine следующую строку: IF ~open THEN state := noAppWin; HostWindows.noAppWin := TRUE END эта модификация устанавливает значения переменных как при ключе /NOAPPWIN.HostMenus.Host/Code/Menus.ocf в папку My/Code/Menus.ocf.HostMenus.HostMenus.
Для подготовки списка модулей для упаковки в монолитное приложение воспользуемся методом, который описан в документации DevPacker.
"StdCmds.OpenToolDialog('Obx/Rsrc/Dialog.odc', 'ObxDialog Demo')" DevPacker.ListLoadedModulesHost/Code/Menus.ocf на: My/Code/Menus.ocf => Host/Code/Menus.ocfSystem/Code/Config.ocf (или Code/Config.ocf) на:My/Code/Config.ocf => Code/Config.ocfObx/Rsrc/Dialog.odc).System/Rsrc/Menus.odc или замените системное меню на свое:My/Rsrc/Menus.odc => System/Rsrc/Menus.odcDevLinker.Link exefilename.exe := Kernel$+ Files HostFiles HostPackedFiles StdLoader 1 Applogo.icoDevPacker.PackThis).Приложение готово! Не забудьте вместе с ним распространять лицензию Блэкбокса (например в формате txt).
Чтобы приложение отображало кнопки в красивом стиле, скопируйте файл manifest из папки Блэкбокса и измените его название под ваше приложение.
Перед проверкой, переместите полученный файл из папки Блэкбокса куда-нибудь, например, на рабочий стол. Если вы не переместите приложение, то приоритет получит файл Host/Code/Menus.ocf, а не наш упакованный файл, что приведет к тому, что откроется главное окно.
Команды сборки и упаковки удобно сохранить в один файл, чтобы каждый раз не готовить список вновь. Однако стоит помнить, что при добавлении новых модулей в ваше приложение, их не надо забывать добавлять в этот список.
Авторы заметки: Иван Денисов, Сергей Волков.