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