| Предыдущая версия справа и слева
Предыдущая версия
Следующая версия
 | 
                    Предыдущая версия
 | 
                
                        
                
                    blackbox:noappwin [2017/04/06 22:06] иван_денисов                  | 
                
                    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''. | 
|   - Скомпилируйте модуль. |   - Скомпилируйте модуль. | 
|   - Полученный файл ''Code/Config.ocf'' переместите (не скопируйте) в свою папку ''My/Code/Config.ocf''. |   - Полученный файл ''Code/Config.ocf'' переместите (не скопируйте) в свою папку ''My/Code/Config.ocf''. | 
 |   | 
 |  | 
| //Предполагается, что резервная копия базового модуля ''Config'', находится у вас в ''System/Code/Config.odc'', поэтому никаких действий больше на этом шаге делать не надо. Если это не так, то обязательно скомпилируйте базовый модуль ''System/Mod/Config.odc'' до того, как закроете Блэкбокс. Иначе при запуске Блэкбокса будет открываться ваша форма, не будут установлены конвертеры и не будет открываться журнал.// | //Предполагается, что резервная копия базового модуля ''Config'', находится у вас в ''System/Code/Config.odc'', поэтому никаких действий больше на этом шаге делать не надо. Если это не так, то обязательно скомпилируйте базовый модуль ''System/Mod/Config.odc'' до того, как закроете Блэкбокс. Иначе при запуске Блэкбокса будет открываться ваша форма, не будут установлены конвертеры и не будет открываться журнал.// | 
 |  | 
|   - Откройте файл ''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|}} |   | 
 |  | 
| Команды сборки и упаковки удобно сохранить в один файл, чтобы каждый раз не готовить список вновь. Однако стоит помнить, что при добавлении новых модулей в ваше приложение, их не надо забывать добавлять в этот список. | Команды сборки и упаковки удобно сохранить в один файл, чтобы каждый раз не готовить список вновь. Однако стоит помнить, что при добавлении новых модулей в ваше приложение, их не надо забывать добавлять в этот список. | 
 |   | 
 |  | 
 |  |