NASZE SERWISY:    ANDROID   LINUX   MAEMO   SYMBIAN   WEBOS




Hosting sponsoruje:



GRIN3 - polskie fonty

Profesjonalne czcionki z polskimi znakami - czcionki.com

OpenMobile on Facebook


 

Carbide.c++ - pierwszy program krok po kroku - część I

Carbide.c++ - pierwszy program krok po kroku - część I

Postprzez JacaK » 26 stycznia 2008, o 21:43

CZĘŚĆ PIERWSZA - WSTAWIENIE LISTBOXA


W Carbide.c++ wygenerowany framework zawiera już wszystko, co potrzebne do uruchomienia naszej pierwszej aplikacji.
Gdy to zrobimy - mamy na środku ekranu telefonu napis z nazwą naszego projektu, a w menu otwieranym prawym softkey'em znajduje się kilka opcji, z których każda po jej wybraniu powoduje wyświetlenie info z odpowiednim napisem.
I to wszystko.
Postanowiłem naukę programowania w c++ dla UIQ3 rozpocząć od wcielenia w życie przykładu zawartego w jednym z pierwszych rozdziałów książki on-line, którą znajdziecie na stronie:
http://books.uiq.com/index.php/Main_Page

Konkretnie chodzi o przykład QuickStart z rozdziału "Development environment and quick start" tej książki.
Poniżej jest dokładny opis, krok po kroku, czynności które musiałem zrobić, by stworzyć na podstawie tego przykładu aplikację działającą w moim telefonie - SE P1i.
Zastrzegam, że są to moje pierwsze próby ujarzmienia UIQ3, jak i c++, bo na codzień pisuję w pascalu - proszę więc o wyrozumiałość, a przede wszystkim o pomoc bardziej doświadczonych kolegów.
W moim opisie nie wyjaśniam rzeczy, które są wyjaśnione w książce wspomnianej powyżej. Więc w przypadku wątpliwości odsyłam do niej.
Jest to część pierwsza z serii "krok po kroku". Mam już gotową część drugą, w której wstawiam do menu wywoływanego prawym softkey'em ("Więcej") swoją opcję, która z kolei wywołuje wyświetlenie na ekranie telefonu okna dialogowego "O programie".
Następnie zamierzam rozbudowywać przykład o kolejne odkryte tajniki programowania mojego telefonu - jeżeli pierwsza część wzbudzi zainteresowanie, będę publikował części następne.

Po stworzeniu nowego projektu o wdzięcznej nazwie myfirstproject przystąpuję więc do działania.

1.
W pliku myfirstproject.hrh usuwam z listy używanych kontrolek, kontrolkę EmyfirstprojectLabelCtrl i wpisuję nazwę mojego nowego listboxa: TestowaLista (EmyfirstprojectLabelControl to ten napis na środku ekranu, którego już więcej nie chcę mieć)

Kod: Zaznacz cały
enum TmyfirstprojectControl
        {
        EmyfirstprojectViewPage = 1,
        ETestowaLista  //to dodane
        };


2.
W pliku myfirstproject.rss zmieniam zawartość sekcji opisującej kontrolki widoku
- zmieniam EmyfirstprojectLabelCtrl na ETestowaLista
- type zmieniam z EEikCtLabel na EQikCtListBox
- w control zmieniam r_myfirstproject_label na r_testowalista_listbox
- zmianiam również layout_manager_type z EQikGridLayoutManager na EQikRowLayoutManager
- a także layout_manager na r_row_layout_manager
- dodaję do definicji jeszcze: layout_data = r_row_layout_data_fill;

Kod: Zaznacz cały
RESOURCE QIK_CONTAINER_SETTINGS r_myfirstproject_page_control
    {
    layout_manager_type = EQikRowLayoutManager; //tu zmiana
    layout_manager = r_row_layout_manager;  //tu zmiana
    controls =
        {
        QIK_CONTAINER_ITEM_CI_LI
            {
            unique_handle = ETestowaLista; //tu zmiana
            type = EQikCtListBox; //tu zmiana
            control = r_testowalista_listbox; //tu zmiana
            layout_data = r_row_layout_data_fill; //cała linia dodana
            }
        };
    }


3.
Definiuję layout manager'a usuwając dotychczasowy dla układu grida (mój listbox ma mieć układ wierszowy)

Kod: Zaznacz cały
RESOURCE QIK_ROW_LAYOUT_MANAGER r_row_layout_manager
        {
          default_layout_data = QIK_ROW_LAYOUT_DATA {};
        }


4.
Definiuję layout_data, czyli r_row_layout_data_fill:

Kod: Zaznacz cały
RESOURCE QIK_ROW_LAYOUT_DATA r_row_layout_data_fill
    {
      vertical_alignment = EQikLayoutVAlignFill;
      vertical_excess_grab_weight = 1;
    }


5.
następnie usuwam opis kontrolki label, bo już jej nie będę używał, a w to miejsce muszę zdefiniować szczegóły kontrolki listbox

