Содержание

Приложение без главного окна Блэкбокса

Иногда возникает необходимость сделать приложение, состоящее из одной диалоговой формы. Главное окно Блэкбокса при этом необходимо каким-то образом спрятать. С одной стороны для этого предусмотрен специальный ключ /NOAPPWIN, однако его возможно прописать только в ярлыке, что не подходит для распространения приложения в виде простого архива или непосредственно исполняемого файла exe.

В этой заметке рассмотрен способ разработки приложений без главного окна путем модификации модуля HostMenus.

1. Подготовка Config

Первым делом необходимо подготовить ваш файл Config, который определяет, что будет происходить сразу после запуска Блэкбокса. Этот модуль вызывается из модуля Init, который загружает StdLoader сразу после загрузки ядра Блэкбокса.

  1. Создайте новый документ, и добавьте в него код:
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' заголовок формы.

  1. В корневом каталоге Блэкбокса создайте папку My (а в ней My/Mod и My/Code).
  2. Сохраните файл Config.odс в папке My/Mod.
  3. Скомпилируйте модуль.
  4. Полученный файл Code/Config.ocf переместите (не скопируйте) в свою папку My/Code/Config.ocf.

Предполагается, что резервная копия базового модуля Config, находится у вас в System/Code/Config.odc, поэтому никаких действий больше на этом шаге делать не надо. Если это не так, то обязательно скомпилируйте базовый модуль System/Mod/Config.odc до того, как закроете Блэкбокс. Иначе при запуске Блэкбокса будет открываться ваша форма, не будут установлены конвертеры и не будет открываться журнал.

2. Подготовка HostMenus

Эта операция должна быть сделана за один раз, не закрывая Блэкбокс.

  1. Откройте файл Host/Mod/Menus.odc.
  2. Добавьте в конец процедуры ReadCommandLine следующую строку: IF ~open THEN state := noAppWin; HostWindows.noAppWin := TRUE END эта модификация устанавливает значения переменных как при ключе /NOAPPWIN.
  3. Скомпилируйте модуль HostMenus.
  4. Переместите файл Host/Code/Menus.ocf в папку My/Code/Menus.ocf.
  5. Удалите или закомментируйте новую строку в модуле HostMenus.
  6. Вновь скомпилируйте модуль HostMenus.

3. Сборка вашего приложения

Для подготовки списка модулей для упаковки в монолитное приложение воспользуемся методом, который описан в документации DevPacker.

  1. Перезапустите Блэкбокс.
  2. Запустите модуль вашего приложения (откройте диалоговую форму); в нашем случае это команда:
    "StdCmds.OpenToolDialog('Obx/Rsrc/Dialog.odc', 'ObxDialog Demo')"
    обратите внимание, что команда в двойных кавычках.
  3. Проверьте все функции вашего приложения, чтобы загрузились все возможные модули, необходимые для его работы.
  4. Теперь вызовите команду: DevPacker.ListLoadedModules
  5. В открывшемся окне замените Host/Code/Menus.ocf на:
    My/Code/Menus.ocf => Host/Code/Menus.ocf
    целиком так и вставлять строку с этим символом замены.
  6. Также замените System/Code/Config.ocf (или Code/Config.ocf) на:
    My/Code/Config.ocf => Code/Config.ocf
  7. Добавьте в этот список ваши ресурсные файлы (в нашем примере это Obx/Rsrc/Dialog.odc).
  8. Добавьте в список также файл меню System/Rsrc/Menus.odc или замените системное меню на свое:
    My/Rsrc/Menus.odc => System/Rsrc/Menus.odc
    хотя мы предполагаем, что пользователь не увидит меню, тем не менее это может произойти при аварийной остановке приложения, когда появится окно TRAP.
  9. Соберите основу приложения командой:
    DevLinker.Link exefilename.exe := Kernel$+ Files HostFiles HostPackedFiles StdLoader 1 Applogo.ico
  10. Теперь запустите упаковку командой, которая создана на шагах 4–8 (нажмите на коммандер перед командой DevPacker.PackThis).

Приложение готово! Не забудьте вместе с ним распространять лицензию Блэкбокса (например в формате txt).

Чтобы приложение отображало кнопки в красивом стиле, скопируйте файл manifest из папки Блэкбокса и измените его название под ваше приложение.

Перед проверкой, переместите полученный файл из папки Блэкбокса куда-нибудь, например, на рабочий стол. Если вы не переместите приложение, то приоритет получит файл Host/Code/Menus.ocf, а не наш упакованный файл, что приведет к тому, что откроется главное окно.

Команды сборки и упаковки удобно сохранить в один файл, чтобы каждый раз не готовить список вновь. Однако стоит помнить, что при добавлении новых модулей в ваше приложение, их не надо забывать добавлять в этот список.


Авторы заметки: Иван Денисов, Сергей Волков.