Предыдущая версия справа и слева
Предыдущая версия
Следующая версия
|
Предыдущая версия
|
blackbox:noappwin [2017/04/06 22:14] иван_денисов |
blackbox:noappwin [2020/10/30 13:26] (текущий) iadenisov |
====== Как создать приложение без главного окна Блэкбокса? ====== | ====== Приложение без главного окна Блэкбокса ====== |
| |
Иногда возникает необходимость сделать приложение состоящее из одной диалоговой формы. Главное окно Блэкбокса при этом надо как-то спрятать. С одной стороны для этого предусмотрен специальный ключ ''/NOAPPWIN'', но его возможно прописать только в ярлыке, что не подходит для распространения приложения в виде простого архива или непосредственно исполняемого файла ''exe''. | Иногда возникает необходимость сделать приложение, состоящее из одной диалоговой формы. Главное окно [[:blackbox|Блэкбокса]] при этом необходимо каким-то образом спрятать. С одной стороны для этого предусмотрен специальный ключ ''/NOAPPWIN'', однако его возможно прописать только в ярлыке, что не подходит для распространения приложения в виде простого архива или непосредственно исполняемого файла ''exe''. |
| |
В этой заметке рассмотрен способ комфортной разработки таких приложений путем модификации модуля ''HostMenus''. | В этой заметке рассмотрен способ разработки приложений без главного окна путем модификации модуля ''HostMenus''. |
| |
===== 1. Подготовка Config ===== | ===== 1. Подготовка Config ===== |
Первым делом необходимо подготовить ваш файл ''Config'', который определяет, что будет происходить сразу после запуска Блэкбокса. Этот модуль вызывается из модуля ''Init'', который загружает ''StdLoader'' сразу после загрузки ядра Блэкбокса. | Первым делом необходимо подготовить ваш файл ''Config'', который определяет, что будет происходить сразу после запуска Блэкбокса. Этот модуль вызывается из модуля ''Init'', который загружает ''StdLoader'' сразу после загрузки ядра Блэкбокса. |
| |
- В корневом каталоге Блэкбокса создайте папку ''My'' (а в ней ''My/Mode'', ''My/Code'', ''My/Rsrc''). | |
- Создайте новый документ, и добавьте в него код: | - Создайте новый документ, и добавьте в него код: |
| |
<code>MODULE Config; | <code=oberon2> |
| MODULE Config; |
IMPORT StdCmds; | IMPORT StdCmds; |
| |
END Setup; | END Setup; |
| |
END Config.</code> | END Config. |
| </code> |
| |
Вместо 'Obx/Rsrc/Dialog.odc' укажите путь к форме своего модуля, а вместо 'ObxDialog Demo' заголовок формы. | Вместо 'Obx/Rsrc/Dialog.odc' укажите путь к форме своего модуля, а вместо 'ObxDialog Demo' заголовок формы. |
| - В корневом каталоге Блэкбокса создайте папку ''My'' (а в ней ''My/Mod'' и ''My/Code''). |
- Сохраните файл ''Config.odс'' в папке ''My/Mod''. | - Сохраните файл ''Config.odс'' в папке ''My/Mod''. |
- Скомпилируйте модуль. | - Скомпилируйте модуль. |
| |
- Откройте файл ''Host/Mod/Menus.odc''. | - Откройте файл ''Host/Mod/Menus.odc''. |
- Добавьте в конец процедуры ''ReadCommandLine'' следующую строку: <code componentpascal>IF ~open THEN state := noAppWin; HostWindows.noAppWin := TRUE END</code> эта модификация устанавливает значения переменных как при ключе ''/NOAPPWIN''. | - Добавьте в конец процедуры ''ReadCommandLine'' следующую строку: ''IF ~open THEN state := noAppWin; HostWindows.noAppWin := TRUE END'' эта модификация устанавливает значения переменных как при ключе ''/NOAPPWIN''. |
- Скомпилируйте модуль ''HostMenus''. | - Скомпилируйте модуль ''HostMenus''. |
- Переместите файл ''Host/Code/Menus.ocf'' в папку ''My/Code/Menus.ocf''. | - Переместите файл ''Host/Code/Menus.ocf'' в папку ''My/Code/Menus.ocf''. |
===== 3. Сборка вашего приложения ===== | ===== 3. Сборка вашего приложения ===== |
| |
Чтобы подготовить список модулей для упаковки в монолитное приложение воспользуемся методом, который описан в документации ''DevPacker''. | Для подготовки списка модулей для упаковки в монолитное приложение воспользуемся методом, который описан в документации ''DevPacker''. |
| |
- Перезапустите Блэкбокс. | - Перезапустите Блэкбокс. |
- Запустите модуль вашего приложения (откройте диалоговую форму); в нашем случае это команда: <code componentpascal>"StdCmds.OpenToolDialog('Obx/Rsrc/Dialog.odc', 'ObxDialog Demo')"</code> обратите внимание, что команда в двойных кавычках. | - Запустите модуль вашего приложения (откройте диалоговую форму); в нашем случае это команда:\\ ''%%"StdCmds.OpenToolDialog('Obx/Rsrc/Dialog.odc', 'ObxDialog Demo')"%%'' \\ обратите внимание, что команда в двойных кавычках. |
- Проверьте все функции вашего приложения, чтобы загрузились все возможные модули, необходимые для его работы. | - Проверьте все функции вашего приложения, чтобы загрузились все возможные модули, необходимые для его работы. |
- Теперь вызовите команду: <code componentpascal>DevPacker.ListLoadedModules</code> | - Теперь вызовите команду: ''DevPacker.ListLoadedModules'' |
- В открывшемся окне замените ''Host/Code/Menus.ocf'' на: <code componentpascal>My/Code/Menus.ocf => Host/Code/Menus.ocf</code>целиком так и вставлять строку с этим символом замены. | - В открывшемся окне замените ''Host/Code/Menus.ocf'' на: \\ ''%%My/Code/Menus.ocf => Host/Code/Menus.ocf%%''\\ целиком так и вставлять строку с этим символом замены. |
- Также замените ''System/Code/Config.ocf'' (или ''Code/Config.ocf'') на: <code componentpascal>My/Code/Config.ocf => Code/Config.ocf</code> | - Также замените ''System/Code/Config.ocf'' (или ''Code/Config.ocf'') на:\\ ''%%My/Code/Config.ocf => Code/Config.ocf%%'' |
- Добавьте в этот список ваши ресурсные файлы (в нашем примере это ''Obx/Rsrc/Dialog.odc''). | - Добавьте в этот список ваши ресурсные файлы (в нашем примере это ''Obx/Rsrc/Dialog.odc''). |
- Добавьте в список также файл меню ''System/Rsrc/Menus.odc'' или замените системное меню на свое:<code componentpascal>My/Rsrc/Menus.odc => System/Rsrc/Menus.odc</code> хотя мы предполагаем, что пользователь не увидит меню, тем не менее это может произойти при аварийной остановке приложения, когда появится окно TRAP. | - Добавьте в список также файл меню ''System/Rsrc/Menus.odc'' или замените системное меню на свое:\\ ''%%My/Rsrc/Menus.odc => System/Rsrc/Menus.odc%%''\\ хотя мы предполагаем, что пользователь не увидит меню, тем не менее это может произойти при аварийной остановке приложения, когда появится окно TRAP. |
- Соберите основу приложения командой: <code componentpascal>DevLinker.Link exefilename.exe := Kernel$+ Files HostFiles HostPackedFiles StdLoader 1 Applogo.ico</code> | - Соберите основу приложения командой:\\ ''%%DevLinker.Link exefilename.exe := Kernel$+ Files HostFiles HostPackedFiles StdLoader 1 Applogo.ico%%'' |
- Теперь запустите упаковку командой, которая создана на шагах 4–8 (нажмите на коммандер перед командой ''DevPacker.PackThis''). | - Теперь запустите упаковку командой, которая создана на шагах 4–8 (нажмите на коммандер перед командой ''DevPacker.PackThis''). |
| |
| |
Чтобы приложение отображало кнопки в красивом стиле, скопируйте файл manifest из папки Блэкбокса и измените его название под ваше приложение. | Чтобы приложение отображало кнопки в красивом стиле, скопируйте файл manifest из папки Блэкбокса и измените его название под ваше приложение. |
| |
| {{ :blackbox:noappwin.png?nolink |}} |
| |
Перед проверкой, переместите полученный файл из папки Блэкбокса куда-нибудь, например, на рабочий стол. Если вы не переместите приложение, то приоритет получит файл ''Host/Code/Menus.ocf'', а не наш упакованный файл, что приведет к тому, что откроется главное окно. | Перед проверкой, переместите полученный файл из папки Блэкбокса куда-нибудь, например, на рабочий стол. Если вы не переместите приложение, то приоритет получит файл ''Host/Code/Menus.ocf'', а не наш упакованный файл, что приведет к тому, что откроется главное окно. |
| |
{{:wiki:blackbox:noappwin.png|}} | |
| |
Команды сборки и упаковки удобно сохранить в один файл, чтобы каждый раз не готовить список вновь. Однако стоит помнить, что при добавлении новых модулей в ваше приложение, их не надо забывать добавлять в этот список. | Команды сборки и упаковки удобно сохранить в один файл, чтобы каждый раз не готовить список вновь. Однако стоит помнить, что при добавлении новых модулей в ваше приложение, их не надо забывать добавлять в этот список. |
| |
| |
| |