Руководство программиста в Photon (1037671), страница 28
Текст из файла (страница 28)
/* Получение окна, в котором находится кнопка"Search" */
window_wgt = ApGetInstance(widget);
/* В данном окне ищем текстовый виджет */
text_wgt = ApGetWidgetPtr(window_wgt, ABN_name_txt);
/* Теперь получим текст */
PtGetResource(text_wgt, Pt_ARG_TEXT_STRING, &name, 0);
/* Переменная 'name' теперь указывает на корректный текст. */
/* Обработка текста соответствующим образом */
...
return(Pt_CONTINUE);
}
Декларация внутренних связей
PhAB генерирует декларацию для каждой внутренней связи, определённой в Вашем приложении:
-
ABM_internal_link_name – где internal_link_name является указателем на внутреннее определение модуля.
Для получения более полной информации об использовании внутренних связей см. главу "Доступ к модулям PhAB из программного кода".
Декларации иконок
PhAB также предусматривает для доступа к иконкам приложения две декларации. Имена соответствуют принимаемым по умолчанию, которое Вы всегда можете использовать, когда определяете иконки:
| указатель на экземпляр крупной иконки. Эта иконка используется только при использовании на полке иконок. Для получения более полной информации см. раздел "Модули иконок" в главе "Работа с модулями". |
| указатель на экземпляр мелкой иконки, отображающейся на панели задач. Поскольку Вы можете использовать этот указатель для доступа к иконке, легко осуществить для иконки требуемую переделку или анимацию. |
Глобальный хеадер-файл
PhAB позволяет Вам определить один глобальный хеадер-файл для каждого приложения. PhAB генерирует этот файл только однажды, в первый раз, когда Вы генерируете код приложения.
Как только Вы определили хеадер, PhAB автоматически включает его во все генерируемые заготовки С и С++ файлов. Таким образом, лучше всего определить хеадер, когда Вы впервые создаёте приложение. См. раздел "Установка стартовой информации приложения" в главе "Работа с приложениями". Вы можете модифицировать хеадер-файл в любой нужный Вам момент.
Вот удобный способ использования этого одиночного хеадер-файла для одновременного определения всех Ваших глобальных переменных и внешних ссылок на эти переменные:
/* Хеадер "globals.h" для приложения my_appl */
#include <Pt.h>
#ifdef DEFINE_GLOBALS
#define GLOBAL
#define INIT(x) = x
#else
#define GLOBAL extern
#define INIT(x)
#endif
/* глобальные переменные */
GLOBAL int variable1 INIT(1);
Если DEFINE_GLOBALS определена, то последняя строка вышеприведенного примера выглядит так:
int variable1 = 1;
Если DEFINE_GLOBALS не определена, то последняя строка приведенного выше примера имеет такой вид:
extern int variable1;
Не забудьте определить все глобальные переменные Вашего приложения с префиксом GLOBAL, как показано выше. Также убедитесь, что в один (и только в один) из Ваших файлов с исходным кодом включена следующая строка:
#define DEFINE_GLOBALS
Включение этой строки обеспечивает, что глобальные переменные определены в этом файле и используются как внешние декларации во всех остальных файлах с исходным кодом.
В файле Makefile сборка файлов с исходным кодом зависит от хеадер-файла. Так что если Вы внесли какие-либо изменения в хеадер-файл, при сборке Вашего приложения будут перекомпилированы все файлы с исходным кодом.
Имена функций и имена файлов
PhAB генерирует функцию для каждой функции инициализации, установочной функции модуля, ответной реакции, функции пункта меню и прочего, что Вы задаёте в Вашем приложении. Если Вам не нужна функция, оставьте пустым её имя.
После того как функция сгенерирована, Вы вольны модифицировать её. Есть только одно условие: если Вы изменили имя функции, Вы должны также изменить имя, которое Вы задали в связанной ответной реакции или определении внутренней связи. В противном случае PhAB будет продолжать регенерировать старое имя каждый раз при генерации приложения.
Способ, которым Вы задаёте имя функции в PhAB, определяет имя файла заготовки:
-
function_name Создаёт заготовку файла на С под именем
function_name.с
-
function_name@filename.ext
Создаёт заготовку функции и помещает её в filename.ext. Этот файл будет включать хеадеры и структуру функции, требуемые для компиляции в окружении Photon'а.
PhAB опознает расширения .cc, .cpp и .С как расширения языка С++.
Если это файл уже существует, заготовка функции добавляется к нему. Вы можете использовать эту технологию для уменьшения количества файлов с исходным кодом в Вашем приложении. Вы можете разместить любое количество функций в одном файле. Мы рекомендуем Вам помещать все функции, относящиеся к модулю, в одном файле.
-
function_name.ext Короткая форма для function_name@function_name.ext
-
class::function_name@filename.cc
Генерирует заготовку функции статического члена С++, а не прототип.
-
class::function_name@ Не создаёт заготовку функции или прототип. Вместо этого вызывает функцию статического члена класса С++. Для функции члена класса прототипы не генерируются; Ваше приложение должно иметь необходимые декларации в своём глобальном хеадер-файле.
-
function_name@ Генерирует прототип С –функции, а не заготовку. Это
полезно, если Вы используете библиотеку функций С.
-
::function_name@ Генерирует прототип для функции С++, а не заготовку.
Это полезно, если Вы используете библиотеку функций С++.
Вы можете использовать в одном и том же приложении PhAB'а и С и С++. См. раздел "Что генерирует PhAB" в главе "Генерирование, компилирование и запуск программного кода на исполнение".
Функция инициализации
PhAB позволяет Вам определить функцию инициализации уровня приложения. PhAB API вызывает эту функцию один раз при запуске приложения, перед тем как будут созданы какие-либо окна или другие виджеты. Для получения более полной информации по установкам этой функции см. раздел "Задание информации по запуску приложения" в главе "Работа с приложениями".
Функция инициализации включает стандартные аргументы argc и argv, так что Ваше приложение может, если необходимо, выполнить синтаксический анализ опций командной строки (см. ниже раздел "Обработка опций командной строки". Вы также можете использовать эту функцию, чтобы открыть какую-либо базу данных виджетов (см. главу "Доступ к модулям PhAB из программного кода") или другие файлы данных, специфические для данного приложения.
Вот простая функция инициализации, генерируемая PhAB:
/* Ваше описание */
/* AppBuilder Photon Code Lib */
/* Version 2.01A */
/* Стандартные хеадеры */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
/* Инструментальные хеадеры */
#include <Ph.h>
#include <Pt.h>
#include <Ap.h>
/* Локальные хеадеры */
#include "abimport.h"
#include "proto.h"
/* Строка опций приложения */
const char ApOptions[] =
AB_OPTIONS ""; /* Добавьте Ваши опции в "" */
int
init( int argc, char *argv[] )
{
/* предотвращает предупреждения (варнинги) об отсутствии ссылок */
argc = argc, argv = argv;
/* Обработка опций командной строки – если требуется */
/* Не забудьте проигнорировать первую обработку Photon’ом */
/* Типичное место для открытия баз данных виджета */
/* Любая другая специфическая для приложения инициализация */
return( Pt_CONTINUE );
}
Обработка опций командной строки
Приложение PhAB имеет по умолчанию несколько опций командной строки:
-h height [%] | Высота окна в пикселях или процентах от высоты экрана, если заданы %. |
-s server_name | Имя сервера Photon: |
Если server_name является: | Используется этот сервер: |
node_number – номер узла | //node_number/dev/photon |
fullpath – полный путь | fullpath |
relative_path – относительный путь | /dev/relative_path |
-w width [%] Ширина окна в пикселях или процентах от ширины экрана, если
заданы %.
-x position [%] [r] Координата х верхнего левого угла окна в пикселях или в
процентах от ширины экрана, если заданы %. Если задана r, координата является относительной к текущей консоли.
-y position [%] [r] Координата y верхнего левого угла окна в пикселях или в
процентах от высоты экрана, если заданы %. Если задана r, координата является относительной к текущей консоли.
-Si|m|n Состояние инициализации главного окна (свёрнутое в иконку, максимизированное или нормальное).
Вы можете запретить опции для размеров и позиции приложения – см. раздел "Опции командной строки" в главе "Работа с приложениями". Вы можете также определить дополнительные опции.
Для включения каких-либо дополнительных опций редактируйте собщения использования приложения, которые Вы найдёте в файле Usemsg в директории src Вашего приложения. Подробности о синтаксисе сообщений об использовании см. в описании usemsg в "Справочнике утилит QNX 6".
Для обработки опций командной строки используйте функцию getopt(), описанную в "Справочнике функций библиотеки С". В следующем примере показано, как Вы можете обработать несколько опций (три из которых имеют аргументы):
const char ApOptions[] = AB_OPTIONS "a:b:c:pqr";
int init( int argc, char *argv[] ) {
int opt;
while ( ( opt = getopt( argc, argv, ApOptions ) ) != -1 )
switch ( opt ) {
case 'a' : ...
case 'b' : ...
...
case '?' : ...
}
...
return Pt_CONTINUE;
}
AB_OPTIONS является макросом, который задаёт принимаемые по умолчанию опции, добавляемые PhAB'ом. Он генерируется PhAB'ом на основе Ваших установок запуска приложения. Например, если Вы установили кнопку "No Pos Arg" макрос AB_OPTIONS не будет содержать "х:" или "y:". Вы можете обрабатывать опции в AB_OPTIONS двумя способами:
-
включить ветку "case" для каждой опции, но ничего в них не выполнять. Вы можете также включить "default", который будет печатать сообщение при получении неверных опций
или
-
не включать ветви "case" для них. Если Вы это сделаете, Вы не можете иметь ветку "default". Библиотека PhAB также просматривает массив ApOptions, чтобы принимать в расчёт добавленные Вами опции. Например, в вышеприведенном коде библиотека опознаёт, что px100 задаёт позицию по Х (вместо с -р), в то время как -aх100 опознано не будет.
Установочные функции модуля
Установочная функция модуля генерируется, если Вы задали имя функции в привязанной ответной реакции модульного типа, как описано в разделе "Ответные реакции модульного типа" в главе "Редактирование ресурсов и ответных реакций в PhAB".
Все установочные функции PhAB имеют три главных аргумента:
int base_setup( PtWidget_t *link_instance,
ApInfo_t *apinfo,
PtCallbackInfo_t *cbinfo )
{
/* предотвращает предупреждения (варнинги) об отсутствии ссылок */
link_instance = link_instance,
apinfo = apinfo,
cbinfo = cbinfo;
/* Вот здесь Ваш код */
return( Pt_CONTINUE );
}