Kod: Zaznacz cały
RESOURCE QIK_LISTBOX r_testowalista_listbox
    {
      view = r_testowalista_view_default;
      layouts = { r_testowalista_normal_layout_pair };
    }


i w konsekwencji zdefiniować view i layouts użyte w powyższej definicji

Kod: Zaznacz cały
RESOURCE QIK_LISTBOX_ROW_VIEW r_testowalista_view_default
    {

    }


oraz

Kod: Zaznacz cały
RESOURCE QIK_LISTBOX_LAYOUT_PAIR r_testowalista_normal_layout_pair
    {
      standard_normal_layout = EQikListBoxLine;
    }


----------------------------------------------------------------------------------------------------

Aby sprawdzić, czy nie mam gdzieś błędu składniowego, albo, czy nie muszę dodać jakichś nagłówków - uruchamiam aplikację w emulatorze.
No tak - wyskakuje błąd - unknown QIK_LISTBOX.

- znajduje się w QikListBox.rh - muszę dodać na początku pliku

Kod: Zaznacz cały
#include <QikListBox.rh>


I kolejny błąd - Cannot convert EQikListBoxLine" to a number
Muszę więc dodać

Kod: Zaznacz cały
#include <QikListBoxStandardLayouts.hrh>


W tym momencie projekt dał się skompilować, ale oczywiście ekran jest pusty, bo listbox nie zawiera żadnego elementu.
Aby dodać elementy do listy muszę mieć metodę, która to zrobi. Dodaję więc deklarację metody AddItemsToListL do klasy widoku w pliku myfirstproject.h

Kod: Zaznacz cały
class CmyfirstprojectView : public CQikViewBase
        {
    public:
        static CmyfirstprojectView* NewLC(CQikAppUi& aAppUi);
        ~CmyfirstprojectView();

        // from CQikViewBase
        TVwsViewId ViewId()const;
        void HandleCommandL(CQikCommand& aCommand);
        void AddItemsToListL (void); //dodane
    protected:
        // from CQikViewBase
        void ViewConstructL();

    private:
        CmyfirstprojectView(CQikAppUi& aAppUi);
        void ConstructL();
        };


a w pliku myfirstproject.cpp tworzę implementację tej metody:
- pobieram mojego listboxa:

Kod: Zaznacz cały
CQikListBox* listbox=LocateControlByUniqueHandle<CQikListBox>(TestowaLista);


ale tutaj kompilator pokazuje błąd: undefined identifier 'CQikListBox', ponad to linia w edytorze nie jest odpowiednio pokolorowana - muszę dodać nagłówek

Kod: Zaznacz cały
#include <QikListBox.h>


Aby zmodyfikować listę trzeba użyć modelu danych - dodaję nagłówek:

Kod: Zaznacz cały
#include <MQikListBoxModel.h>


i do metody dodaję:

Kod: Zaznacz cały
MQikListBoxModel& model(listbox->Model());


Przed każdą modyfikacją listboxa musi być wywołane ModelBeginUpdateLC() więc kolejny wers metody to:

Kod: Zaznacz cały
model.ModelBeginUpdateLC();


a po zakończeniu modyfikacji musi być:

Kod: Zaznacz cały
model.ModelEndUpdateL();


Pomiędzy tymi liniami dodaję elementy listboxa:

- tworzę bufor na 32 znaki w linii

Kod: Zaznacz cały
TBuf<32> bb;


- ma być siedem linii więc pętla wygląda tak:

Kod: Zaznacz cały
for (TInt i=0;i<7;i++)


- w pętli tworzę wiersz listboxa:

Kod: Zaznacz cały
MQikListBoxData* lbData=model.NewDataLC(MQikListBoxModel::EDataNormal);


następnie odczytuję z zasobów tekst dla kolejnego elementu:

Kod: Zaznacz cały
iCoeEnv->ReadResourceL(bb,R_STR_LIST_CONTENT_1+i);


dodaję go do listboxa:

Kod: Zaznacz cały
lbData->AddTextL(bb,EQikListBoxSlotText1);


i czyszczę stertę:

Kod: Zaznacz cały
CleanupStack::PopAndDestroy(lbData);


Cała metoda wygląda tak:

Kod: Zaznacz cały
void CmyfirstprojectView::AddItemsToListL(void)
        {
          CQikListBox* listbox=LocateControlByUniqueHandle<CQikListBox>(ETestowaLista);
          MQikListBoxModel& model(listbox->Model());
          model.ModelBeginUpdateLC();
          TBuf<32> bb;
          for (TInt i=0;i<7;i++)
              {
                MQikListBoxData* lbData=model.NewDataLC(MQikListBoxModel::EDataNormal);
                iCoeEnv->ReadResourceL(bb,R_STR_LIST_CONTENT_1+i);
                lbData->AddTextL(bb,EQikListBoxSlotText1);
                CleanupStack::PopAndDestroy(lbData);
              }     
          model.ModelEndUpdateL();     
        }


