Руководство программиста в Photon (1037671), страница 25
Текст из файла (страница 25)
offsets.lr.x=950;
PtSetArg(&arg[n], Pt_ARG_ANCHOR_FLAGS,
Pt_LEFT_ANCHORED_RELATIVE | Pt_RIGHT_ANCHORED_RELATIVE,
Pt_LEFT_IS_ANCHORED | Pt_RIGHT_IS_ANCHORED);
PtSetArg(&arg[n+1], Pt_ARG_ANCHOR_OFFSETS, &offsets, 0);
Помните, что пропорциональность, обеспечиваемая смещением анкера, выражается в десятых долях процента.
Установка ограничений по размерам или позиционированию без анкеров
Если Вы хотите поддерживать между позициями потомков более сложные связи относительно контейнера, или относительно друг друга, Вы должны захватывать события изменения размеров для контейнера. Виджетный класс PtContainer обеспечивает ответную реакцию Pt_CB_RESIZE, которую Вы можете использовать в этих целях.
Член cbdata структуры PtCallbаckInfo_t (см. "Справочник виджетов Photon'а) является указателем на структуру PtContainerCallbаck_t, содержащую по меньшей мере следующие члены:
PtRect_t old_size.
Структура Ptrect_t (см. "Справочник библиотечных функций Photon"), определяющая предыдущий (старый) размер контейнера.
PtRect_t new_size Структура PtRect_t, определяющая новые размеры.
Глава 8. Генерирование, компилирование и запуск программного кода на исполнение
В этой главе описывается, как сгенерировать, сформировать, скомпилировать и запустить на исполнение программный код для приложения PhAB:
-
Использование диалога "Build+Run"
-
Генерирование программного кода приложения
-
Как организовать файлы приложения
-
Редактирование исходного кода
-
Компилирование и линковка
-
Запуск приложения на исполнение
-
Отладка
-
Включение в Ваше приложение не-PhAB файлов
-
Создание DLL из приложения PhAB
PhAB автоматически генерирует все, что требуется для того, чтобы превратить Ваше приложение в работающий исполняемый файл, в том числе:
-
кодирует ту часть Вашего приложения, которая обрабатывает пользовательский интерфейс
-
создаёт заготовки файлов на С и/или С++ для специфических для данного приложения ответных реакций, функций установки модулей, функций инициализации приложения, и прочая
-
генерирует все файлы, требующиеся для компилирования и линковки приложения – файл Makefile, глобальный хеадер, главный файл и файл-прототип.
Выполняя всё это, PhAB позволяет Вам преуспеть в работе по написанию кода, обеспечивающего основную функциональность Вашего приложения.
В большинстве случаев генерирования программного кода Вы можете использовать диалог "Build+Run" или пункт "Generate" меню "Application". Однако Вы можете также генерировать некие файлы-заглушки на С и С++ в тех затруднительных случаях, когда при обустройстве Вашего приложения используются различные диалоги; используйте вот такие иконки, располагающиеся следом за областью имени функции или файла:
Это означает, что Вы вольны редактировать функцию ответной реакции, пока она ещё в процессе прикрепления её к виджету. Вы не можете перейти в диалог "Build+Run", сгенерировать оттуда код, а затем вернуться назад, чтобы написать функцию.
Использование диалога Build+Run
Рассматривайте диалог "Build+Run" как центр разработки для создания Вашего приложения. Из этого диалога Вы можете:
-
сгенерировать код приложения
-
собрать (скомпилировать и слинковать) Ваше приложение
-
отладить Ваше приложение
-
отредактировать код
-
запустить Ваше приложение на исполнение
Чтобы открыть диалог "Build+Run", выберите пункт "Build+Run" из меню "Application" или нажмите <F5>.
Если пункт "Build+Run" тусклый, это значит, что Вы ещё не дали имя Вашему приложению. Для получения более полной информации см. раздел "Сохранение приложения" в главе "Работа с приложениями".
PhAB автоматически сохраняет Ваше приложение, когда Вы открываете диалог "Build+Run".
Рис. 8-1. Простой сеанс "Build+Run"
Прокручивающийся список отображает файлы с исходным кодом приложения, которые генерируют PhAB, а также все те файлы, что созданы Вами "вручную". Этот список может быть пустым, если Вы проектируете новое приложение и ещё не сгенерировали никакого кода.
Генерирование программного кода приложения
Когда Вы делаете изменения в Вашем приложении, даже внутри Ваших собственных исходных файлов, Вам необходимо сгенерировать код приложения. Выполнение этого обеспечивает, что будет обновлён хеадер-файл прототипа proto.h. Вы можете смело генерировать код в любой момент – PhAB не будет переписывать какой-либо код, который Вы добавляли в заглушки, сгенерированный ранее. Перед генерацией кода PhAB сохранит Ваше приложение, если Вы модифицировали какие-либо модули. Чтобы минимизировать время компиляции, PhAB компилирует только те файлы, которые изменялись.
Если Вы планируете использовать в Вашем приложении глобальный хеадер, Вы должны установить хеадер перед тем, как генерировать какой-либо код. Для получения более подробной информации см. раздел "Задание установочной информации приложения" в главе "Работа с приложениями" и раздел "Глобальный хеадер-файл" в главе "Работа с программным кодом".
Чтобы сгенерировать программный код Вашего приложения:
-
Щёлкните на кнопке "Generate" диалога "Build+Run" или выберите пункт "Generate" из меню "Application".
-
Если Вы ещё не выбрали платформу (т.е. комбинацию компилятора и процессора), появится диалог:
Рис. 8-2. Селектор платформы
-
После того как Вы выбрали платформу, дождитесь, чтобы счётчик прогресса достиг 100%.
-
Щёлкните на "Done" в диалоге прогресса.
Если Вы сгенерировали код в диалоге "Build+Run", список файлов обновляется, показывая все сгенерированные файлы с программным кодом.
Что генерирует PhAB
PhAB генерирует различные файлы и сохраняет их в директории приложения src.
Любое имя файла, начинающееся с префикса "ab", является файлом PhAB и не должно никогда модифицироваться. Если Вы попытаетесь отредактировать ab-файл, Вы можете потерять результаты работы (когда PhAB перепишет файл) или получить некорректное поведение (когда файлы выйдут из синхронизма).
Вы можете модифицировать любые другие файлы, генерируемые PhAB, при некоторых условиях. Эти условия описаны в следующих разделах.
Вот файлы, генерируемые PhAB:
Makefile | Используется для компилирования и линковки приложения |
Usemsg | Сообщение пользователя для приложения |
abHfiles | |
abOfiles | |
abSfiles | Внешние ссылки PhAB в Makefile |
abdefine.h | Содержит все сгенерированные PhAB'ом декларации. PhAB включает этот хеадер во все файлы С |
abevents.h | Содержит все ответные реакции приложения. |
abimport.h | Хеадер внешней ссылки, включаемый во все файлы С. См. раздел "Прототипы функций" ниже |
ablinks.h | Содержит все определения модулей приложения |
abmain.c | Главный С-файл приложения. Этот файл начинается с "ab", так что не модифицируйте его |
abmain.cc | Если PhAB определяет какие-либо функции С++ в Вашем приложении, он генерирует abmain.cc вместо abmain.c. Этот файл также начинается с "ab", так что не модифицируйте его |
abplatform | Содержит список директорий платформ для приложения |
abvars.h | Содержит все сгенерированные PhAB'ом глобальные переменные |
abwidgets.h | Содержит все списки данных PhAB |
proto.h | Содержит прототипы приложения – см. раздел "Прототипы функций" ниже. Не переименовывайте этот файл |
Управление версиями
Вот файлы, которые Вам надо сохранять, если Вы используете ПО управления версиями (PhAB может генерировать некоторые из них, но хранить их все – не очень хорошая идея):
abapp.dfn | Ответные реакции и другая информация – это бинарный файл. |
wgt/* | Ресурсы виджетов – они могут выглядеть похожими на текстовые файлы, но это бинарники. |
src/*.(c,cc,cpp,C,h) | Файлы с исходным кодом и хеадеры. |
src/*files | Файлы, относящиеся к не-PhAB исходным фвйлам. Убедитесь, что сохраняете также не-PhAB исходники. |
src/Makefile, src/*/Makefile | Все make-файлы. |
application_name.ldb | Языковая база данных Вашего приложения. Сохраните также какие-либо файлы перевода. |
Вам понадобится содержать сопоставляемый набор всех файлов, генерируемых PhAB; сохраните ту же самую версию файлов abapp.dfn, src/ab* и wgt/*.wgt?
Некоторые рекомендации по использованию CVS
Сохранять приложение в PhAB легче, чем в RCS (RCS – Revision Control System; CVS – вероятно, Control Version System – система управления версиями. Прим. пер.).
Вот несколько вещей, которые надо помнить:
-
Пометьте файлы *.wgt? и abapp.dfn как бинарные (-kb).
-
Поскольку бинарные файлы не могут быть объединены, попытайтесь исключить возможность модификации бинарных файлов несколькими людьми одновременно. CVS не поддерживает запирания; самое точное, что Вы можете получить, это установить "watch" (наблюдение) в abapp.dfn (cvs отслеживет abapp.dfn).
При таком подходе, если Вы заканчиваете работу над приложением, Ваша копия файла abapp.dfn имеет атрибут "только для чтения" и PhAB не позволит Вам загрузить приложение. Если Вы хотите модифицировать приложение, Вы запускаете редактирование файла abapp.dfn с помощью CVS, которая делает файл доступным для чтения. Хотя это и не препятствует другому народу выполнить эти же действия, по крайней мере добавляет Вас в список "редакторов" сервера CVS, который другие пользователи могут опрашивать.
Прототипы функций
PhAB генерирует прототипы функций, используемые для компиляции, чтобы проверить, правильно ли вызываются Ваши функции. Эти прототипы располагаются в abimport.h и, возможно, в proto.h. Вот сравнение этих файлов:
proto.h | abimport.h |
Генерируется при синтаксическом разборе Вашего кода | Генерируется при просмотре установок Вашего приложения |
Генерируются прототипы для всех функций | Генерируются только прототипы, известные в PhAB (ответные реакции, установочные функции, ресурсы указателей на функции) |
Вы можете иметь проблемы с препроцессорными директивами (см. раздел "Потенциальные проблемы при генерировании файла proto.h), несвойственными языку С конструкциями, синтаксическими ошибками и кодом С++ | Прототипы не зависят от исходного кода |
Не работает с С++ | Содержит предопределённые #ifdefs и расширенные "С" декларации, требуемые для С++. |
Прототипы совпадают с тем, как выглядят функции | Прототипы совпадают с тем, как предположительно выглядят функции – если исходный код различается, компилятор сможет это определить. |
Чтобы подавить генерирование прототипов в proto.h:
-
Нажмите <F2> или выберите в меню "Application" пункт "Startup Info/Modules", чтобы открыть диалог "Application Startup Information".
-
Щёлкните на кнопке "Generate empty "proto.h" file".
Потенциальные проблемы с генерированием proto.h
Для повышения скорости программа, сканирующая Ваши файлы с исходным кодом на предмет прототипов функций, игнорирует препроцессорные директивы. Это может привести к определённым проблемам в файле proto.h.
Например, пусть мы имеем следующий код:
#ifdef DOUBLE
for (i=0; i<18; i++, i++) {
#else
for (i=0; i<18; i++) {
#endif
x += 2*(i+x);