<< Пред. стр. 8 (из 32) След. >>
Рис. 5.10. Папка
System на смартфоне
Nokia N-Gage
Диск Е в телефоне представлен сменным накопителем или картой памяти. Каждый производитель поддерживает тот или иной стандарт карт памяти, но принцип работы один и тот же. На карту памяти пользователь инсталлирует программы, копирует музыку, видео, изображения и так далее. При удалении файлов с карты памяти нужно так же быть осторожным. Если вы не знаете, что это за файл, лучше его не удалять. Тем более, что при установке карты памяти на телефон, Symbian OS автоматически создает системные папки на этом накопителе. И, конечно, при установке программ на карту памяти отдельные файлы устанавливаемой программы так же попадают в системные папки карты памяти. Посмотрите на рис. 5.10, где представлена системная папка System, находящаяся на карте памяти.
Например, могу рассказать вам случай из жизни. Моя жена на своем смартфоне N-Gage устанавливала Java-игру, купленную в Интернете. Для этого на диске Е у нее была создана папка E:\Java. После инсталляции игры в установленную директорию, там появились два файла с расширениями *.jar и *.jad, что является показателем установленной Java- программы. Удаление Java-приложений необходимо осуществлять через команду меню Удалить в окне Приложения. Спустя месяц после установки Java-игры, она забыла про установленную игру (и немудрено, на ее телефоне я насчитал около 60 игр и 20 разных программ) и по ошибке удалила папку Java с диска Е, предполагая, что эта папка пуста. Через некоторое время она решила установить новую Java-игру на телефон, но не тут-то было. Открыть программу установки Java игр Приложения не удавалось - все время появлялось информационное окно, сообщающее о системной ошибке. То есть доступ к программе Приложения пропал. Дело в том, что при открытии этой программы, она моментально инициализирует установленные программы по регистрационным данным, которые находятся в папке E:\System\midp. Регистрационные данные - это простой файл специфического формата, где прописаны логи установки, в данном случае Java программ. Кстати, нечто подобное реализовано и при установке программ на C++. Только в этом случае все регистрационные данные размещаются в каталоге C:\System\Install\install.log. Ситуация была пато-
вой - любая попытка установки Java программы через файловый менеджер по Bluetooth и через программу установки Java приводила к системной ошибке. И, только инсталлировав удаленную игру на мой смартфон N-Gage QD и передав файлы с расширениям JAR и JAD по каналу Bluetooth на телефон жены в созданную папку Java, удалось решить эту проблему. Поэтому надо быть предельно осторожным при работе с файловыми менеджерами, тем более что в некоторых менеджерах не реализована функция подтверждения действий по удалению файлов. То есть, при выполнении команды "удалить", избранный файл безвозвратно удаляется, и нет никакой корзины. С другой стороны, без периодической очистки системы тоже обходиться нельзя. Механизм удаления программ в Symbian OS сделан на высшем уровне, но все же некоторые программы раскидывают свои "щупальца" по всей файловой системе телефона. Например, платные коммерческие программы делают это специально, размер таких файлов не критичен и может составлять всего несколько килобайт.
5.4.5. Оперативная память
Оперативная память, как вы понимаете, не менее важная часть системы. Не зря придуман лозунг: "Памяти мало не бывает". Symbian OS использует оперативную память, так же как и компьютерные системы. Память интегрирована в телефон и возможности ее увеличения нет. Но, исходя из того, что Symbian OS "мягкая" по характеру система, то и объем оперативной памяти необходимый для корректной работы системы небольшой. По минимальным требованиям Symbian OS - это 8 Мб, но производители телефонов обычно значительно увеличивают эту цифру. Например, в смартфоне Siemens SX1 интегрировано 16 Мб оперативной памяти. Подобно компьютерным системам при включении телефона определенные системные данные загружаются в оперативную память для работы Symbian OS. Когда вы запускаете программу на телефоне, она отбирает себе объем памяти, необходимый уже для работы запущенной программы. Объем памяти, необходимый для работы приложения, обычно не превышает 3 Мб. Программе память доступна в виде стека и кучи (динамически выделенная память). В каждом новом процессе количество памяти ограничено для стека от 1-3 Мб, а для кучи 8-35 Кб. Числа варьируются в зависимости от производителей телефонов. Эти цифры не зависят от количества используемых потоков. При запуске программы стек распределяется статически на время работы приложения, а объем динамической памяти возрастает по мере необходимости. Оперативная память не содержит резервного питания, и при отключении устройства все данные будут утеряны, что аналогично принципу работы компьютерных систем.
В конце главы еще раз хочется упомянуть о размере создаваемой программы. В Symbian OS, к счастью, особой проблемы с объемом программ нет. Поддерживается работа с картами памяти, размер которых достаточно большой для установки десятков различных программ. Это, конечно, очень большой и жирный плюс для всей системы, способствующий созданию все новых и новых шедевров игростроения.
Глава 6. Основы программирования в Symbian OS
У каждого программиста с течением времени формируется свой стиль написания исходного кода программ. Некоторые используют знаки подчеркивания в названиях классов, функций или переменных, другие эти же названия прописывают с заглавной буквы, игнорируя знаки подчеркивания. Каждый программист пытается выдумать что-то свое, индивидуальное, иногда даже понятное только ему одному. К сожалению, подобный подход в стандартизации названий классов, функций, переменных и структур не всегда оправдан. Разумеется, в реализации исходного кода - это некий индивидуализм и "глоток свежего воздуха" для программиста. Но данный подход возможен, если работа над проектом занимается небольшая группа, где каждый программист знаком со стилем партнера. А если в проекте участвует, предположим, пятьдесят человек и более, что тогда? Именно поэтому компании всего мира определяют для себя различные приоритеты и стандарты в написании исходного кода для упрощения общей реализации проектов. Каждая компания, которая действительно занимается программированием и ведет бизнес, построенный на создании программного обеспечения, имеет соответствующую документацию по стандартизации правил написания исходного кода программ. Например, несколько лет назад я "удаленно" работал на польскую компанию. Так вот первое, что они мне прислали по электронной почте -это требования в формате PDF, состоящие из 14 страниц и регламентирующие написание программного кода. А в одной австрийской компании, где работает мой хороший знакомый, даже предусмотрена система штрафов за неправильное написание названий в исходном коде. Точно такие же правила есть для Windows программирования - это венгерская система написания, которая, правда, не всегда применяется программистами.
Стандартизация написания исходного кода необходима, она упрощает разработку проектов. И если, программиста уволят, переведут, то разобраться с исходным кодом, над написанием которого он работал, скажем, в течение полугода, не составит труда любому другому программисту этой компании. Поэтому стандарты важны, их стоит придерживаться. Это одно из первых требований, предъявляемых программисту при устройстве на работу в одну из компаний, связанную с разработкой программного обеспечения под любую платформу.
Компания Symbian Ltd. при создании системных библиотек так же придерживалась определенного стандарта, на основе которого работают программисты всего мира. Этих требований необходимо придерживаться и вам, для того чтобы понимать исходный код, созданный другими людьми и наоборот. Поэтому нач-
нем с освещения системных библиотек, по принципу которых вам надо строить свой программный код, а в конце этой главы будут перечислены основные правила написания "правильного" кода.
6.1. Классы
Системная библиотека платформы Symbian OS содержит множество предопределенных классов для работы с графикой, диалогами, строками, массивами, функциями печати, контролем над событиями, получаемыми с клавиш телефона и многим другим. Об основных классах API Symbian OS вы можете узнать из приложения 1. В названиях классов используются префиксные английские заглавные буквы, подразделяющие классы на категории. Применяя такую систему работы с классами, можно очень легко добиться прозрачности и понятности использовании созданных классов в любом месте исходного кода всей программы.
При работе с классами в Symbian OS используются префиксные английские заглавные буквы: С, R, М и Т, обозначающие ту или иную область использования данного класса. Еще употребляется буква D, но этот вид классов применяется в низкоуровневом программировании для ядра системы Symbian OS. Необходимо иметь в виду, что при работе с классами с, R, М и Т система очистки или механизм освобождения захваченных ресурсов абсолютно разный.
6.1.1. Классы С
Классы с заглавной префиксной буквой С - это любые производные или наследуемые классы от основного класса CBase. При создании производных классов от CBase на основе оператора new (ELeave), все создаваемые члены класса данного объекта автоматически обнуляются. Классы С по умолчанию находятся в динамически распределенной памяти (в куче). По окончанию работы с классами С объекты должны обязательно удаляться из памяти.
6.1.2. Классы R
Классы, начинающиеся с буквы R, ассоциируются с классами ресурсов. При создании объектов этих классов, они по умолчанию размещаются в динамически распределяемой памяти.
По окончанию работы с классами R необходимо позаботиться о явном освобождении захваченных ресурсов и выгрузке объектов из памяти. Сделать это можно с помощью системной функции Close ().
6.1.3. Классы Т
Классы, использующие заглавную букву Т, являются базовыми классами для всех типов данных в API Symbian OS. В связи с этим классы Т не имеют деструктора, а работа с такими классами подобна работе с типами данных. При создании
объектов классов Т их размещение может происходить в любой области памяти. Так как распределение памяти не происходит, то и требования для очистки минимальны.
6.1.4. Классы М
В API Symbian OS с заглавной буквы М начинаются названия всех интерфейсов. В состав интерфейсов входит набор предопределенных виртуальных функций, доступ к которым можно получить через классы, реализующие данный интерфейс. Все классы, реализующие тот или иной интерфейс, начинаются с заглавной буквы
М.
6.1.5. Статические классы
Статические классы не имеют определенных правил написания. В Symbian OS статические классы применяются в основном как контейнеры для библиотечных функций.
6.2. Функции
В названиях функций в Symbian OS применяются англоязычные глаголы, обозначающие направленность действий для функций. Например, функция Draw () рисует на экране телефона некие графические элементы. Название функции начинается с заглавной буквы. Возможно использование и двух-трех слитно написанных слов, например: SetCommandHandler (). Можно придумывать названия и с большим количеством слов, но все же необходимо соблюдать преемственную логику названий для удобочитаемости исходного кода. Много API-функций имеют в окончании своих названий заглавные буквы L и LC, а так же в самих названиях используются английские слова Set (установить) и Get (получать).
6.2.1. Уходящие функции
В системной библиотеке Symbian OS есть несколько видов функций, два из них - это уходящие функции (leaving function) и неуходящие функции (non-leaving function). Эти технические термины влияют на сущность двух видов функций.
Symbian OS очень компактная система, работа которой рассчитана на устройствах с минимальными системными ресурсами. Вследствие этого в Symbian OS концепция освобождения захваченных ресурсов является важнейшим действием, которое необходимо учитывать при создании программ. Сидя за компьютером при "зависании" операционной системы, вы с легкостью можете перегрузить ее при помощи кнопки Reset на системном блоке, что абсолютно недопустимо для телефона. Поэтому в Symbian OS применяется одна из наиболее продуманных систем освобождения ресурсов. Например, работая с одной из программ в Symbian OS, вы пытаетесь загрузить какой-то файл ресурса этой программы,
и по каким-то независящим от вас обстоятельствам данного ресурса нет. Вызвав функцию, вы создаете поток и соответственно выделяете память. Если в итоге вызов этой функции терпит неудачу, то система обязана позаботиться о корректном ее завершении. В Symbian OS такой метод реализован программно на основе уходящего вида функций, которые используют в конце своего названия заглавную букву L, например, NewL (), CreateL (), RunL () и так далее. Но это не значит, что вы можете сделать в программном коде массу ошибок и надеяться, что системные функции все за вас сделают. Этот вид функций заботится лишь об освобождении системных ресурсов, так что исправить свои ошибки сможете только вы сами.
6.2.2. Неуходящие функции
Этот вид функций не имеет каких-либо отличий, но, как правило, это английский глагол, написанный с заглавной буквы и означающий действие, выполняемое функцией. Обычно неуходящие функции выполняют различные обобщенные действия, например, Exit () - выход.
6.2.3. Функции 1С
Еще один вид уходящих функций системной библиотеки имеет в конце названия заглавные буквы LC. Эти функции необходимы при работе со стеком. Стек -это область памяти, где содержится адрес возврата при вызове функции. Такой вид функций размещает определенные данные в стек и впоследствии заботится об освобождении или очистке ресурсов, связанных с вызовами этих функций.
6.2.4. Функции Set
Функции, использующие в своих названиях слово Set, например, SetPen-Color (), применяются для установки различных данных, свойств или параметров. То есть этот вид функций, просто задает набор данных для дальнейшей работы с ними. Например, с помощью функции SetColor () можно задать цветовую компоненту для графического элемента.
6.2.5. Функции Get
Функции, использующие в названиях слово Get, например, GetCurrent-Item (), призваны обеспечивать получение определенных комплексных данных. Например, ширина и высота дисплея телефона, на основании которых будет происходить дальнейшая работа с графическим контекстом.
6.3. Структуры
В приложениях под Symbian OS применяются структуры С-подобного стиля. В API содержится небольшое количество структур, особенно они актуальны для 6 и 5 версий Symbian OS. Системная библиотека версии Symbian OS 7 уже менее
привязана к структурам, но поскольку имеется обратная совместимость поздних версий API с ранними версиями, то на использование структур ограничений нет. Тем не менее, рекомендуется применять классы Т вместо структур в своих проектах.
6.4. Макросы
Макросы в программировании под платформу Symbian используют С-подоб-ную конструкцию записи, например, IMPORT_C. При отладке можно еще применять макросы с двойным подчеркиванием в начале слова и в конце: _WINS .
6.5. Имена переменных
В качестве имен переменных и объектов классов всегда лучше использовать близкое по смыслу существительное. Если это дисплей, то пусть он и будет Display, нежели d или Dy. Короткие названия очень быстры для написания, но, к сожалению, не отражают смысла переменной или объекта класса, поэтому лучше придерживаться осмысленных названий. Возможно, не все читатели знают в совершенстве английский язык, и иногда в демонстрационных примерах я использую английскую транскрипцию русских слов. Например, команда выбора может называться Vibor, это сделано для облегчения работы с книгой, но в профессиональной практике лучше не применять такие названия.
При работе с константами в Symbian OS в качестве префикса ставится заглавная буква К. Еще существуют так называемые перечисляемые константы, и в этом случае употребляется заглавная буква Е, например, EDecember, E January, EFebruary. Обычно этот вид перечислений используется в работе с ресурсами приложения.
Префиксная буква а используется при работе с аргументами. В названиях нестатических переменных и членов данных (date members) применяется буква i в качестве префикса к названию.
Что касается глобальных переменных, то ярко выраженных требований в написании названий нет, но рекомендуется свести процент использования глобальных переменных к нулю.
6.6. Простые типы данных
Для работы с различными типами данных в Symbian OS определены свои простые типы данных, на основе которых создаются переменные в исходном коде. Чтобы простые типы данных были доступны, в программу нужно подключить системный заголовочный файл e32defs.h. Рассмотрим типы данных в Symbian OS:
? Tint - целочисленное 32-битное значение размером не менее четырех
байт;
? TUInt - целочисленное 32-битное значение со знаком размером не менее
четырех байт;
? TInt64 - 64-битное целочисленное значение размером в восемь байт;
?
? TI n 18 - 8-битное целое значение размером в один байт;
? TIntl6 -16-битное целое значение размером в два байта;
? т I nt 3 2 - 32-битное значение размером в четыре байта;
? TUInt8 - 8-битное целочисленное значение со знаком размером в один
байт;
? TUIntl б - 16-битное целое значение со знаком размером в два байта;
? TUInt32 - 32-битное целочисленное значение со знаком размером в че
тыре байта;
? TReal - число с плавающей точкой размером в восемь байт;
? TReal32 -32-битное число с плавающей точкой размером в четыре байта;
? TReal64 - 64-битное число с плавающей точкой размером в восемь байт;
? TRealX - число с плавающей точкой в диапазоне от - ±1 х 10 ~9863 до
~ ±1 х Ю9863 размером в двенадцать байт;
? TText8 - 8-битное символьное значение размером в один байт;
? TText - символьное значение с использованием уникода (Unicode) раз
мером в два байта;
? TTextl6- 16-битное символьное значение с использованием уникода
размером в два байта;
? TChar - 32-битное символьное значение с использованием уникода раз
мером в четыре байта;
? TBool - логический тип данных, содержащий переменные ETrue и EFalse
размером в четыре байта.
6.7. Рекомендации
В этом разделе вы найдете множество рекомендаций по правильному написанию исходного кода программ.
1. Старайтесь писать компактный и понятный код.
2. При компиляции программного кода добейтесь минимума предупрежде
ний от компилятора (Warnings 0).
3. Всегда придумывайте осмысленные названия для классов, функций, объ
ектов, переменных и так далее.
4. Старайтесь не использовать глобальные переменные.
5. Исключайте в названиях знаки подчеркивания, если это не макросы.
6. Все названия старайтесь писать с заглавных букв с присоединением, где
необходимо префиксов.
7. Создавая переменную, инициализируйте ее сразу.
8. При создании нескольких переменных одного типа не пишите их через за
пятую. Каждую переменную объявите в новой строке кода и инициализи
руйте.
9. Если используете сокращения в названиях, придумайте его так, чтобы это
название стало очевидным.
10. Старайтесь избегать длинных названий, они значительно ухудшают об
щее восприятие кода в целом.
1.
11. Щедро документируйте свой код комментариями, чтобы через полгода
можно было вспомнить, что же вы все-таки разрабатывали.
12. При подключении заголовочных файлов убедитесь, что вы подключили
только нужные файлы, а не все подряд на всякий случай.
13. Не экспортируйте виртуальные, подставляемые и не библиотечные функ
ции в программу.
14. При создании указателя, оператор звездочка (*) должен быть написан
у названия типа, а не у указателя, например: TBar* Stol;
15. Системная библиотека Symbian OS включает множество предопределен
ных классов на все случаи жизни. Применяйте классы API в альтернативу
своим созданным классам.
16. Создавая свой класс, определите объявление класса в заголовочном фай
ле (*.h), а описание в исходном файле (*.срр).
17. Избегайте рекурсии в программах.
18. Будьте очень осторожны при приведении типов.
19. Сложные и большие действия разбивайте на более мелкие задачи.
20. Старайтесь использовать отладочные макросы API при создании про
грамм.
21. Symbian OS создана в лучших традициях ООП (объектно-ориентирован
ное программирование), поэтому проектируйте свои программы исходя
из этой концепции.
Здесь перечислены основные, но далеко не все рекомендации по созданию хорошего кода. Старайтесь следовать перечисленным выше инструкциям, создавая свои программы. По мере работы с Symbian OS вы поймете, что лучше потратить больше времени на написание хорошего кода, чем написать плохой код и потратить еще больше временит на его отладку.
классов, обеспечивающих создание графической оболочки системы. На рис. 7.1 представлена схема взаимодействия системных классов Symbian OS с UIQ и серией 60.
Два системных уровня абстракции CONE и APPARAC располагаются на уровне ядра системы Symbian OS.
? APPARC (Application Architecture - архитектура приложения) содержит
каркас системных классов для работы с приложением и прикладными
данными;
? CONE (Control Environment - система управления) включает системные
классы для графического взаимодействия с программой.
Уровень Uikon содержит множество системных классов Symbian OS, а три класса представляют графический пользовательский интерфейс (GUI) - это Application (Приложение), Document (Документ) и Арр UI (Пользовательский интерфейс приложения). Три перечисленных компонента уровня Uikon представлены системными классами с одноименными названиями.
? Класс CEikApplication - приложение;
Q Класс СЕikDokument - документ;
? Класс CEikAppUi - пользовательский интерфейс приложения.
Все эти три класса уровня Uikon являются базовыми классами, над которыми надстраиваются платформы UIQ и серии 60. Иначе говоря, системные классы UIQ и серии 60 являются производными от системных классов CEikApplication, CEikDokument, CEikAppUi уровня Uikon операционной системы Symbian.
В этом разделе уже несколько раз использовалась аббревиатура UI (Пользовательский интерфейс или интерфейс пользователя) и GUI (Графический пользовательский интерфейс). Это две разные составляющие одного приложения. Не путайте их между собой!
Интерфейс пользователя (UI) - это совокупность различных элементов пользовательского интерфейса приложения, а именно вкладки, диалоги, переключатели, списки, информационные окна, кнопки, флаги, то есть все то, что определяет как общий вид программы, так и дает возможность пользователю взаимодействовать с приложением.
Графический пользовательский интерфейс (GUI) - это каркас или база, на котором происходит построение как UI, так и всего приложения в целом. Например, в Windows программировании, прежде всего, необходимо создать и зарегистрировать класс Windows, реализовать обработчик и главный цикл событий. В итоге получится окно, то есть некий каркас для дальнейшего развития программы. Абсолютно тот же самый прием используется и в программировании под Symbian OS, но уже со своим индивидуальным подходом.
Более того, в Symbian OS имеется еще одно похожее название GDI (Graphic Device Interface - графический интерфейс устройства). Это системный уровень абстракции Symbian OS, который находится на уровне ядра и отвечает за связь графической системы и аппаратной части устройства. Интерфейсы UI, GUI и GDI очень похожи в своих названиях и, несомненно, связаны между собой, но это
три разных составляющих одной большой системы и ни в коем случае их нельзя путать между собой.
7.1.1. Платформа UIQ
Платформа UIQ, Созданная компанией UIQ Technology AB и применяемая в телефонах Sony Ericsson, Motorola, BenQ, Arima, является своего рода стандартом для Symbian OS. Как правило, телефоны, использующие UIQ, имеют разрешение экрана как минимум 208 х 320 пикселей и обладают при этом полноценным сенсорным дисплеем. Поэтому интерфейс пользователя UIQ значительно отличается от серии 60 и содержит собственный набор классов Qikon, надстраиваемых над системными классами Uikon операционной системы Symbian. Классы UIQ (Qikon) - производные от классов Uikon, они очень похожи в своих названиях. Посмотрите на табл. 7.1, где показана связь классов Uikon и Qikon.
Таблица 7.1. Связь классов Symbian OS (Uikon) и платформы UIQ (Qikon)
Symbian OS - Uikon UIQ - Qikon
Application CEikApplication CQikApplication
Document CEikDocument CQikDocument
AppUl CEikAppUi CQikAppUi
Можно заметить, что названия классов практически идентичны и лишь префикс Qik указывает на принадлежность классов к платформе UIQ. Создавая программы для UIQ, вы будете использовать именно эти ключевые классы Qikon, которые напрямую взаимодействуют с системными классами Uikon. Естественно, существует огромное количество классов UIQ, но именно на основе этих трех классов формируется каркас (GUI) программы для UIQ.
7.1.2. Серия 60
Серия 60 специально адаптирована на меньшее разрешение экранов телефонов - это как минимум 176 х 208 пикселей. Сенсорный дисплей в этой платформе не предусмотрен и взаимодействие с пользователем осуществляется с помощью клавиш телефона. Поэтому серия 60 имеет свои системные классы под названием Avkon. В табл. 7.2 показана связь системных классов Symbian OS Uikon и классов серии 60 Avkon.
Таблица 7.2. Взаимодействие классов Symbian OS (Uikon) и классов серии 60 (Avkon)
Symbian OS - Uikon Серия 60 - Avkon
Application CEikApplication CAknApplication
Document CEikDocument CAknDocument
App Ul CEikAppUi CAknAppUi и CAknViewAppUi
По аналогии с UIQ в серии 60 (Avkon) применяются префиксы Akn для названий системных классов этой платформы. Более того, прибавился еще один дополнительный класс CAknViewAppUi и это как раз связано с меньшим разрешением экрана телефона. То есть через класс CAknViewAppUi происходит своего рода адаптация некоторых частей графической оболочки под телефоны серии 60. Так же как и в UIQ (Qikon), в серии 60 (Avkon) четыре перечисленных класса выступают каркасом, на котором базируются программы для серии 60.
7.2. Базовая составляющая приложения
При создании полноценных программ под операционную систему Windows, необходимо реализовать несколько обязательных компонентов, на основе которых строится графический интерфейс пользователя (GUI). Без создания этого каркаса любая графическая составляющая программы будет просто недоступна, и максимум на что вы сможете рассчитывать, это на консольно-ориентированную программу, возвращающую вас во времена DOS. Такой вид программ уже давно не интересен пользователям, да и заменить интуитивно понятный пользовательский интерфейс командной строкой невозможно. Поэтому GUI Symbian OS состоит из каркаса классов, реализовав которые, вы получаете возможность для построения дальнейшей программы.
Когда в главах 2 и 3 были созданы демонстрационные примеры на базе шаблона HelloWorld с использованием Metrowerks CodeWarrior и C++ BuilderX Mobile Edition, вы, вероятно, заглянули в папки с исходными кодами. И обнаружили там массу непонятных вещей, но четыре автоматически сформированных класса вас наверно заинтересовали в большей степени. Как раз эти четыре класса и составляют графический пользовательский интерфейс приложения для Symbian OS. Реализация этих классов предоставляет программисту минимальную базу для создания приложений с полноценной графической оболочкой. Это классы Application (Приложение), Document (Документ), Арр UI (Прикладной пользовательский интерфейс) и класс view (Вид).
7.2.1. Класс Application
Класс Application определяет основные свойства всего приложения, предоставляя некую стартовую площадку для начала работы всей программы в целом. Он запускает объекты и идентифицирует приложение по уникальному идентификатору (UID3). Класс Application создает новый Document приложения. В системном уровне Uikon классом Application является класс CEikApplication, а для платформ UIQ и серии 60 соответственно классы CQikApplication и CAknApplication, наследующие возможности системного класса CEikApplication.
7.2.2. Класс Document
Класс Document содержит различные данные приложения и предоставляет эти данные приложению, создавая тем самым четко отработанную структуру для работы с данными программы. Класс Document так же создает пользовательский интерфейс приложения Арр UI. В Uikon - это системный класс CEikDokument, в UIQ, (Qikon) - класс CQikDokument. Для серии 60 (Avkon) определен класс CAknDokument.
7.2.3. Класс Арр UI
Созданный классом Document, класс Арр UI является абсолютно независимым и создает базовые элементы пользовательского интерфейса, то есть предоставляет минимальные элементы для создания полноценной графической оболочки приложения и обработки пользовательских команд. Так же класс Арр UI создает Арр view. В Symbian OS на уровне Uikon классом пользовательского интерфейса является CEikAppUi, в UIQ- класс CQikAppUi, а в серии 60 класс CAvkAppUi.
7.2.4. Класс Арр View
Класс Арр View необходим для контроля за графическим контекстом, представленным на экране телефона, делая возможным взаимодействие с данными на экране телефона. Класс Арр view в серии 60 играет роль адаптера для графической оболочки приложения и при этом дает дополнительные возможности для обработки событий, полученных с клавиш телефона.
Таким образом, изготовив каркас программы с помощью рассмотренных классов, вы создадите базовую среду для дальнейшего построения приложения, в котором необходимо будет реализовывать различные элементы пользовательского интерфейса, обработку команд, представление графики на экране, работу со звуком и видео.
Что же касается создания каркаса программы, то с этим очень хорошо справляются среды программирования, рассмотренные в главах 2 и 3. Став более опытным программистом в вопросах, связанных с Symbian OS, создайте свой шаблон приложения, описывающий GUI (Графический интерфейс пользователя), и используйте его в дальнейшем в своих программах. После создания GUI-приложения для Symbian OS, необходимо создать дополнительные классы, решающие необходимый круг задач и интегрировать их в приложение. На рис. 7.2 схематично изображена архитектура приложения.
При этом вы естественно можете писать программный код и в исходных файлах, составляющих каркас графической оболочки приложения, но это значительно усложнит задачу, да и сами вы в итоге обязательно запутаетесь, создавая свои классы. Поэтому лучше придерживаться модели создания программ, показанной на рис. 7.2, тем более что язык программирования C++ тем и хорош,
Рис. 7.2. Архитектура приложения
что является объектно-ориентированным языком, упрощающим процесс создания программ.
7.3. Первая программа
Теперь давайте перейдем от теоретической части изучения структуры приложения к ее практической реализации и непосредственно к изучению исходного кода демонстрационной программы. В качестве примера была выбрана платформа серии 60. Модель работы для UIQ идентична серии 60, имеются различия только в пользовательском интерфейсе, однако общая схема создания GUI приложения аналогична для обеих платформ.
Чтобы сделать графическую оболочку для программы, необходимо создать свои собственные классы производные от классов Application, Document, Арр Ui и Арр View. Формируя новый проект в среде программирования Metrowerks CodeWarrior и C++ BuilderX Mobile Edition, вы получаете такие классы автоматически, они и составляют общий каркас GUI-приложения с минимальной базой для дальнейшего развития программы. На компакт-диске в папке \Code\Test находится проект Test, на примере которого мы изучим составляющую приложения для серии 60. Посмотрите внимательно на рис. 7.3, где показана модель взаимодействия классов приложения Test с системными классами Symbian OS.
Программа Test имеет три класса CTestApplication, CTestDocument и CTestAppUi, производных от системных классов Avkon и один класс CTestAppView, наследующий свойства от класса CCoeControl. Создав и реализовав эти четыре класса, вы получите общий каркас базовой составляющей GUI-приложения.
Рис. 7.3. Взаимодействие классов приложения Test
Прежде чем мы перейдем к исходному коду демонстрационного примера Test, необходимо сказать еще несколько слов о работе системы в момент функционирования программы.
7.3.1. Работа системы
В тот момент, когда на рабочем столе телефона выбрана иконка приложения, то есть она попадает в фокус курсора, и нажимается клавиша телефона для запуска приложения, на уровне ядра происходят мгновенные системные вызовы соответствующих библиотек и DLL. На рис. 7.4 показа схема системных вызовов в Symbian OS в момент запуска программы.
Как только было запущено приложение, создается новый системный процесс с вызовом функции E32Main() - это входная точка для всех новых процессов системы. Далее происходит процесс инициализации каркаса приложения с созданием нового потока, запуск высокоуровневого менеджмента обработки ошибок, связь с оконным сервером (Window Server) и инициализация ресурсов программы.
Рис. 7.4. Схема системных вызовов Symbian OS
На этапе загрузки DLL происходит создание приложения и бланка документа, затем идет создание интерфейса пользователя (Ш) приложения и управление передается самой программе. Цикл работы программы зависит от ее функционального назначения, но как только пользователь решит выйти из программы, выбрав команду выхода, работа системы переходит к этапу закрытия программы. На системном уровне в момент закрытия программы происходит закрытие всех активных библиотек, удаление из памяти загруженных ресурсов, закрытие сессии Window Server и уничтожение активного процесса, созданного для этой программы. Схема, конечно, несколько упрощена и на самом деле происходят вызовы около полусотни системных функций Symbian OS. Но это уже тема для отдельного разговора и область системных программистов, поэтому давайте перейдем к рассмотрению программы Test.
7.3.2. Класс CTestApplication
Определение класса в языке программирования C++ обычно состоит из двух файлов. Первый файл - заголовочный с расширением *.h, где задана спецификация класса, то есть объявляется класс, перечисляются данныечлены класса, а это конструкторы, деструкторы, функции и переменные. И второй файл - это файл реализации класса с расширением *.срр, где соответствующим образом описываются объявленные члены класса в заголовочном файле. Такой подход в объектно-ориентированном программировании считается лучшим и именно по этой схеме рекомендуется работать с классами в Symbian OS.
Класс CTestApplication необходим для создания и инициализации всего приложения. Спецификация класса находится в файле Test_Application.h, расположенном на компакт-диске в папке \Code\Test\inc\Test_Application.h. Для написания программ под Symbian OS создана очень удобная система расположения исходных файлов в папках, находящихся в каталоге проекта. Могут использоваться следующие названия папок:
? aif - эта папка предназначена для хранения иконки приложения (*.bmp)
и файла *.aif описывающего использование AIF ресурсов программы;
? data содержит файлы ресурсов (*.rss) приложения;
? group - в этой папке хранятся проектные файлы bld.inf, *.pkg и *.mmp,
а так же среды программирования располагают там свои проектные
файлы;
? inc - здесь хранятся заголовочные файлы проекта *.h, *.hrh, *.pan;
? install или sis может использоваться одна из папок для файлов *.pkg
и *.sis;
? src - папка для файлов исходного кода (*.срр) с реализацией объявлен
ных классов.
Это общепринятая структура проекта, правда, не всегда соблюдаемая. Кто-то, например, выбирает меньшее количество папок, обычно это касается ресурсов, но так или иначе лучше придерживаться этой схемы проекта. При упаковке проекта в SIS-архив лучше, чтобы файл PKG находился все-таки в папке \group.
Заголовочный файл CTest_Application.h содержит спецификацию класса CTestApplication. Давайте рассмотрим исходный код этого класса.
у/******************************************************* // заголовочный файл Test_Application.h
// спецификация класса CTectApplication //*******************************************************
// проверяем лексему #ifndef _Test_APPLICATION_H_ #define _Test_APPLICATION_H_
// подключаем системную библиотеку #include
// объявляем класс CTestApplication
class CTestApplication : public CAknApplication
{
public:
TUid AppDllUidO const; protected:
CApaDocument* CreateDocumentL();
#endif // _Test_APPLICATION_H_ /у*******************************************************
В первых двух строках исходного кода файла CTest_Application.h происходит проверка: определена ли данная лексема в программе или нет. За директивами препроцессора #ifndef и #define в конце исходного кода всегда должна следовать директива tendif. Затем в коде происходит подключение системной библиотеки aknapp.h, где объявлен класс CAknApplication (класс приложения) системного уровня Avkon для серии 60. Датее происходит объявление класса: class CTestApplication : public CAknApplication
С помощью ключевого слова class декларируется спецификация класса CTestApplication и оператор ":" указывает на открытое наследование от класса CAknApplication, предоставляя тем самым классу CTestApplication все возможности системного класса уровня Avkon. В самом конце исходного файла происходит объявление двух функций: TUid: :AppDllUidO и CreateDocumentL() класса CApaDocument.
Теперь давайте перейдем к файлу CTest_Application.cpp, где дана реализация объявленного класса CTestApplication. Исходный файл так же можно найти на компакт-диске в папке \Code\Test\src\Test_Application.cpp.
/У*******************************************************
// файл Test_Application.cpp
// реализация класса CTestApplication /у*******************************************************
// подключаем заголовочные файлы #include "Test_Application.h" #include "Test_Document.h"
// константа со значением уникального идентификатора
const TUid KUidTest = { 0x10000000 };
// создаем бланк документа
CApaDocument* CTestApplication::CreateDocumentL()
{
CApaDocument* document = CTestDocument::NewL(*this);
return document;
}
// функция возвращает значение уникального идентификатора
приложения
// уникальный идентификатор приложения определен в файле ММР
TUid CTestApplication::AppDllUid() const
{
return KUidTest;
}
В строке исходного кода файла CTest_Application.cpp const TUid KUidTest = { 0x10000000 };
происходит объявление константы и присвоение ей значения уникального идентификатора (UID3) приложения. В Symbian OS уникальные идентификаторы -это ключевое понятие и довольно сложное по своей спецификации, поэтому эта тема вынесена в отдельный раздел главы 7.4. (Уникальные идентификаторы). А пока просто запомните, что это уникальный идентификатор приложения и обозначается он как UID3, то есть в приложении имеются еще как минимум два UID.
В спецификации класса CTestApplication были объявлены еще две функции. С помощью функции CreateDocumentL () создается бланк документа. Оператор " : :" очень часто используется в программировании под Symbian OS и определяет пространство имен. Вторая функция AppDllUid () идентифицирует приложение и возвращает уникальный идентификатор приложения (UID3). Как видите, класс CTestApplication предназначен для инициализации приложения и создания бланка документа (Document).
7.5.3. Класс CTestDocument
Класс CTestDocument создает общий механизм для работы с прикладными данными программы - это работа с файлами, операции по сохранению и чтению
пользовательских данных. Обращение к памяти происходит при помощи потока. Поток - это последовательность двоичных данных. Кроме того, класс CTestDocument создает AppUi, применяя для этого функцию CreateAppUiL (). Спецификация класса CTestDocument находится на компакт-диске в папке \Code\Test\inc\Test_Document.h, рассмотрим этот заголовочный файл.
// заголовочный файл Test_Document.h
// спецификация класса CTestDocument //*******************************************************
// проверяем лексему tifndef _Test_DOCUMENT_H_ #define _Test_DOCUMENT_H_
// подключаем системную библиотеку tinclude
// ссылки на системные классы и классы приложения class CTestAppUi; class CEikApplication;
// объявляем класс CTestDocument
class CTestDocument : public CAknDocument
public:
// двухфазный конструктор
static CTestDocument* NewL(CEikApplicationS aApp);
static CTestDocument* NewLC(CEikApplications aApp);
// деструктор
~CTestDocument();
CEikAppUi* CreateAppUiL(); private:
void ConstructL();
// конструктор
CTestDocument(CEikApplication& aApp);
#endif // _Test_DOCUMENT_H_
В начале исходного кода следует стандартное определение лексемы и подключение системной библиотеки akndoc.h для работы с системным классом CAknDocument. Затем в исходном коде обозначаются две ссылки на системный класс Symbian OS и класс приложения.
class CTestAppUi; class CEikApplication;
Эти объявления, ссылающиеся на классы, необходимы в процессе компиляции программы, иначе возникнут ошибки. Далее идет объявление класса CTestDocument, который наследует возможности системного класса CAknDo-cument.
В спецификации класса CTestDocument используется стандартный двухфазный конструктор, работающий на основе функций NewL (), NewLC () и ConstructL (). При формировании класса в Symbian OS почти всегда используется такая конструкция исходного кода для создания класса. В Symbian OS очень важно следить за объектами, предотвращая утечку памяти. Если объект уже удален, а ссылка на него осталась в стеке, происходит сбой в системе и немедленное закрытие программы. Системные функции NewL (), NewLC () и ConstructL () создают объект класса и осуществляют контроль над объектом, находящемся в стеке, выполняя роль так называемого двухфазного конструктора.
Так же декларируется простой конструктор класса CTestDocument () со ссылкой на объект класса CEikApplication. В классе CTestDocument определен деструктор и функция CreateAppUiL () для создания AppUi.
Теперь перейдем к файлу реализации класса CTestDocument, который находится на компакт-диске в папке \Code\Test\src\Test_Document.cpp. Давайте посмотрим на исходный код и разберемся с его составляющей.
//*********************** * * ****************************** // файл Test_Document.срр
// реализация класса CTestDocument.h //*******************************************************
// подключаем заголовочные файлы
¦include "Test_Document.h"
<< Пред. стр. 8 (из 32) След. >>