Ale oczywiście nie mam w zasobach zdefiniowanych elementów listboxa - muszę to zrobić.
W pliku myfirstproject.rss dodaję:

Kod: Zaznacz cały
RESOURCE TBUF r_str_list_content_1        { buf="Poniedzialek";}
RESOURCE TBUF r_str_list_content_2        { buf="Wtorek";}
RESOURCE TBUF r_str_list_content_3        { buf="Sroda";}
RESOURCE TBUF r_str_list_content_4        { buf="Czwartek";}
RESOURCE TBUF r_str_list_content_5        { buf="Piatek";}
RESOURCE TBUF r_str_list_content_6        { buf="Sobota";}
RESOURCE TBUF r_str_list_content_7        { buf="Niedziela";}


Abym mógł użyć standardowego układu EQikListBoxSlotText1, muszę wstawić do myfirstproject.cpp nagłówki:

Kod: Zaznacz cały
#include <MQikListBoxData.h>
#include <QikListBoxData.h>


Nowa metoda będzie wywoływana przy tworzeniu widoku, a więc w:

Kod: Zaznacz cały
void CmyfirstprojectView::ViewConstructL()
        {
        // Loads information about the UI configurations this view supports
        // together with definition of each view.
        ViewConstructFromResourceL(R_UI_CONFIGURATIONS);
   
        AddItemsToListL();  //dodane
        }


Można jeszcze w pliku myfirstproject_loc.rss dodać (ale działa bez tego, bo nie wstawiam na razie do listbox'a żadnych ikon itp.):

Kod: Zaznacz cały
RESOURCE LOCALISABLE_APP_INFO
        {
        caption_and_icon =
            {
            CAPTION_AND_ICON_INFO
                {
                // The caption text is defined in the rls file
                caption = STRING_r_myfirstproject_caption;
                // Icons are used to represent applications in the
                // application launcher and application title bar.
                // The number_of_icons value identifies how many icons
                // that exist in the icon_file.
                number_of_icons = 3;
                // Using the application icons.
                icon_file = "\\Resource\\Apps\\myfirstprojectAppIcon.mbm";
                }
            };
        //kod poniżej dodany dla listboxa
        view_list =
            {
            VIEW_DATA
                {
                uid=ETestowaLista;
                screen_mode=0;
                caption_and_icon =
                    {
                    CAPTION_AND_ICON_INFO
                        {
                        }
                    };   
                }
            };
        }



a do pliku mmp trzeba dodać

Kod: Zaznacz cały
LIBRARY qiklbx.lib


To MUSI być dodane, bez tego zgłaszany jest błąd!!!:

Undefined symbol: 'class MQikListBoxModel & CQikListBox::Model(void) const (?Model@CQikListBox@@QBEAAVMQikListBoxModel@@XZ)'[]

I oto, po wszystkich męczarniach kodowania mamy upragnioną aplikację:

Obrazek
Ostatnio edytowano 27 stycznia 2008, o 02:19 przez JacaK, łącznie edytowano 1 raz
JacaK
1%
1%
 
Posty: 4
Dołączył(a): 19 grudnia 2007, o 22:11
    WindowsXPSeaMonkey

Re: Carbide.c++ - pierwszy program krok po kroku - część I

Postprzez valacar » 27 stycznia 2008, o 01:42

Super poradnik. Jak wstane rano to odrazu przetestuje.
Avatar użytkownika
valacar
1%
1%
 
Posty: 23
Dołączył(a): 12 listopada 2007, o 21:24
Lokalizacja: Gdańsk
    WindowsXPFirefox

Re: Carbide.c++ - pierwszy program krok po kroku - część I

Postprzez kameleon0781 » 28 czerwca 2009, o 14:12

Witam, ponieaż bardzo mało na polskojęzycznych stronach o programowaniu na Carbide C++ pod s60v3 , s60v5 - polecam blog mojego kolegi, ktory postanowił polakom przybliżyć co nieco na ten temat

http://flex2.blogspot.com/2009/06/problemy-z-carbidec.html
Avatar użytkownika
kameleon0781
1%
1%
 
Posty: 7
Dołączył(a): 25 grudnia 2008, o 19:29
Lokalizacja: Piła
Mod.tel.: n79
FW: 10.0.46.0
    WindowsVistaFirefox

Re: Carbide.c++ - pierwszy program krok po kroku - część I

Postprzez mawhy » 28 czerwca 2009, o 21:00

@Kamelon0781: temat trochę mylący: powinienem brzmieć "[UIQ3] Carbide.c++ - pierwszy program krok po kroku - część I", ale obecnie trzeba by to przepisać na S60
mawhy
30%
30%
 
Posty: 104
Dołączył(a): 19 stycznia 2008, o 00:24
Lokalizacja: Lublin
    WindowsXPFirefox


Powrót do Symbian C++

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość