На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: B.V.
  
> чтото вроди фака (v.0.9) , симбиан
    дизайнер из меня не очень, поэтому критика полезна. если есть еще предложения, постите, а там будет видно, что из этого получится.


    Symbian FAQ

    Q

    Я пытаюсь работать с Symbian, но вижу непонятные аббревиатуры UIQ, Series60. Что это означает?

    A

    Symbian - это многоуровневая операционная система (написанная на С++), состоящая из нескольких компонентов. Это сделано для того, чтобы можно было создавать различные модификации системы, заточенные под различные устройства. Ядро, с точки зрения API, остается неизменным.

    UIQ -этамодификация касается телефоновсерии Sony Erricsson, а Series60 - для телефонов Nokia. Перед тем, как выбрать, с какой версией вы будете работать, вам надо определиться, с каким телефоном вам придется иметь дело. Чтобы портировать проект из одного телефона в другой, вам надо посмотреть, какую версию Symbian он поддерживает. Основные переделки, которые нужно сделать при портировании кода из UIQ в Series60 - это GUI. Также, возможно, вам придется поменять имена базовых классов в проекте.



    Q

    Какой язык программирования лучше использовать для работы в Symbian?

    A

    Используются два языка программирования: C++ и Java. Но рекомендуется использовать именно C++. В пользу данной рекомендации говорят следующие аргументы: Symbian написан на С++, при использовании Java вы не получаете полный доступ ко всем ресурсам этой операционной системы. На С писать программы для Symbian в общем случае нельзя.



    Q

    Какое IDE можно использовать для работы в Symbian?

    A

    Metrowerks Codewarrior for Symbian (v2.0, 3.0) и MS Studio. Все последующие ответы будут касаться только Codewarrior. Лучше всего иметь всегда последнюю версию среды разработки. в комплект также входит эмулятор устройства, с каким вы будете работать. Сразу хочу отметить, что эмуляторы не очень хорошие , прилично притормаживают, а также, долго загружаются.



    Q

    Что еще неприятного про Symbian можете поведать?

    A

    Пожалуй, самым неприятным в Symbian является документация. Зачастую она составлена достаточно криво, мало примеров исходных кодов, много воды, иерархия классов описана не удобным способом. В общем, мелочей очень и очень много. По пятибальной системе документация на троечку еле вытягивает. В качестве источника информации по Symbian могу порекомендовать

    http://www.newlc.com/

    http://www.forum.nokia.com/main.html

    каналы на Irc, посвященные программированию под Symbian (symbian development:
    EFnet, #symbian.dev) , а также, более опытного товарища программиста.

    Кроме того, рекомендуется тщательно изучить примеры проектов, который поставляются вместе с SDK. Как правило, именно там можно найти интересующий вас код (даже если о нем в документации нет никакого упоминания, или упоминается вскольз).

    Также, к неприятному моменту можно отнести ручную модификацию файлов ресурсов и инсталляции (любители визардов это сразу же почувствуют).





    Начало



    Все нижеследующее будет касаться только среды разработки Metrowerks Codewarrior for Symbian.

    Для начала вам нужно проинсталлировать нужное SDK, которое зависит от того, с каким устройством вам придется работать. Зачастую бывает так, что на одном рабочем месте установлено по несколько SDK. Для переключения между различными версиями SDK используйте утилиту "environmentswitch.exe", которая зачастую поставляется вместе с конкретной версией SDK. Эта утилита позволяет настроить переменные окружения должным образом, чтобы вы смогли откомпиллировать вашу программу. При скачивании SDK обязательно прочтите, какая версия Codewarrior требуется. Если версии не совпадут, то вы долго будете чесать затылок и размышлять, почему правильный код не компиллируется?

    Инсталляция может быть многоуровневой. Полная инсталляция, как правило, включает в себя следующие модули: Perl, Java, SDK. Если у вас есть возможность, то качайте именно такой пакет, в противном случае вас может ожидать сомнительное удовольствие качать отдельно Perl и Java для инсталлирования. Без этих модулей работа в Symbian весьма затруднительна, так как при компиллировании проекта часто используются модули, которые требуют наличия Perl или Java. Немного не привычно, но тут ничего не поделаешь.

    Итак, проинсталлируйте нужный вам SDK (по возможности устанавливайте все по максимуму и не забудьте про эмулятор), проинсталлируйте Codewarrior, поставьте доступные вам заплатки. Теперь, запустите Codewarrior for Symbian, в меню File выберите опцию "import project from .mmp file", возьмите любой проект, который поставляется вместе с SDK в примерах, далее, выберите SDK, с которым вы работаете. При правильных версиях ваш проект должен быть успешно загружен. Попробуйте откомпиллировать проект. Если все прошло удачно, то поздравляю вас, первый шаг сделан. В противном случае, еще раз внимательно прочитайте, какая версия SDK у вас стоит и для какого Codewarrior она предназначена. Скорее всего версии у вас не совпадают, в таком случае не унывайте, а скачайте правильные версии и заново все проинсталлируйте.

    Откомпиллированный проект запустите в эмуляторе (F5), посмотрите, как долго будет загружаться эмуляторм, выпейте чашечку кофе, потом поиграйтесь с эмулятором, найдите вашу программу и попробуйте ее запустить. Изучите другие программы, попробуйте с ними поработать.

    Казалось бы, что такая долгая загрузка эмулятора может отбить всю охоту программирования под Symbian (особенно у любителей запуска отладчика после изменения каждой строчки кода), но, выход есть. Для этого запустите эмулятор вручную (файл под названием "epoc.exe"). Версий эмулятора может быть несколько (зависит от того, с каким Target вы работаете, но лучше всего используйте эмулятор, лежащий по пути "C:\Symbian\7.0s\Series60_v21_CW\Epoc32\release\winscw\udeb\epoc.exe". И не закрывайте эмулятор при отладке. Таким образом, вы сэкономите кучу времени на загрузке эмулятора. Также, для быстрого просмотра результата ваших изменений (без отладчика) вы можете просто запустить эмулятор, ваша программа туда будет загружаться автоматически (при правильных настройках) - это тоже будет экономить кучу времени. Как выдите, ручной доступ к эмулятору имеет место быть часто, поэтому я рекомендую вам вытащить ярлычок эмулятора в Quick Launch.

    И еще один хороший совет: при инсталлировании SDK используйте пути, которые предлагаются по умолчанию (на диск C) - это поможет вам избежать в будущем головной боли при прочих настройках.



    Изучаем дерево каталогов Symbian



    Вам все таки лучше внимательно прочитать эту главу, так как вам в будущем придется непосредственно руками расковыривать эту структуру для получения конечного продукта. Я, в качестве примера, буду рассказывать про то, как организованы пути в SDK "S60_SDK_v21c_CW.zip" (Series 60).

    Итак, при установке "S60_SDK_v21c_CW.zip" у вас на диске C:\ появится папка Symbian/7.0s/Series60_v21_CW. В ней находятся следующие папки

    Epoc32 - это самое важное. все утилиты, эмуляторы находятся там.

    Examples - название говорит само за себя. Примеры там достаточно общие, но изучить их не помешало бы.

    Series60Doc - вся документация, которая вам доступна лежит там. Файлы разбросаны немного коряво, поэтому вам придется потрудиться, чтобы иметь представления что и где лежит. На мой взгляд, самым важным файлом является "Symbian_DevLib.chm", так как там находится описание иерархии классов Symbian.

    Series60Ex - продвинутые примеры для Symbian. Эта папка сохранит вам кучу нервных клеток, когда вы будете искать примеры исходного кода. Если у вас возникает вопрос по коду, не поленитесь заглянуть в эту папку и поискать там подходящий пример.

    Series60Tools - парочка полезных утилит. Возможно вы будете ими пользоваться, а возможно, нет.



    Итак, немного еще раз глянем в папку "Epoc32".

    gcc - там находится компилятор, линковщик.

    include - там лежат необходимые хидеры. Туда же и вы можете копировать необходимые файлы.

    tools - дополнительные тулзы, которые нужны системе. Возможно, вы тоже будете ими пользоваться, например, при создании файла инсталляции для реального устройства. как правило эти тулзы используют коммандную строку, поэтому вам придется потрудиться, чтобы изучить все нюансы.

    winscw - там могут храниться файлы, которые создаются вашим приложением.

    release - это очень важная папка, о существовании которой вам знать просто необходимо. В ней перечислены все targets, которые поддерживаются системой. При отладке программы на эмуляторе вы, скорее всего будете использовать tagret "winscw". Это означает, что компилятор будет генерировать код не для Arm процессора, а для процессора персональной машины. Внутри этой папки (winscw) лежат еще две папки: udeb и urel. В них лежат, соответственно названиям отладочная и релизная версия эмулятора и всего остального. Скорее всего, более важной для вас будет папка udeb. Внутри ее лежит эмулятор epoc.exe, все необходимые для него модули, а также, папка "z". Она для нас важна, поэтому изучаем ее дальше.

    Далее идет папка system. На первых порах нас интересует только папка apps (внутри папки system), в ней лежат все приложения, которые будут отображаться в эмуляторе на рабочем столе. Ваша программа также должна там быть, если вы хотите, чтобы эмулятор ее отобразил.



    Для начала этого достаточно. Необходимая иерархия дерева путей нам известна. Далее, попробуем разобраться с тем, как пишутся программы для Symbian.





    helloworld



    Целью данного цикла не является детальное изучение Symbian. Предполагается, что минимальные знания уже имеются. Даже если их и нет, то, как правило программы типа helloworld не являются слижком сложными для понимания. При рассмотрения этого примера нас больше будет интересовать, что происходит при компиляции, какие файлы где лежат и что к чему относится.

    Кстати, для проектов симбиана есть характерная особенность. Сам проект можно загружать двумя способами: использовать непосредственно бинарный файл (.mcp файл) проекта или импортировать проект (.mmp файл) . Все примеры в SDK только импортируются и бинарного файла проекта не имеют. Связано это с тем, что на разных компьютерах CodeWarrior может иметь различные настройки (в основном связанные с путями), а также с тем, что на одном и том же компьютере может стоять до несколько SDK, между которыми тоже надо переключаться. Поэтому, если вы пожелаете перенести ваш проект на другое рабочее место, то вы должны иметь правильно сконфигурированный .mmp файл . При импорте проекта среда для вас генерирует бинарный файл проекта, который вы можете использовать на одном и том же компьютере для более быстрой загрузки проекта (импорт проекта происходит медленнее, чем его загрузка). Кроме того, в будущем, когда вы надумаете создать файл инсталляции под реальное устройство, вам понадобится именно файл для импорта, а не проекта.

    Изучите структуру файла .mmp. Основная его задача - это перечислить все .cpp файлы (вместе с путями к ним относительно файла проекта), указать файл ресурсов и перечислить библиотеки, которые используются в проекте. К сожалению, по мере разрастания проекта, когда вы будете туда добавлять новые файлы и библиотеки, среда не изменяет автоматически файл .mmp. Поэтому, вы должны сомастоятельно отслеживать данные изменения и руками их вносить в файл.

    Обратите внимание на строчку в mmp файле

    UID 0x100039CE 0X10008ACE (цифры могут отличаться)

    вторая цифра 0X10008ACE - это id вашего приложения, которое потребует система. Оно должно быть уникальным, поэтому рекомендуется получить его на сайте www.symbian.com.

    Еще есть один важный файл для на .rss. Это файл ресурсов. Визуального дизайнера для него нет, поэтому вам придется руками его править и изменять. Изучите его структуру, за непонятными вещами обращайтесь в документацию. Так как (как я уже говорил ранее) документация составлена весьма плохо, то постарайтесь хотя бы понять, что там написано. Если вам потребуется новый контрол, который необходимо прописать в файле ресурсов, то лучше всего сначала поищите его в примерах - это будет самый быстрый способ.

    И еще один момент. Я бы не сказал, что код, который генерируется мастером автоматически, смотрится хорошо. Поэтому, если вам он не нравится, то лучше измените его.

    Итак, любое приложение под Symbian (C++) подчиняется достаточно строгим правилам, о которых вам надо помнить. Symbian использует паттерт "документ-вид-контроллер" для работы с приложением. Поэтому помните о необходимом минимуме, который вам надо реализовать в вашем приложении. Рассмотрим их на примере helloworld. Проект содержит следующие файлы.

    helloworld.h - содержит описание 4-ех классов

    *
    CExampleApplication - класс аппликации
    *
    CExampleAppView - вид
    *
    CExampleAppUi
    *
    CExampleDocument - документ

    В любом приложении эти 4 класса должны быть в наличие (названия конечно же могут быть разными).

    helloworld_application.cpp

    helloworld_appui.cpp

    helloworld_appview.cpp

    helloworld_document.cpp

    helloworld_main.cpp



    Вы можете в отладчике посмотреть последовательность вызовов системы, на которые вам надо ответить перед тем, как начать работу. Она примерно следующая:

    *
    вызывается функция EXPORT_C CApaApplication* NewApplication() для создания новой аппликации
    *
    в классе аппликации вызывается функция TUid CExampleApplication::AppDllUid() const для возврата id вашего приложения
    *
    в классе аппликации вызывается функция CApaDocument* CExampleApplication::CreateDocumentL() для создания нового документа
    *
    в документе вызывается CEikAppUi* CExampleDocument::CreateAppUiL() для создания CExampleAppUi
    *
    вызывается void CExampleAppUi::ConstructL() для создания класса вида приложения CExampleAppView

    Все остальное - это и будет ваша работа. В нашем примере в классе "вид" переопределяется функция void CExampleAppUi::HandleCommandL(TInt aCommand) для реагирования на команды пользователя. Далее, ничего сложного нет. Попробуйте разобраться сами, как программа реагирует на команды. Если нужно посмотреть параметры функций и классов, то рекомендую за ними обратиться в SDK.



    На этом вступительное знакомство с Symbian мы закончили. Однако легкость этого примера обманчива. Symbian построен с использованием паттернов проектирования и для разработчиков, которые работают с системами, написанными на процедурных языках на первых порах будет не очень легко. Плохая документация еще более усугубляет ситуацию. Плюс необходимость вручную работать с ресурсами и картинками.

    Все это компенсируется тем, что на данный момент Symbian является лидером на рынке операционных осей для смартфонов. То есть, ваши усилия не должны будут пройти впустую.
      внимание! подготавливаются еще статьи для фака. там мы немного коснемся обработки ресурсов, подготовки инсталляций, работа с изображениями. в конце будет выложен полноценный проект для симбиана.
      возможно, вас интересуют другие моменты. высказывайтесь здесь, если это будет в моей компетенции, то я постараюсь это тоже оформить.
        Создание собственного проекта с использованием файла ресурсов

        Поставим перед собой задачу: создать новый проект и попытаться поработать с контролами и диалогом.

        Этот цикл предназначен прежде всего для того, чтобы выявить те проблемы, которые могут появиться в таких случаях, которые возникают при обработке контролов, а также, как работать с файлом ресурсов. Вы увидите, что для Symbian имеются определенные особенности, о которых лучше знать.

        Если вы хотите повторить то, что я здесь написал в точности, вам надо скачать с сайта forum . nokia . com файл S60_SDK_v21c_CW.zip ( series 60 v 2.1). Но, если у вас на компьютере установлена другая SDK , то не отчаивайтесь, большая часть рекомендаций и подходов одинакова. Попытайтесь отследить некую параллель между тем, что пишу я, и тем, что получается у вас.

        Итак, приступим.

        Запустите CodeWarrior for Symbian. Выберите опцию File->New->Project->Symbian Stationery Wizard. Выберите путь и имя проекта. Далее, нажмите OK , выберите SDK , которое вам надо. В моем случае это nokia -> series 60 Series 60_ v 21_ CW . Далее , Next->hellowordplus.

        Это смотрится немного странно, ведь мы собрались создавать собственное приложение, а на самом деле создаем hellowordplus . Но я бы все равно рекомендовал именно такой подход, так как, в противном случае вы получите пустой проект без единой строчки кода. А настройка всего проекта, добавление в него targets - это отдельная тема и лучше всего ее вообще обойти стороной. Ежели вы создадите проект hellowordplus , то вы получите самый начальный код, сгенерированный мастером. Все, что вам останется, так это переименовать файлы, все названия классов, где встречается hellowordplus на что-то свое. В таком случае нужно произвести следующие манипуляции.

        1. закройте CodeWarrior
        2. найдите, где лежит ваш проект. Переименуйте все файлы как вам нужно, переименуйте все классы, все, где встречается слово hellowordplus на то, что вам надо. Не ограничивайтесь только файлами cpp и h , а проверьте все файлы.
        3. откройте файл . mmp (файл для импорта проекта) и в нем сделайте все необходимые изменения, в который перечислите новые названия файлов и название проекта.
        4. загрузите CodeWarrior , сымпортируйте ваш проект через mmp файл. Вы получите новый бинарный файл проекта и далее пользуйтесь им.

        Итак, если вы проделали это все, то у вас имеется необходимая база для дальнейшей работы.

        Далее, наша задача - нарисовать диалог и несколько контролов, а также поработать с ними. В качестве примера, можно нарисовать два радиобатона. Нужно, чтобы они работали так, как будто находятся в одной группе. То есть, когда пользователь кликает по одному из них, то второй отключается.

        Я в своих примерах не буду менять имена классов с hellowordplus на что-то другое - это вы сделаете за меня.

        Первым делом разберемся с деревом каталогов, которые созданы. Там находятся следующие папки (в других SDK , например, для UIQ дерево может быть другим):

        Control_Data - там перечислены все объектные файлы для всех targets . Нас будет интересовать только target WINSCW _ UDEB

        Group - здесь находится файл проекта для иморта ( mmp файл), файлы ресурсов

        Inc - здесь находятся хидеры

        Sis - здесь будет лежать инсталляция

        Src - исходники



        Мы не будем удалять из ресурсов ничего, скорее наоборот, - добавим свои собственные.

        Как я отмечал ранее, в своих примерах я не буду переименовывать файлы из "helloworldplus" в другие названия - это вы проделаете самостоятельно. Поэтому, когда вы в этом цикле встречаете "helloworldplus", то также изменяете это слово на то, что есть у вас.

        Разберемся с ресурсами, которые нам автоматически добавил мастер. Нас интересует прежде всего файл helloworldplus.rss. Найдите в нем следующий ресурс.

        ExpandedWrap disabled
          RESOURCE MENU_PANE r_helloworldplus_menu
          {
           items =
           {
            // added the new Options menu command here
            MENU_ITEM
            {
             command = EHelloWorldPlusCommand;
             txt = "Hello World Plus!";
            },
            MENU_ITEM
            {
             command = EHelloWorldPlusDrawNow;
             txt = "Request Screen Update";
            },
            MENU_ITEM
            {
             command = EHelloWorldPlusUserDraw;
             txt = "Force Screen Update";
            },
           
            MENU_ITEM
            {
             command = EHelloWorldPlusCommand1;
             txt = "Hello";
            },
            MENU_ITEM
            {
             command = EAknSoftkeyExit;
             txt = "Exit";
            }
           };
          }


        Идентификаторы EHelloWorldPlusCommand, EHelloWorldPlusUserDraw, EHelloWorldPlusUserDraw, EHelloWorldPlusCommand1 перечислены в файле "helloworldplus.hrh". Мы тоже там будем хранить все идентификаторы, которые будут использоваться в файле ресурсов. Идентификатор для меню r_helloworldplus_menu генерируется в файле "HELLOWORLDPLUS.rsg", который получается автоматически. Лучше всего не трогайте этот файл, так как, если вы делаете все правильно, то в нем необходимые идентификаторы будут генерироваться автоматически. В противном случае, чтото делается не так, но мы отвлеклись.

        Итак, как видно из этого ресурса, в меню имеется 5 пунктов. Запустите эмулятор и попробуйте найти вашу прогламму. Запустите ее и убедитесь, что эти пункты доступны и работают. Если у вас чтото не получается , то это означает, что у вас несколько приложений имеют одинаковый идентификатор. Возможно, до этого вы компиллировали другой проект из примеров, которые поставляются вместе с SDK, а потом создали новый проект. В таком случае, вероятно, идентификаторы, которые сгенерировались мастером, совпали. Вам надо найти папку

        "C:\Symbian\7.0s\Series60_v21_CW\Epoc32\release\winscw\udeb\z\system\apps"

        и удалить оттуда все приложения, которые вы компиллировали до этого. Потом снова перекомпиллировать ваш проект и запустить эмулятор. Снова найдите вашу программу, запустите и убедитесь, что все в порядке.

        Следующая задача - добавит в меню собственный пункт в меню. Для этого, в "r_helloworldplus_menu" добавим еще один блок (перед командой выхода).
        ExpandedWrap disabled
          MENU_ITEM
          {
           command = EHelloWorldPlusDialog;
           txt = "Show dialog ";
          }


        Обязательно добавим в файл helloworldplus.hrh в перечисление THelloWorldPlusIds "EHelloWorldPlusDialog". Перекомпиллируйте проект и запустите эмулятор, запустите ваше приложение. Если вы все сделали правильно, то в меню должен появится новый пункт "Show dialog". В противном случае еще раз все проверьте, полностью перекомпиллируйте проект, исправьте все ошибки (как правило - это не поставленная запятая в перечислении и в файле ресурсов) и попробуйте заново. Будем считать, что у вас на этот раз все получилось и продолжим.

        Новый пункт в меню у нас появился, но, при попытке его обработать, программа валится. Это вполне понятно, так как мы не добавили обработчик этого пункта меню. Этим мы сейчас и займемся.



        Обработчик находится внутри функции

        void CHelloWorldPlusAppUi::HandleCommandL(TInt aCommand)

        Изучите ее, а после этого добавьте в блок switch(aCommand) свой обработчик.
        ExpandedWrap disabled
          case EHelloWorldPlusDialog:
          {
          }break;


        Перекомпиллируйте программу, запустите эмулятор и попробуйте обработать новый пункт в меню. На этот раз программа не упала, но и ничего не произошло. Это не удивительно, так как обработчик мы сделали пустым. До этого момента все было достаточно просто, но сейчас мы усложним задачу и добавим в ресурс новый диалог с двумя радиобатонами.

        Здесь есть очень интересный момент. Дело в том, что Series60 не поддерживает радиобатоны в своих ресурсах, а UIQ - поддерживает. Так как я все примеры привожу для Series60, то добавление радиобатонов будет носить чисто ознакомительный характер. Но, для тех, кто использует UIQ, это может быть реально рабочим примером. Итак, смотрим, как добавляется диалог с двумя радиобатонами (UIQ).

        ExpandedWrap disabled
          RESOURCE DIALOG r_2da_caps
          {
           title="Two Radiobuttons ";
           flags=EEikDialogFlagWait;
           buttons=R_EIK_BUTTONS_CONTINUE;
           items=
           {
            DLG_LINE
            {
             trailer="Radiobutton1";
             id=ECheckBox1;
             type=EEikCtCheckBox;
            },
            DLG_LINE
            {
             trailer="Radiobutton2";
             id=ECheckBox2;
             type=EEikCtCheckBox;
            }
           };
          }


        Не удивляйтесь, что радиобатоны в данном случае выглядят как чекбоксы, так как их и в UIQ нет, но мы эмулируем работу чекбоксов программно, чтобы они работали так, как будто находятся в одной группе.

        Прежде всего, надо добавить в hrh файл новые идентификаторы контролов

        ECheckBox1

        ECheckBox2

        Теперь, добавим в наш обработчик (пока что пустой) следующий код.

        ExpandedWrap disabled
          case EHelloWorldPlusDialog:
          {
           CEikDialog* pDialog = new ( ELeave )CEikDialog();
           pDialog->ExecuteLD( R_2DA_CAPS );
           pDialog = NULL;
          }break;


        CEikDialog - это стандартный диалог Symbian. Создается он оператором new (обратите внимание на ELeave - так рекомендуется создавать новые объекты в программах для Symbian). Далее, функция ExecuteLD инициализирует диалог нашим ресурсом. Диалог модальный, поэтому следующая строчка кода сработает только после того, как пользователь закроет диалог. Далее мы обнуляем указатель на диалог. И все, больше ничего делать не надо. В данном промере delete тоже делать не надо, так как окончание LD в функции Execute говорит системе о том, чтобы она автоматически удалила созданный объект диалога. Если вы вызовите delete самостоятельно, то получите аварийное завершение программы. Это она из особенностей Symbian, поэтому всегда внимательно читайте спецификацию и описание классов.

        Если вы работаете с UIQ, то попробуйте запустить пример и посмотреть, что получится. Вы должны увидеть два чекбокса, которые можно включить и выключить. Однако, они не ведут себя так, как нам хотелось бы (как будто они находятся в одной группе). Перед тем, как решить эту задачу, хочу кое что добавить.

        Перед тем, как использовать новые классы в проекте (в данном случае CEikDialog), всегда смотрите, какие библиотеки они требуют. В нашем примере (для QUI) CEikDialog требует библиотеку eikdlg.lib. Посмотрите, подключена ли она уже к вашему проекту? Если нет, то добавьте ее (поишите ее в папке ..Epoc32\release\winscw\udeb). Когда вы добавляете любой файл (библиотеку, cpp) к проекту, то не забывайте его вручную добавлять в файл импорта проекта mmp. Это вам понадобится в будущем, когда вы захотите создать инсталляцию под реальное устройство.

        Приступим к созданию диалога для управления нашими радиобатонами (UIQ, к Series60 вернемся позже).

        Создайте два новых файла (пускай они называются SettingsDialog.h и SettingsDialog.cpp), добавьте их в проект, а также впишите вручную их в файл mmp. В h файле впишите следующее.

        ExpandedWrap disabled
          ///////////////////////////////////////////////////////////////////////////////
          //SettingsDialog.h
          ///////////////////////////////////////////////////////////////////////////////
          #ifndef SETTINGS_DIALOG_H
          #define SETTINGS_DIALOG_H
          class CSettingsDialog : public CEikDialog
          {
           public:
            CSettingsDialog();
            ~CSettingsDialog();
           
           private:
            void PreLayoutDynInitL();
            void HandleControlEventL( CCoeControl* _aControl, TCoeEvent _aEventType );
            TBool OkToExitL(TInt aButtonId);
          };
           
          #endif //SETTINGS_DIALOG_H


        А в cpp файл следующее.
        ExpandedWrap disabled
          ///////////////////////////////////////////////////////////////////////////////
          //SettingsDialog.cpp
          ///////////////////////////////////////////////////////////////////////////////
          #include "SettingsDialog.h"
          #include "helloworldplus.hrh"
          #include "helloworldplus.rsg"
          #include <eikchkbx.h>
           
          //-----------------------------------------------------------------------------
          // Name : CSettingsDialog
          // Parameters :
          // Return :
          // Description :
          //-----------------------------------------------------------------------------
          CSettingsDialog::CSettingsDialog()
          {
          }
           
           
           
          //-----------------------------------------------------------------------------
          // Name : PreLayoutDynInitL
          // Parameters :
          // Return :
          // Description :
          //-----------------------------------------------------------------------------
          void CSettingsDialog::PreLayoutDynInitL()
          {
           ( ( CEikCheckBox* )Control( ECheckBox1 ) )->SetState( CEikCheckBox::ESet );
          }
           
           
           
          //-----------------------------------------------------------------------------
          // Name : HandleControlEventL
          // Parameters :
          // Return :
          // Description :
          //-----------------------------------------------------------------------------
          void CSettingsDialog::HandleControlEventL( CCoeControl* _aControl, TCoeEvent _aEventType )
          {
           if( _aEventType == EEventStateChanged )
           {
            CEikCheckBox* iCheckBox1 = ( CEikCheckBox* )Control( ECheckBox1 );
            CEikCheckBox* iCheckBox2 = ( CEikCheckBox* )Control( ECheckBox2 );
            if( iCheckBox1 == _aControl )
            {
             iCheckBox2->SetState( CEikCheckBox::EClear );
             iCheckBox2->DrawNow();
            }
            else if( iCheckBox2 == _aControl )
            {
             iCheckBox1->SetState( CEikCheckBox::EClear );
             iCheckBox1->DrawNow();
            }
           }
          }
           
           
           
          //-----------------------------------------------------------------------------
          // Name : OkToExitL
          // Parameters :
          // Return :
          // Description :
          //-----------------------------------------------------------------------------
          TBool CSettingsDialog::OkToExitL( TInt /*aButtonId*/ )
          {
           return ETrue;
          }
           
           
           
          //-----------------------------------------------------------------------------
          // Name : ~CSettingsDialog
          // Parameters :
          // Return :
          // Description :
          //-----------------------------------------------------------------------------
          CSettingsDialog::~CSettingsDialog()
          {
          }


        Весь сыр-бор был только для того, чтобы показать один ключевой момент, который имеет значение в Symbian.

        Прежде всего попробуем разобраться в коде. Функция PreLayoutDynInitL вызывается системойдля инициализации диалога, и грех ей не воспользоваться. В ней мы сделаем так, чтобы первый чекбокс при инициализации всегда был включен, а второй - выключен. Найдите в документации описание функции Control диалога CEikDialog и вы все поймете (для series60 - это класс CAknDialog). Нас больше интересует функция HandleControlEventL, которая вызывается системой, когда пользователь кликает по контролам на диалоге. В операционных системах Windows, PalmOs (за другие не ручаюсь) обычно можно получить идентификатор контрола в пришедшем сообщении, и, поэтому, можно выключить другой контрол. К большому сожалению, в Symbian нельзя программно получить идентификатор контрола, на который пришло сообщение (мы сразу получаем указатель на него). И тут встает дилемма, как узнать, какой контрол надо выключить? Одним из решений является сравнение указателей на контролы, которые можно получить программно с тем, который вам вернула система. В таком случае можно узнать, какой контрол надо оставить неизменным, а который надо изменить программно. Именно такой подход и используется в функции HandleControlEventL. Изучите ее внимательно, и, полагаю, все станет на свои места. Именно этот ключевой момент я и имел ввиду чуть выше (это еще одна из многих особенностей Sumbian).

        Однако, мы немного увлеклись UIQ, поэтому вернемся обратно к Series60. Как было указано выше, Series60 не поддерживает чекбоксы, поэтому мы поработаем с другим контролом. Как вы наверное заметили, UIQ и Series60 немного по разному описывают ресуры, поэтому, если вы будете писать приложение, которое предполагает портирование на разные платформы, вам надо отделить GUI от остальной части приложения. В таком случае эта задача будет решаться легче.

        Поработаем немного с Series60.
        ExpandedWrap disabled
          RESOURCE DIALOG r_2da_caps
          {
           title="Registration";
           flags=EEikDialogFlagNoDrag | EEikDialogFlagFillAppClientRect |
           EEikDialogFlagCbaButtons;
           buttons=R_AVKON_SOFTKEYS_OK_EMPTY;
           items=
           {
            DLG_LINE
            {
             type = EAknCtMultilineQuery;
             id = ESocketsServerNameEdwin;
             control = AVKON_DATA_QUERY
             {
              layout = EMultiDataFirstEdwin;
              label = "Enter registration number";
           
              control = EDWIN
              {
               flags = EEikEdwinNoHori zScrolling | EEikEdwinResizable;
               width = 30;
               lines = 1;  
               maxlength = 30;
               default_input_mode = EAknEditorTextInputMode;
              };
             };
            }
           };
          }


        Сравните, как отличаются даже флаги или описание диалога, не говоря уже и о других контролах на этом диалоге для UIQ и Series60. Мы не будем создавать отдельного класса для обработки этого диалога, а воспользуемся простейшим случаем.

        Не забудьте добавить идентификатор ESocketsServerNameEdwin в hrh файл. Измените свой обработчик.
        ExpandedWrap disabled
          case EHelloWorldPlusDialog:
          {
           CAknDialog* pDialog = new ( ELeave )CAknDialog();
           pDialog->ExecuteLD( R_2DA_CAPS );
           pDialog = NULL;
          }break;


        Запустите эмулятор и посмотрите, что у вас получилось.



        На этом данный цикл заканчивается. В следующем цикле мы разберемся, как создать файл инсталляции на реальное устройство полученного примера.
          Создание инсталляций для реального устройства

          Предположим, что у вас имеется готовый проект, который вы желаете залить на реальное устройство. В конечном итоге вам нужен sis файл. В качестве проекта в данном примере возьмем стандартную helloworldplus программу (можно использовать модифицированную версию, которую мы создали в предыдущих статьях).

          Для начала, нужно помнить о следующем.

          Если ваш проект успешно был скомпиллированным в CodeWarrior, то это не означает, что программа удачно проинсталлируется на устройство.

          Если ваш проект запускался на эмуляторе, то это не означает, что программа запустится на реальном устройстве


          Существуют рекомендации, часть из которых я приведу ниже, которых нужно придерживаться, если вы хотите, чтобы ваше творение заработало.

          Не забывайте о том, что каждое приложение должно иметь уникальный идентификатор. В противном случае, если на одном устройстве будут несколько программ с одинаковым идентификатором, то они просто не заработают, или заработает только одно из них, а остальные даже не отобразятся на рабочем столе. Вам надо получить этот идентификатор на сайте www.symbian.com

          1. В программах для Symbian категорически не рекомендуется использовать статические (или другие глобальные) переменные в классах. Даже, если это работает на эмуляторе, то на устройстве точно не заработает. Поэтому, одиночки (singletones) в классическом исполнении здесь не сработают. Используйте средства Symbian для решения такой задачи.

          2. Если, при чтении документации, вы прочли некую рекомендацию (к примеру, схранение объекта в стеке системы), то лучше такой рекомендацией воспользоваться, чем не обратить на нее внимание (даже, если это работает на эмуляторе).

          3. Обнуляйте указатели (глобальные в конструкторе, локальные где посчитаете нужным) при их объявлении, а также, после работы оператора delete.

          4. Не используйте bool, но используйте TBool. Не используйте int, но используйте TInt. Не используйте float, но используйте TReal. И так далее.


          Соблюдение этих простых правил уже избавит вас от половины проблем, которые вас могут поджидать при создании файла инсталляции для Symbian.

          Инсталляция делается в несколько этапов, при этом нам CodeWarrior нам уже не нужен, мы его использовали только для написания и отладки приложения, но не для создания конечной инсталляции. Далее мы будем работать с командной строкой. Ранее, мы уже рассматривали дерево папок, которые генерируются средой, когда мы создавали новый проект. Если вы работаете с Series60, то у вас должна быть папка sis, где и будем делать файл инсталляции.

          Для начала, создайте какую-нибудь папку на диске C:. Помните, я вам рекомендовал инсталлировать SDK на путь по умолчанию. Если вы инсталлировали SDK на другой диск, то папку делайте на том диске. К примеру, создадим папку c:\temp. В нее скопируем весь проект целиком (без корневого каталога). Теперь в папке group удалим все ненужное. Это папка helloworldplus_Data, файл helloworldplus.mcp и файл HELLOWORLDPLUS.xml.

          1. Найдите в вашем SDK файл bldmake.bat и скопируйте его в папку group.

          2. Создайте в папке group файл make_abld.bat (его содержимое опишу чуть ниже).

          3. Создайте в папке group файл build_armi.bat (его содержимое опишу чуть ниже).

          4. Создайте в папке group файл clean_armi.bat (его содержимое опишу чуть ниже).


          Содержимое файла make_abld.bat

          Цитата
          bldmake bldfiles



          Содержимое файла build_armi.bat

          Цитата

          @echo off
          SET EPOCROOT=\Symbian\7.0s\Series60_v21_CW\
          SET PATH=%EPOCROOT%epoc32\gcc\bin;%EPOCROOT%epoc32\tools;%PATH%
          abld build armi urel
          pause



          Содержимое файла clean_armi.bat

          Цитата

          @echo off
          SET EPOCROOT=\Symbian\7.0s\Series60_v21_CW\
          SET PATH=%EPOCROOT%epoc32\gcc\bin;%EPOCROOT%epoc32\tools;%PATH%
          abld clean armi
          pause



          Если вы придерживались всех моих рекомендаций относительно путей, то менять вам ничего не надо. В противном случае подкорректируйте эти файлы самостоятельно.

          Все это нам надо для компиллирования проекта под армовский процессор (режим release). Теперь, вам надо проверить файл импорта проекта (mmp файл). Для нашего случая (проект helloworldplus) его содержимое должно быть следующим.

          ExpandedWrap disabled
            TARGET HelloWorldPlus.app
            TARGETTYPE app
             
            // Change the second number here to change the UID for this application
            UID 0x100039CE 0x10000001
            TARGETPATH \system\apps\helloworldplus
             
            SOURCEPATH ..\src
            SOURCE HelloWorldPlus.cpp
            SOURCE HelloWorldPlusApplication.cpp
            SOURCE HelloWorldPlusAppView.cpp
            SOURCE HelloWorldPlusAppUi.cpp
            SOURCE HelloWorldPlusDocument.cpp
             
            SOURCEPATH ..\group
            RESOURCE HelloWorldPlus.rss
            RESOURCE HelloWorldPlus_caption.rss
             
            USERINCLUDE ..\inc
             
            SYSTEMINCLUDE \epoc32\include
             
            LIBRARY euser.lib
            LIBRARY apparc.lib
            LIBRARY cone.lib
            LIBRARY eikcore.lib
            LIBRARY avkon.lib
            LIBRARY commonengine.lib



          Содержимое этого файла зависит от проекта, но вы легко можете его модифицировать. Вам надо все сделать правильно, так как, при компиллировании вся информация берется из этого файла. Если какой то информации будет недостаточно, то компилятор (линковщик) выдадут ошибку.

          Откройте в вашем файловом менеджере две папки: C:\temp\group и C:\Symbian\7.0s\Series60_v21_CW\Epoc32 (для Series60 (v2.1)).

          Лучше всего работать в консольном режиме, чтобы видеть результат работы bat файлов, которые мы будем сейчас запускать.

          1. Запустите файл make_abld.bat. В результате в папке group у вас появится файл Abld.bat, а в папке Epoc32 появится папка Build.

          2. Файлы build_armi.bat и clean_armi.bat используются для компиллирования arm кода, и для очистки ресурсов соответственно. Перед тем, как снова компиллировать проект с командной строки, обязательно предварительно запустите файл для очистки ресурсов clean_armi.bat.

          3. Запустите файл build_armi.bat (лучше в консоли). Пускай компиллятор и линковщик сделают всою работу. Если все в порядке, то ошибок быть не должно. Лушче всего, чтобы и предупреждений не было тоже.

          4. Если компилляция прошла успешно, то у вас в папке C:\Symbian\7.0s\Series60_v21_CW\Epoc32\BUILD\TEMP1\GROUP должна появиться еще одна HELLOWORLDPLUS/Armi.

          5. Отыщите в папке C:\Symbian\7.0s\Series60_v21_CW\Epoc32\data\z\system\apps\HELLOWORLDPLUS файлв HELLOWORLDPLUS.RSC и HELLOWORLDPLUS_CAPTION.RSC. Если они есть, то все идет очень хорошо, мы почти справились. В противном случае, все пробуем делать заново.

          6. Также, отыщите в папке C:\Symbian\7.0s\Series60_v21_CW\Epoc32\release\armi\urel файл HELLOWORLDPLUS.APP - это и есть наша программа. Если и это есть в наличие, то вас можно только поздравить.


          Остается самая малость - собрать это все в один sis файл. В папке sis (проекта) отыщите файл helloworldplus.pkg. Если у вас нет его (другой SDK), то создайте его вручную. Содержимое этого файла следующее:


          ExpandedWrap disabled
            ; HelloWorldPlus.pkg
            ;
            ;Language - standard language definitions
            &EN
             
            ; standard SIS file header
            #{"HelloWorldPlus"},(0x10000001),1,0,0
             
            ;Supports Series 60 v2.0
            (0x101F7960), 0, 0, 0, {"Series60ProductID"}
             
            ;
            "\Symbian\7.0s\Series60_v21_CW\epoc32\release\armi\urel\HelloWorldPlus.APP"-"!:\system\
            apps\HelloWorldPlus\HelloWorldPlus.app"
            "\Symbian\7.0s\Series60_v21_CW\epoc32\data\z\system\apps\HelloWorldPlus\HelloWorldPlus.rsc"-"!:\system\
            apps\HelloWorldPlus\HelloWorldPlus.rsc"
            "\Symbian\7.0s\Series60_v21_CW\epoc32\data\z\system\apps\HelloWorldPlus\HelloWorldPlus_caption.rsc"-
            "!:\system\apps\HelloWorldPlus\HelloWorldPlus_caption.rsc"



          То, что было сгенерированно мастером автоматически немного поправьте на то, что я привел выше.

          И еще один нюанс. Обратите внимание на строчку

          ExpandedWrap disabled
            (0x101F7960), 0, 0, 0, {"Series60ProductID"}


          0x101F7960 - это номер версии Series60, для которого писалось приложение. Узнайте, какая версия стоит в телефоне и поправьте этот идентификатор на следующее из значений:

          ExpandedWrap disabled
            Series 60 v0.9 0x101F6F88
            Series 60 v1.0 0x101F795F
            Series 60 v1.1 0x101F8201
            Series 60 v1.2 0x101F8202
            Series 60 v2.0 0x101f7960
            Series 60 2nd Edition FP1 0x101F9115
            Series 60 2nd Edition FP2 0x10200BAB
            Series 60 2nd Edition FP3 0x102032BD



          Оставайтесь в папке sis. Создайте там файл build_sis.bat со следующим содержимым

          ExpandedWrap disabled
            @echo off
            rem SET EPOCROOT=\Symbian\7.0s\Series60_v21_CW\
            rem SET PATH=C:\Symbian\7.0s\Series60_v21_CW\Epoc32\gcc\bin;C:\Symbian\7.0s\Series60_v21_CW\Epoc32\tools;%PATH%
            makesis.exe helloworldplus.pkg



          Найдите в вашем SDK файл MAKESIS.exe и скопируйте его в ту же папку.

          Запустите файл build_sis.bat. Вы должны получить helloworldplus.SIS. Если у вас все получилось, то поздравляю вас. В противном случае ошибка скорее всего в bat файлах (связанная с путями). Найдите и исправьте ее.

          Удачи в создании инсталляшек.
          Сообщение отредактировано: bugger -
            А я бы начал с соглашения об именах классов и методов...
            Предлагаю темы, которые я мог бы поднять:
            • Соглашения об именах
            • "Исключения" (Leave)
            • Освобождение ресурсов в случае возникновения исключения
            • Активные объекты
            • Паттрен "Thin template"
            • м.б. еще что-нить по MTM (Message Type Modules)
            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0,0449 ]   [ 15 queries used ]   [ Generated: 22.04.24, 23:36 GMT ]