Иногда возникает необходимость сделать приложение, состоящее из одной диалоговой формы. Главное окно Блэкбокса при этом необходимо каким-то образом спрятать. С одной стороны для этого предусмотрен специальный ключ /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.ListLoadedModules
Host/Code/Menus.ocf
на: My/Code/Menus.ocf => Host/Code/Menus.ocf
System/Code/Config.ocf
(или Code/Config.ocf
) на:My/Code/Config.ocf => Code/Config.ocf
Obx/Rsrc/Dialog.odc
).System/Rsrc/Menus.odc
или замените системное меню на свое:My/Rsrc/Menus.odc => System/Rsrc/Menus.odc
DevLinker.Link exefilename.exe := Kernel$+ Files HostFiles HostPackedFiles StdLoader 1 Applogo.ico
DevPacker.PackThis
).Приложение готово! Не забудьте вместе с ним распространять лицензию Блэкбокса (например в формате txt).
Чтобы приложение отображало кнопки в красивом стиле, скопируйте файл manifest из папки Блэкбокса и измените его название под ваше приложение.
Перед проверкой, переместите полученный файл из папки Блэкбокса куда-нибудь, например, на рабочий стол. Если вы не переместите приложение, то приоритет получит файл Host/Code/Menus.ocf
, а не наш упакованный файл, что приведет к тому, что откроется главное окно.
Команды сборки и упаковки удобно сохранить в один файл, чтобы каждый раз не готовить список вновь. Однако стоит помнить, что при добавлении новых модулей в ваше приложение, их не надо забывать добавлять в этот список.
Авторы заметки: Иван Денисов, Сергей Волков.