Цитата:
На мой взгляд легче написать на BB калькулятор используя только Win32 API, а потом слинковать exe. Меньше трах-тибидохов будет.
А писать бизнес-приложение, работающее с отчетами, или приложение с научной графикой Вы тоже будете через WinApi? И те в разы большие "трах-тибидохи" вас не испугают? У ББ в том виде, в каком он есть сейчас, есть четкая сфера применения, под которую он подходит отлично: прикладные/деловые/научные приложения, которые ориентированы на работу с
содержанием. Да, рюшечек каких-то на окошечках может не хватать, зато работу с документами, правку/показ разнородных объектов, внедренных друг в друга вы сделаете легче, чем где бы то ни было. Та же история с MFC в Visual Studio, кстати - там не так легко и очевидно реализовать все мелкие прихоти, как в той же Дельфе, не говоря о всяком Васике, зато намного легче выстраивать сложные профессиональные приложения, редакторы любого рода... А рюшечки всегда можно и докрутить. Будет вам и SDI, скоро будет.
Да что говорить, в той же Дельфе нормального компонента для полноценной работы с текстовыми документами и то нет - RichEdit не предлагать
Поэтому единственным решением всегда было выходить на Word через COM.
Ну а теперь по самому вопросу. Итак, мы хотим делать свое приложение. Давайте по шагам.
1) Удобно под отдельный проект выделить специальную папочку, отдельно от BlackBox. Пусть Calc, например. Делаем ярлычок к BlackBox.exe, в котором пишем параметр командной строки:
<ваш_путь>\BlackBox.exe /USE C:\MyProjects\Calc
И рабочую папку тоже: C:\MyProjects\Calc.
Теперь запускаем среду с этого ярлыка - и смело можем менять что угодно - любые конфигурационные файлы, даже родные модули среды - все изменения не затронут исходных версий, все будет сохраняться в Calc и перекрывать основную папку.
2) Давайте для начала заставим при старте программы запускаться наш калькулятор и уберем окно лога. Открываем модуль Config,
Код:
комментируем строку
(* Dialog.Call("StdLog.Open", "", res); *)
и добавляем команду
Dialog.Call("ObxCalc.Deposit;StdCmds.Open", "", res);
Deposit помещает в очередь отображений новый калькулятор, а StdCmds.Open открывает последнее отображение из очереди в Aux-диалоге. Перекомпилируем Config. Среду не закрываем, но запустим с ярлыка Calc еще одну копию. Как видим, калькулятор открывается и лог исчез.
Если бы мы писали деловое приложение, то мы бы подредактировали меню, настроили поведение при запуске, и нам бы этого хватило с головой. Однако идем далее...
3) Нам надо убрать главное окно.
Без главного окна можно работать только с Tool-диалогами, т.к. Aux-диалоги открываются внутри MDI, со стилем MDI_CHILD.
Посему открывать сам калькулятор надо теперь в виде Tool-диалога. Однако нужного аналога команды StdCmds.Open, к сожалению нет. Если бы открывали диалог из файла, использовали бы OpenToolDialog... А тут придется использовать модуль более низкого уровня StdDialog (или можно было бы Windows). Пишем в Config следующее:
Код:
StdDialog.Open(ObxCalc.New(), "Мой калькулятор", NIL, "", NIL, TRUE, FALSE, TRUE, FALSE, TRUE).
Перекомпилируем - проверим - открывается инструментальный диалог.
4) Собственно, убирание главного окна. Для этого есть у BlackBox параметр командной строки /NOAPPWIN . Создадим файл Calc/System/Rsrc/CommandLine.txt с двумя строчками:
Код:
COMMANDLINE
/NOAPPWIN
Запускаем снова с ярлычка - видим, что теперь есть только одно окно калькулятора.
Можно воспользоваться и MtWindows.MDIOff. Там действительно "шаманство" с уводом главного окна за область экрана. Просто так можно его включать/выключать по мере надобности.
5) Ну и последний этап - сборка отдельного приложения. Обычный вариант - просто копируются нужные подсистемы Framework'а. Это около 1600 Кб. У меня, например, они отложены в отдельную папку, оставлено только то, что нужно. Вот архив:
http://blackbox.metasystems.ru/download/runtime.rar (0,6 Мб).
Сам файл BlackBox.exe перелинковывается с нужным ярлычком и переименовывается. Линковать статически все смысла нет - плюсов никаких - минусов много - в частности, теряем возможность легких обновлений и молниеносность загрузки в память, когда все остальное догружается потом, по мере надобности - а в линкованном виде будет грузиться сразу все.
Однако, если есть желание, то можно и слинковать всю среду, как описано в DevLinker Docu. Только перед Kernel надо дописать National, если используется пакет русификации, и в хвост дописать ObxCalc и Config. Правда, необъектные файлы, типа CommandLine.txt придется таскать снаружи.
Есть еще DevPacker, который позволяет упаковать в виртуальную файловую систему внутри Exe все, что угодно, при этом сохраняется инкрементная загрузка и расширяемость - положенные рядом файлы перекрывают припакованные. Однако в поставляемой конфигурации ББ драйвер упакованных файлов по умолчанию не загружается, его надо еще настраивать...