SlideShare uma empresa Scribd logo
1 de 20
Baixar para ler offline
IDZ DO
         PRZYK£ADOWY ROZDZIA£

                           SPIS TREŒCI
                                         C++Builder 2006.
                                         Æwiczenia praktyczne
           KATALOG KSI¥¯EK               Autor: Andrzej Daniluk
                                         ISBN: 83-246-0518-5
                      KATALOG ONLINE     Format: A5, stron: 192
                                         Przyk³ady na ftp: 436 kB
       ZAMÓW DRUKOWANY KATALOG


              TWÓJ KOSZYK
                    DODAJ DO KOSZYKA                          Poznaj œwiat profesjonalnego programowania

                                         C++Builder 2006 to œrodowisko programistyczne pozwalaj¹ce na wizualne tworzenie
         CENNIK I INFORMACJE             aplikacji. Dziêki gotowym komponentom programista mo¿e skupiæ siê na tym,
                                         co najwa¿niejsze — na pisaniu kodu. Za pomoc¹ C++Buildera bez problemu stworzy
                   ZAMÓW INFORMACJE      zarówno niewielk¹ aplikacjê konsolow¹, jak i ogromny system informatyczny. Jednak
                     O NOWOŒCIACH        ka¿da wielka podró¿, równie¿ ta w œwiat programowania, zaczyna siê od ma³ego kroku.
                                         Dziêki ksi¹¿ce „C++Builder 2006. Æwiczenia praktyczne” uczynisz ten w³aœnie pierwszy
                       ZAMÓW CENNIK      krok. Poznasz œrodowisko C++Builder 2006 i podstawy jêzyka C++. Przeczytasz
                                         o programowaniu obiektowym i obs³udze zdarzeñ. Wykonuj¹c kolejne æwiczenia,
                                         dowiesz siê, jak korzystaæ z udostêpnianych komponentów i kontrolowaæ ich parametry.
                 CZYTELNIA               Wykorzystasz równie¿ oferowane przez C++Buildera narzêdzia i stworzysz w³asne
                                         aplikacje.
          FRAGMENTY KSI¥¯EK ONLINE           • Elementy œrodowiska C++Builder 2006
                                             • Tworzenie aplikacji konsolowych
                                             • Podstawowe elementy jêzyka C++
                                             • Klasy i obiekty
                                             • Projektowanie formularzy
                                             • Korzystanie z komponentów VCL
                                             • Projektowanie aplikacji z wykorzystaniem elementów biblioteki VCL




Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl
Wprowadzenie                                      5
Rozdział 1. Środowisko programisty IDE C++Builder 2006       7
           Struktura głównego menu                          10
           Pasek narzędzi — Speed Bar                       38
           Inspektor obiektów — Object Inspector            39
           Widok struktury obiektów                         41
           Podsumowanie                                     41

Rozdział 2. C++Builder 2006. Pierwsze kroki                 43
           Ogólna postać programu pisanego w C++            43
           Podsumowanie                                     55

Rozdział 3. Elementarz C++                                  57
           Operatory                                        57
           Podstawowe proste typy całkowite i rzeczywiste   61
           Typ Currency                                     63
           Typ void                                         63
           Typy logiczne                                    64
           Typy znakowe                                     64
           Typy łańcuchowe                                  65
           Modyfikator dostępu const                        67
           Typ wyliczeniowy                                 67
           Deklarowanie tablic                              68
           Struktury                                        70
           Instrukcje sterujące przebiegiem programu        71
           Wskazania i adresy                               82
4                C++Builder 2006. Ćwiczenia praktyczne

            Funkcje w C++                                             83
            Klasy w C++                                               86
            Operatory new i delete                                    90
            Podsumowanie                                              92

Rozdział 4. Środowisko programisty IDE C++Builder 2006                93
            Ogólna postać programu środowiska graficznego pisanego
             w C++Builderze 2006                                      93
            Hierarchia własności komponentów VCL                     102
            Dynamiczne tworzenie komponentów zarejestrowanych
             w bibliotece VCL                                        104
            Wykorzystujemy własną funkcję                            109
            Wykorzystujemy własną klasę                              111
            Składniki projektu tworzonego w środowisku graficznym    116
            Podsumowanie                                             118

Rozdział 5. Podstawowe elementy biblioteki VCL                       119
            Hierarchia komponentów VCL                               119
            Klasa TObject                                            120
            Klasa TComponent                                         120
            Klasa TControl                                           120
            Klasa TGraphicControl                                    129
            Klasa TWinControl                                        130
            Podsumowanie                                             133

Rozdział 6. Paleta narzędzi                                          135
            Podsumowanie                                             149

Rozdział 7. Techniki projektowania aplikacji w oparciu
            o elementy biblioteki VCL                                151
            Podstawowe komponenty zakładki Standard                  151
            Komponenty z klas TToolBar, TSaveDialog, TOpenDialog,
             TImageList, TActionList, TRichEdit                      166
            Komponenty z klasy TButtonGroup                          174
            Komponenty z klasy TCategoryButtons                      178
            Komponenty z klas TApplicationEvents i TTimer            183
            Podsumowanie                                             187
Rozdział ten poświęcony jest omówieniu praktycznych spo-
        sobów wykorzystania poznanych wcześniej elementów języ-
        ka C++ w graficznym środowisku C++Builder 2006. Zapo-
znamy się tutaj m. in. z pojęciem formularza oraz funkcji obsługi zda-
rzenia.




Formularz (ang. form) jest wyświetlanym na ekranie obiektem mogą-
cym składać się z wielu pól, które można wypełniać podobnie jak tra-
dycyjne dokumenty papierowe. Podczas wprowadzania danych do
formularza można je poprawiać, ponieważ każde pole formularza za-
chowuje się jak miniaturowy edytor ekranowy.
94              C++Builder 2006. Ćwiczenia praktyczne


Formularz
Poleceniem menu FileNewOther…VCL Forms Application stwórzmy
na pulpicie szablon aplikacji opartej na formularzu. Formularz jest
pierwszym obiektem, z którym się spotykamy, rozpoczynając pisanie
aplikacji. Po dwukrotnym kliknięciu w obszarze formularza dostajemy
się do okna edycji kodu modułu Unit1.cpp, który pokazany jest na ry-
sunku 4.1.




 Rysunek 4.1. Okno edycji kodu głównego modułu aplikacji

Jeżeli moduł tworzonego obecnie projektu za pomocą polecenia File
Save As… zapisaliśmy jako R4O1Unit_R4_01.cpp, to w tym samym
katalogu C++Builder powinien wygenerować plik nagłówkowy Unit_
R4_01.h. C++Builder oferuje nam bardzo wygodny sposób obejrzenia
jego zawartości. Korzystając z zakładki noszącej taką samą nazwę jak
plik nagłówkowy, zerknijmy do jego wnętrza. Od razu zauważymy,
iż zawiera on definicję klasy naszego formularza (rysunek 4.2).
Rozdział 4. • Środowisko programisty IDE C++Builder 2006         95




 Rysunek 4.2. Zawartość pliku nagłówkowego Unit_R4_01.h
 zawierającego definicję klasy formularza


       Przechodzenie pomiędzy plikiem .cpp i powiązanym z nim plikiem
       nagłówkowym .h możliwe jest również poprzez naciśnięcie kombinacji
       klawiszy Ctrl+F6. W celu przywołania formularza używamy zakładki
       Design.

Zdefiniowana klasa TForm1 dziedziczy własności bazowej klasy for-
mularza TForm, natomiast sam formularz, traktowany jako zmienna
obiektowa, deklarowany jest jako:
    TForm1 *Form1;

W definicji klasy formularza możemy zauważyć funkcję:
    void __fastcall FormCreate(TObject *Sender);

Builder odpowiednio inicjuje formularz (tylko jeden raz), kiedy jest
on tworzony po raz pierwszy. Sender jest pewnym wskaźnikiem wska-
zującym daną typu TObject. W rzeczywistości Sender reprezentuje
pewną właściwość, polegającą na tym, iż każdy obiekt łącznie z for-
mularzem (oraz każdy obiekt VCL) musi być w pewien sposób poin-
formowany o przyszłym przypisaniu mu pewnego zdarzenia (w przy-
padku formularza zdarzenie to polega na jego inicjalizacji).
96                    C++Builder 2006. Ćwiczenia praktyczne

                TObject jest bezwzględnym przodkiem wszystkich komponentów
                oraz klas VCL i umieszczony jest na samym szczycie hierarchii klas.

    Z rysunku 4.2 możemy odczytać, iż standardowa definicja klasy skła-
    da się z kilku części. Sekcja public służy do deklarowania funkcji
    i procedur (czyli metod lub operacji) oraz zmiennych (zwanych po-
    lami lub atrybutami), które w przyszłości mogą być udostępniane
    innym. Zasadniczą różnicą pomiędzy metodami a zwykłymi funk-
    cjami czy procedurami jest to, że każda metoda posiada niejawny pa-
    rametr this, wskazujący na obiekt będący przedmiotem wywołania tej
    metody. Sekcję public często nazywamy interfejsem obiektu formu-
    larza. Sekcja private przeznaczona jest dla pól i metod widzianych
    jedynie wewnątrz klasy.
    Oprócz wymienionych elementów, definicja klasy może posiadać jesz-
    cze sekcje protected oraz __published. W części protected można defi-
    niować pola i metody widoczne dla macierzystej klasy i klas po niej
    dziedziczących. Deklaracje zawarte w sekcji __published (publikowanej)
    pełnią taką samą rolę, jak deklaracje umieszczone w sekcji public (pu-
    blicznej). Różnica pomiędzy nimi polega na tym, iż te pierwsze nie
    tworzą tzw. informacji czasu wykonania. Do zagadnień tych powróci-
    my w dalszej części Ćwiczeń.


    Własności
    Własności pozwalają użytkownikowi na uzyskiwanie dostępu do ele-
    mentów komponentów biblioteki VCL oraz na modyfikację niektórych
    ich atrybutów.

Ć W I C Z E N I E

     4.1            Poznawanie Inspektora obiektów
                    — podstawowe operacje na formularzu

    Kliknijmy zakładkę Design i przejdźmy do Inspektora obiektów. Roz-
    miary formularza ustalimy, korzystając z jego własności Height (wy-
    sokość) i Width (szerokość), znajdujących się w karcie właściwości
    (Properties) Inspektora obiektów, w zakładce Layout (rysunek 4.3). Jeżeli
    chcemy, aby po uruchomieniu formularz nie „rozpływał” się po ekra-
    nie w odpowiedzi na kliknięcie pola maksymalizacji, w Inspektorze
Rozdział 4. • Środowisko programisty IDE C++Builder 2006   97

       Rysunek 4.3.
       Zakładka Layout
       Inspektora
       obiektów




    obiektów rozwińmy własność Constraints (ograniczenie) i we właściwe
    miejsca MaxHight oraz MaxWidth wpiszmy żądane rozmiary formularza
    (w pikselach).
    Przejdźmy następnie do własności Position (zakładka Miscellaneous)
    i wybierzmy poScreenCenter (rysunek 4.4). Wybrane przypisanie spo-
    woduje, że w momencie uruchomienia aplikacji formularz pozosta-
    nie w centrum ekranu (ale nie pulpitu poDesktopCenter) — jeżeli oczywi-
    ście w Inspektorze obiektów, w zakładce Layout, własności Align
    (zakotwiczenie) nie ustawiliśmy inaczej niż w pozycji alNone (patrz
    rysunek 4.3).
Ć W I C Z E N I E

     4.2            Alternatywny sposób ustalania położenia formularza
                    działającej aplikacji

    Warto pamiętać, iż graficzny interfejs użytkownika C++Buildera 2006
    został wyposażony w element umożliwiający określenie (w czasie pro-
    jektowania) położenia na ekranie formularza uruchomionej aplikacji,
    bez konieczności posługiwania się Inspektorem obiektów. Mianowicie,
    w prawym dolnym rogu centralnej części GUI znajduje się niewielki
    piktogram Form Screen Position (rysunek 4.5), za którego pomocą moż-
    na w przybliżeniu ustalić położenie formularza działającej aplikacji.
98                    C++Builder 2006. Ćwiczenia praktyczne

       Rysunek 4.4.
       Zakładka
       Miscellaneous




       Rysunek 4.5.
       Określanie
       położenia
       formularza
       uruchomionego
       programu


    Zdarzenia
    Zdarzenia (ang. event) powodują występowanie zmian stanu obiektu
    i są źródłem odpowiednich komunikatów, przekazywanych do aplika-
    cji lub bezpośrednio do systemu. Reakcja obiektu na wystąpienie zda-
    rzenia udostępniana jest aplikacji poprzez funkcję obsługi zdarzeń (ang.
    event function) będącą wydzieloną częścią kodu. Rolę zdarzeń w apli-
    kacji najlepiej jest prześledzić, wykonując praktyczne ćwiczenie.

Ć W I C Z E N I E

     4.3            Programowanie zdarzenia OnClose

    Może również zdarzyć się sytuacja, w której zechcemy zamknąć for-
    mularz, korzystając bezpośrednio z jego pola zamknięcia. Aby mieć
    pewność, że w momencie zamknięcia aplikacji wszystkie jej zasoby
    zostaną prawidłowo zwolnione, skorzystamy ze zdarzenia OnClose.
Rozdział 4. • Środowisko programisty IDE C++Builder 2006   99

W celu zaprogramowania obsługi wybranego zdarzenia przejdźmy do
karty zdarzeń (Events) Inspektora obiektów. Zdarzenie OnClose określ-
my jako FormClose (rysunek 4.6) i potwierdźmy klawiszem Enter lub
podwójnym kliknięciem myszy.

 Rysunek 4.6.
 Zakładka Visual
 w karcie zdarzeń
 Inspektora
 obiektów




W ten sposób Builder automatycznie wygeneruje funkcję obsługi zda-
rzenia:
    void __fastcall TForm1::FormClose(TObject *Sender,
                                      TCloseAction &Action)

Zmiennej Action (akcja) można przypisać jeden z elementów typu wy-
liczeniowego:
    enum TCloseAction {caNone, caHide, caFree, caMinimize};

gdzie:
 q caNone oznacza, że formularz nie zostanie zamknięty;
 q caHide oznacza, że formularz nie zostanie zamknięty, lecz ukryty;
 q caFree oznacza, że formularz zostanie zamknięty z jednoczesnym
   zwolnieniem wszystkich zasobów pamięci, z których aktualnie
   korzysta;
 q caMinimize oznacza, że formularz zostanie zminimalizowany.
100                        C++Builder 2006. Ćwiczenia praktyczne

    Funkcję obsługi zdarzenia FormClose() wypełnimy następującym kodem:
            //---------------------------------------------------------
            void __fastcall TForm1::FormClose(TObject *Sender,
                                                               TCloseAction &Action)
            {
               switch (MessageBox(0, "Zamknięcie aplikacji ?","Uwaga",
                     MB_YESNOCANCEL || MB_ICON UESTION)) {
                  case ID_YES:
                     Action = caFree;
                  break;
                  case ID_CANCEL:
                     Action = caNone;
                  break;
               }

            }
            //---------------------------------------------------------



                Użycie w deklaracji funkcji konwencji __fastcall powoduje,
                że trzy pierwsze parametry funkcji mogą być umieszczane w rejestrach
                procesora. Rejestry nie będą używane, jeżeli parametrami funkcji będą
                dane zmiennopozycyjne lub struktury. Parametry tego typu odkładane
                są na stosie.

Ć W I C Z E N I E

     4.4            Programowanie zdarzenia OnCloseQuery

    Odmianą OnClose jest zdarzenie OnClose uery, które tworzymy, również
    korzystając z karty zdarzeń Inspektora obiektów (rysunek 4.6).
    Funkcję obsługi zdarzenia FormClose uery() wypełnimy następują-
    cym kodem:
            //---------------------------------------------------------
            void __fastcall TForm1::FormClose uery(TObject *Sender,
                                       bool &CanClose)
            {
               TMsgDlgButtons przyciski;
               przyciski <<mbYes <<mbNo <<mbCancel;
               AnsiString bufor = "Zakończyć działanie programu ?";
               switch(MessageDlg(bufor, mtConfirmation,przyciski,0)) {
                 case mrYes:
                     CanClose = true;
                 break;
Rozdział 4. • Środowisko programisty IDE C++Builder 2006       101

                 case mrNo:
                    CanClose = false;
                break;
                 case mrCancel:
                    CanClose = false;
                break;
               }
            }
            //---------------------------------------------------------



                Należy pamiętać, iż jednoczesne używanie w programie dwóch zdarzeń
                typu OnClose nie jest celowe.

Ć W I C Z E N I E

     4.5            Programowanie zdarzeń dla komponentów
                    umieszczanych na formularzu

    Na tak przygotowanym formularzu umieśćmy jeden komponent repre-
    zentujący klasę TButton z zakładki Standard Palety narzędzi. Korzysta-
    jąc z Inspektora obiektów oraz z karty własności, cechy Name (zakładka
    Miscellaneous) oraz Caption (zakładka Visual) przycisku Button1 zmień-
    my odpowiednio na Zamknij oraz &Zamknij (rysunek 4.7). Jeżeli jawnie
    nie zmienimy własności Name komponentu, w kodzie będzie występo-
    wać jego nazwa domyślna (np. Button1).

       Rysunek 4.7.
       Zakładki
       Miscellaneous
       oraz Visual
       karty własności
       Inspektora
       obiektów
102                 C++Builder 2006. Ćwiczenia praktyczne

Znak &, który występuje w opisie przycisku (ale nie w jego nazwie),
spowoduje, że litera występująca bezpośrednio za nim stanowić będzie
klawisz szybkiego dostępu do funkcji obsługi wybranego zdarzenia.
Dla naszego przycisku utworzymy funkcję obsługi odpowiedniego zda-
rzenia. Klikając dwukrotnie przycisk Zamknij lub w widoku struktury
obiektów (Structure) odpowiednio oznaczony komponent, dostaniemy
się do wnętrza właściwej funkcji obsługi zdarzenia:
      void __fastcall TForm1:: ZamknijClick(TObject *Sender)

Już w tym miejscu możemy zauważyć, iż w definicji klasy Builder
wygenerował automatycznie deklarację przycisku oraz deklarację funk-
cji obsługującego go zdarzenia.
Należy zawsze pamiętać, iż szkielety funkcji obsługi odpowiednich
zdarzeń, takich jak ZamknijClick(), zostaną automatycznie wygenero-
wane przez Buildera w odpowiedzi na dwukrotne kliknięcie danego
przycisku. W żadnym wypadku funkcji tych nie należy wpisywać sa-
modzielnie.
Omawianą funkcję obsługi zdarzenia wypełnimy przedstawionym po-
niżej kodem, co spowoduje, że po naciśnięciu wybranego przycisku
aplikacja zostanie zamknięta.
      //---------------------------------------------------------
      void __fastcall TForm1:: ZamknijClick(TObject *Sender)
      {
           Application->Terminate();
      }
      //---------------------------------------------------------




Każdy komponent wykorzystywany w aplikacji posiada dwie podsta-
wowe własności: może być właścicielem (ang. Owner) innych kompo-
nentów lub może być ich rodzicem (ang. Parent). Istnieje subtelna
różnica pomiędzy tymi dwoma pojęciami, z której należy zdawać sobie
sprawę, jeżeli chcemy zrozumieć idee rządzące zasadami programowa-
nia obiektowo-zdarzeniowego.
Rozdział 4. • Środowisko programisty IDE C++Builder 2006   103

Wykorzystując graficzny interfejs użytkownika GUI (ang. Graphical
User Interface), budujemy aplikacje, których głównym elementem jest
formularz. Formularz jest właścicielem komponentów, które na nim
umieszczamy. Jako przykład rozpatrzmy komponent CheckBox1, repre-
zentujący klasę TCheckBox i znajdujący się w obszarze określonym przez
reprezentanta klasy TGroupBox. Jeżeli zechcemy teraz dowolnie zmie-
nić położenie CheckBox1, napotkamy pewne trudności — nie będziemy
mogli przesunąć go poza GroupBox1. Mówimy, że GroupBox1, czyli re-
prezentant klasy TGroupBox, stał się rodzicem dla CheckBox1 reprezentu-
jącego klasę TCheckBox. Aby przeanalizować przykład hierarchii własno-
ści, można sprawdzić, kto jest właścicielem formularza. W tym celu
wystarczy zaprojektować nowe zdarzenie (lub wykorzystać istniejące)
oraz odpowiednio wykorzystać funkcję ClassName() zwracającą łańcuch
znaków określający nazwę odpowiedniego egzemplarza klasy.
Pisząc:
    ShowMessage(Form1->Owner->ClassName());

przekonamy się, że właścicielem formularza jest aplikacja. Jeżeli na-
tomiast chcielibyśmy sprawdzić w ten sposób, czy formularz ma ro-
dzica, wygenerujemy po prostu wyjątek. Formularz w prostej linii nie
posiada rodzica. Następnie napiszmy:
    ShowMessage(GroupBox1->Owner->ClassName());
    ShowMessage(GroupBox1->Parent->ClassName());

Pojawiający się komunikat nie pozostawia cienia wątpliwości: zarów-
no właścicielem, jak i rodzicem komponentu GroupBox1 umieszczonego
bezpośrednio na formularzu jest TForm1. Przechodząc dalej, sprawdzi-
my cechy własności komponentu CheckBox1:
    ShowMessage(CheckBox1->Parent->ClassName());

Stwierdzimy, że jego rodzicem jest klasa TGroupBox, zaś właścicielem:
    ShowMessage(CheckBox1->Owner->ClassName());

Pozostanie dalej formularz, czyli TForm1.
Zdarzają się sytuacje, kiedy potrzebujemy, nawet w trakcie działania
aplikacji, zmienić położenie jakiegoś komponentu umieszczonego
uprzednio w obszarze takim jak TGroupBox czy TPanel. Aby to zrobić,
wystarczy pamiętać o omówionych relacjach własności. Jeżeli chce-
my, by np. CheckBox1 znalazł się bezpośrednio w innym miejscu for-
mularza, wystarczy przypisać mu Form1 jako rodzica, a następnie podać
nowe współrzędne:
104                   C++Builder 2006. Ćwiczenia praktyczne

            CheckBox1->Parent = Form1;
            CheckBox1->Top = 20;
            CheckBox1->Left = C0;

                Należy rozróżniać pojęcia właściciela (Owner) i rodzica (Parent). Rodzic
                nie jest tożsamy z właścicielem. Właściciela określa się tylko raz, podczas
                wywoływania jego konstruktora, i nie można już go zmienić bez zniszczenia
                obiektu. Rodzica obiektu możemy natomiast zmienić zawsze.




    Formularz w momencie zamknięcia automatycznie (dzięki pewnym
    mechanizmom) niszczy umieszczone w jego obrębie komponenty. Ten
    sposób zwalniania komponentów nie ma oczywiście zastosowania
    w przypadku, gdy obiekty tworzymy dynamicznie za pomocą ich kon-
    struktorów i operatora new. W takiej sytuacji obowiązkiem programi-
    sty jest jawne zwolnienie odpowiedniego wskaźnika za pomocą ope-
    ratora delete.
    Treść Ćwiczenia 4.6 obrazuje jeden ze sposobów samodzielnego two-
    rzenia deklaracji obiektu oraz funkcji obsługi generowanego przez ten
    obiekt zdarzenia.

                Jeżeli zdecydujemy się tworzyć komponenty dynamicznie, to wskaźniki
                do klas, w których są one wyrażane, nie mogą być umieszczane w sekcji
                __published deklaracji klasy formularza. Nie można też korzystać z usług
                Inspektora obiektów. Wszystkie własności i zdarzenia należy programować
                samodzielnie.

Ć W I C Z E N I E

     4.6            Dynamiczne umieszczanie komponentów na formularzu

    Na listingach 4.1 oraz 4.2 zaprezentowano jeden ze sposobów dyna-
    micznego konstruowania wraz z dołączaniem przykładowego zdarze-
    nia OnClick do dynamicznie tworzonego obiektu myButton klasy TButton.
    Przycisk tworzony jest w ciele konstruktora klasy TForm1.
Rozdział 4. • Środowisko programisty IDE C++Builder 2006         105

Listing 4.1. Klasa TForm1 z deklaracją obiektu myButton z klasy TButton
oraz funkcją obsługi zdarzenia myButtonClick()
     #ifndef Unit_R4_CH
     #define Unit_R4_CH
     #include <Classes.hpp>
     #include <Controls.hpp>
     #include <StdCtrls.hpp>
     #include <Forms.hpp>
     //---------------------------------------------------------
     class TForm1 : public TForm
     {
     __published:            // IDE-managed Components
          void __fastcall FormClose(TObject *Sender,
                                                 TCloseAction &Action);
          void __fastcall FormDestroy(TObject *Sender);
     private:                // User declarations
          TButton *myButton;
          void __fastcall myButtonClick(TObject *Sender);
     public:                 // User declarations
          __fastcall TForm1(TComponent* Owner);
     };
     //---------------------------------------------------------
     extern PACeAGE TForm1 *Form1;
     //---------------------------------------------------------
     #endif


Listing 4.2. Implementacja komponentu oraz funkcji obsługi generowanego
przez ten komponent zdarzenia
     #include <vcl.h>
     #pragma hdrstop
     #include "Unit_R4_C.h"
     #pragma package(smart_init)
     #pragma resource "*.dfm"
     TForm1 *Form1;
     //---------------------------------------------------------
     __fastcall TForm1::TForm1(TComponent* Owner)
          : TForm(Owner)
     {
        // utworzenie obiektu myButton
        myButton = new TButton(Form1);
        myButton->Parent = Form1;
        // opisanie myButton na formularzu
        myButton->Caption = "myButton";
        myButton->Top = 100;
        myButton->Left = 100;
        // przypisanie zdarzeniu OnClick odpowiedniej funkcji
        // obsługi zdarzenia
        myButton->OnClick = myButtonClick;
106                   C++Builder 2006. Ćwiczenia praktyczne

            }
            //---------------------------------------------------------
            void __fastcall TForm1::myButtonClick(TObject *Sender)
            {
               // ciało funkcji obsługi zdarzenia
               ShowMessage("Przycisk stworzony dynamicznie"
                             " wywołał funkcję obsługi zdarzenia");
            }
            //---------------------------------------------------------
            void __fastcall TForm1::FormClose(TObject *Sender,
                                      TCloseAction &Action)
            {
               switch (MessageBox(0, "Zamknięcie aplikacji ?","Uwaga",
                      MB_YESNOCANCEL || MB_ICON UESTION)) {
                   case ID_YES:
                      Action = caFree;
                   break;
                   case ID_CANCEL:
                      Action = caNone;
                   break;
               }
            }
            //---------------------------------------------------------
            void __fastcall TForm1::FormDestroy(TObject *Sender)
            {
                 // usunięcie obiektu myButton w momencie zamknięcia
                 // formularza
                 delete myButton;
            }
            //---------------------------------------------------------


    W momencie niszczenia formularza wywoływana jest funkcja obsługi
    zdarzenia FormDestroy(), w której obiekt reprezentujący przycisk jest
    automatycznie niszczony. Zdarzenie OnDestroy dostępne jest w karcie
    zdarzeń Inspektora obiektów, w zakładce Miscellaneous.

Ć W I C Z E N I E

     4.7            Wielokrotne dynamiczne tworzenie
                    i usuwanie komponentów

    W poprzednim ćwiczeniu omówiono jedną z metod dynamicznego
    tworzenia komponentów. Komponent tworzony był w konstruktorze
    klasy formularza (wywoływanego tylko raz), dlatego też w takich sy-
    tuacjach nie mamy możliwości wielokrotnego tworzenia i niszczenia
Rozdział 4. • Środowisko programisty IDE C++Builder 2006         107

wybranego komponentu. Na listingach 4.3 i 4.4 zaprezentowano je-
den ze sposobów wielokrotnego tworzenia i niszczenia komponentu
w trakcie działania aplikacji. Nowy komponent edycyjny tworzony
jest w funkcji obsługi zdarzenia generowanego przez przycisk umiesz-
czony na formularzu w sposób standardowy.

Listing 4.3. Klasa TForm1 z deklaracją obiektu myEdit z klasy TEdit
oraz funkcją obsługi zdarzenia myEditChange()
     #ifndef Unit_R4_6H
     #define Unit_R4_6H
     #include <Classes.hpp>
     #include <Controls.hpp>
     #include <StdCtrls.hpp>
     #include <Forms.hpp>
     //---------------------------------------------------------
     class TForm1 : public TForm
     {
     __published:            // IDE-managed Components
          TButton *Button1;
          TButton *Button2;
          void __fastcall FormClose(TObject *Sender,
                            TCloseAction &Action);
          void __fastcall FormDestroy(TObject *Sender);
          void __fastcall Button1Click(TObject *Sender);
          void __fastcall Button2Click(TObject *Sender);
     private:                // User declarations
          TEdit *myEdit;
          void __fastcall myEditChange(TObject *Sender);
     public:                 // User declarations
          __fastcall TForm1(TComponent* Owner);
     };
     //---------------------------------------------------------
     extern PACeAGE TForm1 *Form1;
     //---------------------------------------------------------
     #endif


Listing 4.4. Implementacja komponentu oraz funkcji obsługi generowanego
przezeń zdarzenia
     #include <vcl.h>
     #pragma hdrstop
     #include "Unit_R4_6.h"
     #pragma package(smart_init)
     #pragma resource "*.dfm"
     TForm1 *Form1;
     //---------------------------------------------------------
108                C++Builder 2006. Ćwiczenia praktyczne

      __fastcall TForm1::TForm1(TComponent* Owner)
           : TForm(Owner)
      {
      }
      //---------------------------------------------------------
      void __fastcall TForm1::Button1Click(TObject *Sender)
      {
         if(myEdit == NULL) {
           // utworzenie obiektu myEdit
           myEdit = new TEdit(Form1);
           myEdit->Parent = Form1;
           // opisanie myEdit na formularzu
           myEdit->Width = 300;
           myEdit->Text = "Nowy komponent edycyjny. Wpisz tekst...";
           myEdit->Top = 100;
           myEdit->Left = 100;
           // przypisanie zdarzeniu OnChange odpowiedniej funkcji
           // obsługi zdarzenia
           myEdit->OnChange = myEditChange;
         }
      }
      //---------------------------------------------------------
      void __fastcall TForm1::myEditChange(TObject *Sender)
      {
         Button2->Caption = " Naci=nij aby zniszczyz komponent Edit";
      }
      //---------------------------------------------------------
      void __fastcall TForm1::Button2Click(TObject *Sender)
      {
           // niszczy komponent
           delete myEdit;
           // przypisuje myEdit wskaźnik pusty
           myEdit = NULL;
           // zmienia opis komponentu Button2
           Button2->Caption = "Button2";
      }
      //---------------------------------------------------------
      void __fastcall TForm1::FormClose(TObject *Sender,
                                TCloseAction &Action)
      {
         switch (MessageBox(0, "ZamkniMcie aplikacji ?","Uwaga",
                MB_YESNOCANCEL || MB_ICON UESTION)) {
             case ID_YES:
                Action = caFree;
             break;
             case ID_CANCEL:
                Action = caNone;
             break;
         }
      }
Rozdział 4. • Środowisko programisty IDE C++Builder 2006   109
            //---------------------------------------------------------
            void __fastcall TForm1::FormDestroy(TObject *Sender)
            {
                 // usunięcie obiektu myEdit w momencie zamknięcia
                 // formularza
                 if(myEdit != NULL)
                   delete myEdit;
            }
            //---------------------------------------------------------




    Zapoznamy się teraz z jedną z metod umieszczania w programie pi-
    sanym w C++Builderze własnej funkcji. W tym celu wykorzystamy,
    skonstruowaną wcześniej, funkcję obliczającą kolejne potęgi liczby 2
    (zobacz ćwiczenia 3.17 i 3.18). Formularz projektu naszej aplikacji
    składać się będzie z dwóch przycisków Button1 oraz Button2, repre-
    zentujących klasę TButton. Wykorzystamy też komponent edycyjny
    z klasy TMemo. Samodzielnie napisaną funkcję możemy umieszczać
    w kodzie źródłowym aplikacji na parę sposobów.

Ć W I C Z E N I E

     4.8            Definicja funkcji umieszczana poza klasą formularza

    Definicję funkcji umieszczamy w sposób najprostszy z możliwych:
            TForm1 *Form1;
            ...
            int power(int x, int y)       // definicja funkcji power
            {
              int z = 1, i;
              for(i = 1; i <= y; i++)
                 z = z * x;
              return z;
            }

    Wywołanie funkcji następuje w kontekście obsługi danego zdarze-
    nia i nie różni się niczym od jej wywołania stosowanego w „tradycyj-
    nym” C++.

Mais conteúdo relacionado

Semelhante a C++Builder 2006. Ćwiczenia praktyczne

C++. Zaawansowane programowanie
C++. Zaawansowane programowanieC++. Zaawansowane programowanie
C++. Zaawansowane programowanieWydawnictwo Helion
 
Aplikacje w Visual C++ 2005. Przykłady
Aplikacje w Visual C++ 2005. PrzykładyAplikacje w Visual C++ 2005. Przykłady
Aplikacje w Visual C++ 2005. PrzykładyWydawnictwo Helion
 
C++Builder. Kompendium programisty
C++Builder. Kompendium programistyC++Builder. Kompendium programisty
C++Builder. Kompendium programistyWydawnictwo Helion
 
Visual C++ 2005 Express Edition. Tworzenie aplikacji dla Windows
Visual C++ 2005 Express Edition. Tworzenie aplikacji dla WindowsVisual C++ 2005 Express Edition. Tworzenie aplikacji dla Windows
Visual C++ 2005 Express Edition. Tworzenie aplikacji dla WindowsWydawnictwo Helion
 
Visual C# 2008. Projektowanie aplikacji. Pierwsze starcie
Visual C# 2008. Projektowanie aplikacji. Pierwsze starcieVisual C# 2008. Projektowanie aplikacji. Pierwsze starcie
Visual C# 2008. Projektowanie aplikacji. Pierwsze starcieWydawnictwo Helion
 
Visual C# 2005. Zapiski programisty
Visual C# 2005. Zapiski programistyVisual C# 2005. Zapiski programisty
Visual C# 2005. Zapiski programistyWydawnictwo Helion
 
Wstęp do programowania w języku C#
Wstęp do programowania w języku C#Wstęp do programowania w języku C#
Wstęp do programowania w języku C#Wydawnictwo Helion
 
C++. Inżynieria programowania
C++. Inżynieria programowaniaC++. Inżynieria programowania
C++. Inżynieria programowaniaWydawnictwo Helion
 
C++. Styl i technika zaawansowanego programowania
C++. Styl i technika zaawansowanego programowaniaC++. Styl i technika zaawansowanego programowania
C++. Styl i technika zaawansowanego programowaniaWydawnictwo Helion
 
Język C++. Gotowe rozwiązania dla programistów
Język C++. Gotowe rozwiązania dla programistówJęzyk C++. Gotowe rozwiązania dla programistów
Język C++. Gotowe rozwiązania dla programistówWydawnictwo Helion
 
C++. Programowanie zorientowane obiektowo. Vademecum profesjonalisty
C++. Programowanie zorientowane obiektowo. Vademecum profesjonalistyC++. Programowanie zorientowane obiektowo. Vademecum profesjonalisty
C++. Programowanie zorientowane obiektowo. Vademecum profesjonalistyWydawnictwo Helion
 
Visual Basic 2005. Wprowadzenie do programowania w .NET
Visual Basic 2005. Wprowadzenie do programowania w .NETVisual Basic 2005. Wprowadzenie do programowania w .NET
Visual Basic 2005. Wprowadzenie do programowania w .NETWydawnictwo Helion
 
.NET Framework 2.0. Zaawansowane programowanie
.NET Framework 2.0. Zaawansowane programowanie.NET Framework 2.0. Zaawansowane programowanie
.NET Framework 2.0. Zaawansowane programowanieWydawnictwo Helion
 
Visual Basic 2005. Zapiski programisty
Visual Basic 2005. Zapiski programistyVisual Basic 2005. Zapiski programisty
Visual Basic 2005. Zapiski programistyWydawnictwo Helion
 
RS 232C - praktyczne programowanie. Od Pascala i C++ do Delphi i Buildera. Wy...
RS 232C - praktyczne programowanie. Od Pascala i C++ do Delphi i Buildera. Wy...RS 232C - praktyczne programowanie. Od Pascala i C++ do Delphi i Buildera. Wy...
RS 232C - praktyczne programowanie. Od Pascala i C++ do Delphi i Buildera. Wy...Wydawnictwo Helion
 
C++. Kruczki i fortele w programowaniu
C++. Kruczki i fortele w programowaniuC++. Kruczki i fortele w programowaniu
C++. Kruczki i fortele w programowaniuWydawnictwo Helion
 

Semelhante a C++Builder 2006. Ćwiczenia praktyczne (20)

C++. Zaawansowane programowanie
C++. Zaawansowane programowanieC++. Zaawansowane programowanie
C++. Zaawansowane programowanie
 
Aplikacje w Visual C++ 2005. Przykłady
Aplikacje w Visual C++ 2005. PrzykładyAplikacje w Visual C++ 2005. Przykłady
Aplikacje w Visual C++ 2005. Przykłady
 
C# i .NET
C# i .NETC# i .NET
C# i .NET
 
C++Builder. Kompendium programisty
C++Builder. Kompendium programistyC++Builder. Kompendium programisty
C++Builder. Kompendium programisty
 
Visual C++ 2005 Express Edition. Tworzenie aplikacji dla Windows
Visual C++ 2005 Express Edition. Tworzenie aplikacji dla WindowsVisual C++ 2005 Express Edition. Tworzenie aplikacji dla Windows
Visual C++ 2005 Express Edition. Tworzenie aplikacji dla Windows
 
Visual C# 2008. Projektowanie aplikacji. Pierwsze starcie
Visual C# 2008. Projektowanie aplikacji. Pierwsze starcieVisual C# 2008. Projektowanie aplikacji. Pierwsze starcie
Visual C# 2008. Projektowanie aplikacji. Pierwsze starcie
 
C# i ASP.NET. Szybki start
C# i ASP.NET. Szybki startC# i ASP.NET. Szybki start
C# i ASP.NET. Szybki start
 
Visual C# 2005. Zapiski programisty
Visual C# 2005. Zapiski programistyVisual C# 2005. Zapiski programisty
Visual C# 2005. Zapiski programisty
 
C++Builder 6 i bazy danych
C++Builder 6 i bazy danychC++Builder 6 i bazy danych
C++Builder 6 i bazy danych
 
Wstęp do programowania w języku C#
Wstęp do programowania w języku C#Wstęp do programowania w języku C#
Wstęp do programowania w języku C#
 
C++. Inżynieria programowania
C++. Inżynieria programowaniaC++. Inżynieria programowania
C++. Inżynieria programowania
 
C++. Styl i technika zaawansowanego programowania
C++. Styl i technika zaawansowanego programowaniaC++. Styl i technika zaawansowanego programowania
C++. Styl i technika zaawansowanego programowania
 
Język C++. Gotowe rozwiązania dla programistów
Język C++. Gotowe rozwiązania dla programistówJęzyk C++. Gotowe rozwiązania dla programistów
Język C++. Gotowe rozwiązania dla programistów
 
C++. Programowanie zorientowane obiektowo. Vademecum profesjonalisty
C++. Programowanie zorientowane obiektowo. Vademecum profesjonalistyC++. Programowanie zorientowane obiektowo. Vademecum profesjonalisty
C++. Programowanie zorientowane obiektowo. Vademecum profesjonalisty
 
Visual Basic 2005. Wprowadzenie do programowania w .NET
Visual Basic 2005. Wprowadzenie do programowania w .NETVisual Basic 2005. Wprowadzenie do programowania w .NET
Visual Basic 2005. Wprowadzenie do programowania w .NET
 
.NET Framework 2.0. Zaawansowane programowanie
.NET Framework 2.0. Zaawansowane programowanie.NET Framework 2.0. Zaawansowane programowanie
.NET Framework 2.0. Zaawansowane programowanie
 
Visual Basic 2005. Zapiski programisty
Visual Basic 2005. Zapiski programistyVisual Basic 2005. Zapiski programisty
Visual Basic 2005. Zapiski programisty
 
RS 232C - praktyczne programowanie. Od Pascala i C++ do Delphi i Buildera. Wy...
RS 232C - praktyczne programowanie. Od Pascala i C++ do Delphi i Buildera. Wy...RS 232C - praktyczne programowanie. Od Pascala i C++ do Delphi i Buildera. Wy...
RS 232C - praktyczne programowanie. Od Pascala i C++ do Delphi i Buildera. Wy...
 
C++BuilderX. Ćwiczenia
C++BuilderX. ĆwiczeniaC++BuilderX. Ćwiczenia
C++BuilderX. Ćwiczenia
 
C++. Kruczki i fortele w programowaniu
C++. Kruczki i fortele w programowaniuC++. Kruczki i fortele w programowaniu
C++. Kruczki i fortele w programowaniu
 

Mais de Wydawnictwo Helion

Tworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. ProjektyTworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. ProjektyWydawnictwo Helion
 
Blog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnikBlog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnikWydawnictwo Helion
 
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktycznePozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczneWydawnictwo Helion
 
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesieE-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesieWydawnictwo Helion
 
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsMicrosoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsWydawnictwo Helion
 
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IICo potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IIWydawnictwo Helion
 
Makrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuMakrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuWydawnictwo Helion
 
Java. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIJava. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIWydawnictwo Helion
 
Ajax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny treningAjax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny treningWydawnictwo Helion
 
PowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykPowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykWydawnictwo Helion
 
Serwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaSerwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaWydawnictwo Helion
 

Mais de Wydawnictwo Helion (20)

Tworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. ProjektyTworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. Projekty
 
Blog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnikBlog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnik
 
Access w biurze i nie tylko
Access w biurze i nie tylkoAccess w biurze i nie tylko
Access w biurze i nie tylko
 
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktycznePozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
 
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesieE-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesie
 
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsMicrosoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
 
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IICo potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
 
Makrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuMakrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółu
 
Windows PowerShell. Podstawy
Windows PowerShell. PodstawyWindows PowerShell. Podstawy
Windows PowerShell. Podstawy
 
Java. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIJava. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie II
 
JavaScript. Pierwsze starcie
JavaScript. Pierwsze starcieJavaScript. Pierwsze starcie
JavaScript. Pierwsze starcie
 
Ajax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny treningAjax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny trening
 
PowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykPowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktyk
 
Excel 2007 PL. Seria praktyk
Excel 2007 PL. Seria praktykExcel 2007 PL. Seria praktyk
Excel 2007 PL. Seria praktyk
 
Access 2007 PL. Seria praktyk
Access 2007 PL. Seria praktykAccess 2007 PL. Seria praktyk
Access 2007 PL. Seria praktyk
 
Word 2007 PL. Seria praktyk
Word 2007 PL. Seria praktykWord 2007 PL. Seria praktyk
Word 2007 PL. Seria praktyk
 
Serwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaSerwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacja
 
AutoCAD 2008 i 2008 PL
AutoCAD 2008 i 2008 PLAutoCAD 2008 i 2008 PL
AutoCAD 2008 i 2008 PL
 
Bazy danych. Pierwsze starcie
Bazy danych. Pierwsze starcieBazy danych. Pierwsze starcie
Bazy danych. Pierwsze starcie
 
Inventor. Pierwsze kroki
Inventor. Pierwsze krokiInventor. Pierwsze kroki
Inventor. Pierwsze kroki
 

C++Builder 2006. Ćwiczenia praktyczne

  • 1. IDZ DO PRZYK£ADOWY ROZDZIA£ SPIS TREŒCI C++Builder 2006. Æwiczenia praktyczne KATALOG KSI¥¯EK Autor: Andrzej Daniluk ISBN: 83-246-0518-5 KATALOG ONLINE Format: A5, stron: 192 Przyk³ady na ftp: 436 kB ZAMÓW DRUKOWANY KATALOG TWÓJ KOSZYK DODAJ DO KOSZYKA Poznaj œwiat profesjonalnego programowania C++Builder 2006 to œrodowisko programistyczne pozwalaj¹ce na wizualne tworzenie CENNIK I INFORMACJE aplikacji. Dziêki gotowym komponentom programista mo¿e skupiæ siê na tym, co najwa¿niejsze — na pisaniu kodu. Za pomoc¹ C++Buildera bez problemu stworzy ZAMÓW INFORMACJE zarówno niewielk¹ aplikacjê konsolow¹, jak i ogromny system informatyczny. Jednak O NOWOŒCIACH ka¿da wielka podró¿, równie¿ ta w œwiat programowania, zaczyna siê od ma³ego kroku. Dziêki ksi¹¿ce „C++Builder 2006. Æwiczenia praktyczne” uczynisz ten w³aœnie pierwszy ZAMÓW CENNIK krok. Poznasz œrodowisko C++Builder 2006 i podstawy jêzyka C++. Przeczytasz o programowaniu obiektowym i obs³udze zdarzeñ. Wykonuj¹c kolejne æwiczenia, dowiesz siê, jak korzystaæ z udostêpnianych komponentów i kontrolowaæ ich parametry. CZYTELNIA Wykorzystasz równie¿ oferowane przez C++Buildera narzêdzia i stworzysz w³asne aplikacje. FRAGMENTY KSI¥¯EK ONLINE • Elementy œrodowiska C++Builder 2006 • Tworzenie aplikacji konsolowych • Podstawowe elementy jêzyka C++ • Klasy i obiekty • Projektowanie formularzy • Korzystanie z komponentów VCL • Projektowanie aplikacji z wykorzystaniem elementów biblioteki VCL Wydawnictwo Helion ul. Chopina 6 44-100 Gliwice tel. (32)230-98-63 e-mail: helion@helion.pl
  • 2. Wprowadzenie 5 Rozdział 1. Środowisko programisty IDE C++Builder 2006 7 Struktura głównego menu 10 Pasek narzędzi — Speed Bar 38 Inspektor obiektów — Object Inspector 39 Widok struktury obiektów 41 Podsumowanie 41 Rozdział 2. C++Builder 2006. Pierwsze kroki 43 Ogólna postać programu pisanego w C++ 43 Podsumowanie 55 Rozdział 3. Elementarz C++ 57 Operatory 57 Podstawowe proste typy całkowite i rzeczywiste 61 Typ Currency 63 Typ void 63 Typy logiczne 64 Typy znakowe 64 Typy łańcuchowe 65 Modyfikator dostępu const 67 Typ wyliczeniowy 67 Deklarowanie tablic 68 Struktury 70 Instrukcje sterujące przebiegiem programu 71 Wskazania i adresy 82
  • 3. 4 C++Builder 2006. Ćwiczenia praktyczne Funkcje w C++ 83 Klasy w C++ 86 Operatory new i delete 90 Podsumowanie 92 Rozdział 4. Środowisko programisty IDE C++Builder 2006 93 Ogólna postać programu środowiska graficznego pisanego w C++Builderze 2006 93 Hierarchia własności komponentów VCL 102 Dynamiczne tworzenie komponentów zarejestrowanych w bibliotece VCL 104 Wykorzystujemy własną funkcję 109 Wykorzystujemy własną klasę 111 Składniki projektu tworzonego w środowisku graficznym 116 Podsumowanie 118 Rozdział 5. Podstawowe elementy biblioteki VCL 119 Hierarchia komponentów VCL 119 Klasa TObject 120 Klasa TComponent 120 Klasa TControl 120 Klasa TGraphicControl 129 Klasa TWinControl 130 Podsumowanie 133 Rozdział 6. Paleta narzędzi 135 Podsumowanie 149 Rozdział 7. Techniki projektowania aplikacji w oparciu o elementy biblioteki VCL 151 Podstawowe komponenty zakładki Standard 151 Komponenty z klas TToolBar, TSaveDialog, TOpenDialog, TImageList, TActionList, TRichEdit 166 Komponenty z klasy TButtonGroup 174 Komponenty z klasy TCategoryButtons 178 Komponenty z klas TApplicationEvents i TTimer 183 Podsumowanie 187
  • 4. Rozdział ten poświęcony jest omówieniu praktycznych spo- sobów wykorzystania poznanych wcześniej elementów języ- ka C++ w graficznym środowisku C++Builder 2006. Zapo- znamy się tutaj m. in. z pojęciem formularza oraz funkcji obsługi zda- rzenia. Formularz (ang. form) jest wyświetlanym na ekranie obiektem mogą- cym składać się z wielu pól, które można wypełniać podobnie jak tra- dycyjne dokumenty papierowe. Podczas wprowadzania danych do formularza można je poprawiać, ponieważ każde pole formularza za- chowuje się jak miniaturowy edytor ekranowy.
  • 5. 94 C++Builder 2006. Ćwiczenia praktyczne Formularz Poleceniem menu FileNewOther…VCL Forms Application stwórzmy na pulpicie szablon aplikacji opartej na formularzu. Formularz jest pierwszym obiektem, z którym się spotykamy, rozpoczynając pisanie aplikacji. Po dwukrotnym kliknięciu w obszarze formularza dostajemy się do okna edycji kodu modułu Unit1.cpp, który pokazany jest na ry- sunku 4.1. Rysunek 4.1. Okno edycji kodu głównego modułu aplikacji Jeżeli moduł tworzonego obecnie projektu za pomocą polecenia File Save As… zapisaliśmy jako R4O1Unit_R4_01.cpp, to w tym samym katalogu C++Builder powinien wygenerować plik nagłówkowy Unit_ R4_01.h. C++Builder oferuje nam bardzo wygodny sposób obejrzenia jego zawartości. Korzystając z zakładki noszącej taką samą nazwę jak plik nagłówkowy, zerknijmy do jego wnętrza. Od razu zauważymy, iż zawiera on definicję klasy naszego formularza (rysunek 4.2).
  • 6. Rozdział 4. • Środowisko programisty IDE C++Builder 2006 95 Rysunek 4.2. Zawartość pliku nagłówkowego Unit_R4_01.h zawierającego definicję klasy formularza Przechodzenie pomiędzy plikiem .cpp i powiązanym z nim plikiem nagłówkowym .h możliwe jest również poprzez naciśnięcie kombinacji klawiszy Ctrl+F6. W celu przywołania formularza używamy zakładki Design. Zdefiniowana klasa TForm1 dziedziczy własności bazowej klasy for- mularza TForm, natomiast sam formularz, traktowany jako zmienna obiektowa, deklarowany jest jako: TForm1 *Form1; W definicji klasy formularza możemy zauważyć funkcję: void __fastcall FormCreate(TObject *Sender); Builder odpowiednio inicjuje formularz (tylko jeden raz), kiedy jest on tworzony po raz pierwszy. Sender jest pewnym wskaźnikiem wska- zującym daną typu TObject. W rzeczywistości Sender reprezentuje pewną właściwość, polegającą na tym, iż każdy obiekt łącznie z for- mularzem (oraz każdy obiekt VCL) musi być w pewien sposób poin- formowany o przyszłym przypisaniu mu pewnego zdarzenia (w przy- padku formularza zdarzenie to polega na jego inicjalizacji).
  • 7. 96 C++Builder 2006. Ćwiczenia praktyczne TObject jest bezwzględnym przodkiem wszystkich komponentów oraz klas VCL i umieszczony jest na samym szczycie hierarchii klas. Z rysunku 4.2 możemy odczytać, iż standardowa definicja klasy skła- da się z kilku części. Sekcja public służy do deklarowania funkcji i procedur (czyli metod lub operacji) oraz zmiennych (zwanych po- lami lub atrybutami), które w przyszłości mogą być udostępniane innym. Zasadniczą różnicą pomiędzy metodami a zwykłymi funk- cjami czy procedurami jest to, że każda metoda posiada niejawny pa- rametr this, wskazujący na obiekt będący przedmiotem wywołania tej metody. Sekcję public często nazywamy interfejsem obiektu formu- larza. Sekcja private przeznaczona jest dla pól i metod widzianych jedynie wewnątrz klasy. Oprócz wymienionych elementów, definicja klasy może posiadać jesz- cze sekcje protected oraz __published. W części protected można defi- niować pola i metody widoczne dla macierzystej klasy i klas po niej dziedziczących. Deklaracje zawarte w sekcji __published (publikowanej) pełnią taką samą rolę, jak deklaracje umieszczone w sekcji public (pu- blicznej). Różnica pomiędzy nimi polega na tym, iż te pierwsze nie tworzą tzw. informacji czasu wykonania. Do zagadnień tych powróci- my w dalszej części Ćwiczeń. Własności Własności pozwalają użytkownikowi na uzyskiwanie dostępu do ele- mentów komponentów biblioteki VCL oraz na modyfikację niektórych ich atrybutów. Ć W I C Z E N I E 4.1 Poznawanie Inspektora obiektów — podstawowe operacje na formularzu Kliknijmy zakładkę Design i przejdźmy do Inspektora obiektów. Roz- miary formularza ustalimy, korzystając z jego własności Height (wy- sokość) i Width (szerokość), znajdujących się w karcie właściwości (Properties) Inspektora obiektów, w zakładce Layout (rysunek 4.3). Jeżeli chcemy, aby po uruchomieniu formularz nie „rozpływał” się po ekra- nie w odpowiedzi na kliknięcie pola maksymalizacji, w Inspektorze
  • 8. Rozdział 4. • Środowisko programisty IDE C++Builder 2006 97 Rysunek 4.3. Zakładka Layout Inspektora obiektów obiektów rozwińmy własność Constraints (ograniczenie) i we właściwe miejsca MaxHight oraz MaxWidth wpiszmy żądane rozmiary formularza (w pikselach). Przejdźmy następnie do własności Position (zakładka Miscellaneous) i wybierzmy poScreenCenter (rysunek 4.4). Wybrane przypisanie spo- woduje, że w momencie uruchomienia aplikacji formularz pozosta- nie w centrum ekranu (ale nie pulpitu poDesktopCenter) — jeżeli oczywi- ście w Inspektorze obiektów, w zakładce Layout, własności Align (zakotwiczenie) nie ustawiliśmy inaczej niż w pozycji alNone (patrz rysunek 4.3). Ć W I C Z E N I E 4.2 Alternatywny sposób ustalania położenia formularza działającej aplikacji Warto pamiętać, iż graficzny interfejs użytkownika C++Buildera 2006 został wyposażony w element umożliwiający określenie (w czasie pro- jektowania) położenia na ekranie formularza uruchomionej aplikacji, bez konieczności posługiwania się Inspektorem obiektów. Mianowicie, w prawym dolnym rogu centralnej części GUI znajduje się niewielki piktogram Form Screen Position (rysunek 4.5), za którego pomocą moż- na w przybliżeniu ustalić położenie formularza działającej aplikacji.
  • 9. 98 C++Builder 2006. Ćwiczenia praktyczne Rysunek 4.4. Zakładka Miscellaneous Rysunek 4.5. Określanie położenia formularza uruchomionego programu Zdarzenia Zdarzenia (ang. event) powodują występowanie zmian stanu obiektu i są źródłem odpowiednich komunikatów, przekazywanych do aplika- cji lub bezpośrednio do systemu. Reakcja obiektu na wystąpienie zda- rzenia udostępniana jest aplikacji poprzez funkcję obsługi zdarzeń (ang. event function) będącą wydzieloną częścią kodu. Rolę zdarzeń w apli- kacji najlepiej jest prześledzić, wykonując praktyczne ćwiczenie. Ć W I C Z E N I E 4.3 Programowanie zdarzenia OnClose Może również zdarzyć się sytuacja, w której zechcemy zamknąć for- mularz, korzystając bezpośrednio z jego pola zamknięcia. Aby mieć pewność, że w momencie zamknięcia aplikacji wszystkie jej zasoby zostaną prawidłowo zwolnione, skorzystamy ze zdarzenia OnClose.
  • 10. Rozdział 4. • Środowisko programisty IDE C++Builder 2006 99 W celu zaprogramowania obsługi wybranego zdarzenia przejdźmy do karty zdarzeń (Events) Inspektora obiektów. Zdarzenie OnClose określ- my jako FormClose (rysunek 4.6) i potwierdźmy klawiszem Enter lub podwójnym kliknięciem myszy. Rysunek 4.6. Zakładka Visual w karcie zdarzeń Inspektora obiektów W ten sposób Builder automatycznie wygeneruje funkcję obsługi zda- rzenia: void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action) Zmiennej Action (akcja) można przypisać jeden z elementów typu wy- liczeniowego: enum TCloseAction {caNone, caHide, caFree, caMinimize}; gdzie: q caNone oznacza, że formularz nie zostanie zamknięty; q caHide oznacza, że formularz nie zostanie zamknięty, lecz ukryty; q caFree oznacza, że formularz zostanie zamknięty z jednoczesnym zwolnieniem wszystkich zasobów pamięci, z których aktualnie korzysta; q caMinimize oznacza, że formularz zostanie zminimalizowany.
  • 11. 100 C++Builder 2006. Ćwiczenia praktyczne Funkcję obsługi zdarzenia FormClose() wypełnimy następującym kodem: //--------------------------------------------------------- void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action) { switch (MessageBox(0, "Zamknięcie aplikacji ?","Uwaga", MB_YESNOCANCEL || MB_ICON UESTION)) { case ID_YES: Action = caFree; break; case ID_CANCEL: Action = caNone; break; } } //--------------------------------------------------------- Użycie w deklaracji funkcji konwencji __fastcall powoduje, że trzy pierwsze parametry funkcji mogą być umieszczane w rejestrach procesora. Rejestry nie będą używane, jeżeli parametrami funkcji będą dane zmiennopozycyjne lub struktury. Parametry tego typu odkładane są na stosie. Ć W I C Z E N I E 4.4 Programowanie zdarzenia OnCloseQuery Odmianą OnClose jest zdarzenie OnClose uery, które tworzymy, również korzystając z karty zdarzeń Inspektora obiektów (rysunek 4.6). Funkcję obsługi zdarzenia FormClose uery() wypełnimy następują- cym kodem: //--------------------------------------------------------- void __fastcall TForm1::FormClose uery(TObject *Sender, bool &CanClose) { TMsgDlgButtons przyciski; przyciski <<mbYes <<mbNo <<mbCancel; AnsiString bufor = "Zakończyć działanie programu ?"; switch(MessageDlg(bufor, mtConfirmation,przyciski,0)) { case mrYes: CanClose = true; break;
  • 12. Rozdział 4. • Środowisko programisty IDE C++Builder 2006 101 case mrNo: CanClose = false; break; case mrCancel: CanClose = false; break; } } //--------------------------------------------------------- Należy pamiętać, iż jednoczesne używanie w programie dwóch zdarzeń typu OnClose nie jest celowe. Ć W I C Z E N I E 4.5 Programowanie zdarzeń dla komponentów umieszczanych na formularzu Na tak przygotowanym formularzu umieśćmy jeden komponent repre- zentujący klasę TButton z zakładki Standard Palety narzędzi. Korzysta- jąc z Inspektora obiektów oraz z karty własności, cechy Name (zakładka Miscellaneous) oraz Caption (zakładka Visual) przycisku Button1 zmień- my odpowiednio na Zamknij oraz &Zamknij (rysunek 4.7). Jeżeli jawnie nie zmienimy własności Name komponentu, w kodzie będzie występo- wać jego nazwa domyślna (np. Button1). Rysunek 4.7. Zakładki Miscellaneous oraz Visual karty własności Inspektora obiektów
  • 13. 102 C++Builder 2006. Ćwiczenia praktyczne Znak &, który występuje w opisie przycisku (ale nie w jego nazwie), spowoduje, że litera występująca bezpośrednio za nim stanowić będzie klawisz szybkiego dostępu do funkcji obsługi wybranego zdarzenia. Dla naszego przycisku utworzymy funkcję obsługi odpowiedniego zda- rzenia. Klikając dwukrotnie przycisk Zamknij lub w widoku struktury obiektów (Structure) odpowiednio oznaczony komponent, dostaniemy się do wnętrza właściwej funkcji obsługi zdarzenia: void __fastcall TForm1:: ZamknijClick(TObject *Sender) Już w tym miejscu możemy zauważyć, iż w definicji klasy Builder wygenerował automatycznie deklarację przycisku oraz deklarację funk- cji obsługującego go zdarzenia. Należy zawsze pamiętać, iż szkielety funkcji obsługi odpowiednich zdarzeń, takich jak ZamknijClick(), zostaną automatycznie wygenero- wane przez Buildera w odpowiedzi na dwukrotne kliknięcie danego przycisku. W żadnym wypadku funkcji tych nie należy wpisywać sa- modzielnie. Omawianą funkcję obsługi zdarzenia wypełnimy przedstawionym po- niżej kodem, co spowoduje, że po naciśnięciu wybranego przycisku aplikacja zostanie zamknięta. //--------------------------------------------------------- void __fastcall TForm1:: ZamknijClick(TObject *Sender) { Application->Terminate(); } //--------------------------------------------------------- Każdy komponent wykorzystywany w aplikacji posiada dwie podsta- wowe własności: może być właścicielem (ang. Owner) innych kompo- nentów lub może być ich rodzicem (ang. Parent). Istnieje subtelna różnica pomiędzy tymi dwoma pojęciami, z której należy zdawać sobie sprawę, jeżeli chcemy zrozumieć idee rządzące zasadami programowa- nia obiektowo-zdarzeniowego.
  • 14. Rozdział 4. • Środowisko programisty IDE C++Builder 2006 103 Wykorzystując graficzny interfejs użytkownika GUI (ang. Graphical User Interface), budujemy aplikacje, których głównym elementem jest formularz. Formularz jest właścicielem komponentów, które na nim umieszczamy. Jako przykład rozpatrzmy komponent CheckBox1, repre- zentujący klasę TCheckBox i znajdujący się w obszarze określonym przez reprezentanta klasy TGroupBox. Jeżeli zechcemy teraz dowolnie zmie- nić położenie CheckBox1, napotkamy pewne trudności — nie będziemy mogli przesunąć go poza GroupBox1. Mówimy, że GroupBox1, czyli re- prezentant klasy TGroupBox, stał się rodzicem dla CheckBox1 reprezentu- jącego klasę TCheckBox. Aby przeanalizować przykład hierarchii własno- ści, można sprawdzić, kto jest właścicielem formularza. W tym celu wystarczy zaprojektować nowe zdarzenie (lub wykorzystać istniejące) oraz odpowiednio wykorzystać funkcję ClassName() zwracającą łańcuch znaków określający nazwę odpowiedniego egzemplarza klasy. Pisząc: ShowMessage(Form1->Owner->ClassName()); przekonamy się, że właścicielem formularza jest aplikacja. Jeżeli na- tomiast chcielibyśmy sprawdzić w ten sposób, czy formularz ma ro- dzica, wygenerujemy po prostu wyjątek. Formularz w prostej linii nie posiada rodzica. Następnie napiszmy: ShowMessage(GroupBox1->Owner->ClassName()); ShowMessage(GroupBox1->Parent->ClassName()); Pojawiający się komunikat nie pozostawia cienia wątpliwości: zarów- no właścicielem, jak i rodzicem komponentu GroupBox1 umieszczonego bezpośrednio na formularzu jest TForm1. Przechodząc dalej, sprawdzi- my cechy własności komponentu CheckBox1: ShowMessage(CheckBox1->Parent->ClassName()); Stwierdzimy, że jego rodzicem jest klasa TGroupBox, zaś właścicielem: ShowMessage(CheckBox1->Owner->ClassName()); Pozostanie dalej formularz, czyli TForm1. Zdarzają się sytuacje, kiedy potrzebujemy, nawet w trakcie działania aplikacji, zmienić położenie jakiegoś komponentu umieszczonego uprzednio w obszarze takim jak TGroupBox czy TPanel. Aby to zrobić, wystarczy pamiętać o omówionych relacjach własności. Jeżeli chce- my, by np. CheckBox1 znalazł się bezpośrednio w innym miejscu for- mularza, wystarczy przypisać mu Form1 jako rodzica, a następnie podać nowe współrzędne:
  • 15. 104 C++Builder 2006. Ćwiczenia praktyczne CheckBox1->Parent = Form1; CheckBox1->Top = 20; CheckBox1->Left = C0; Należy rozróżniać pojęcia właściciela (Owner) i rodzica (Parent). Rodzic nie jest tożsamy z właścicielem. Właściciela określa się tylko raz, podczas wywoływania jego konstruktora, i nie można już go zmienić bez zniszczenia obiektu. Rodzica obiektu możemy natomiast zmienić zawsze. Formularz w momencie zamknięcia automatycznie (dzięki pewnym mechanizmom) niszczy umieszczone w jego obrębie komponenty. Ten sposób zwalniania komponentów nie ma oczywiście zastosowania w przypadku, gdy obiekty tworzymy dynamicznie za pomocą ich kon- struktorów i operatora new. W takiej sytuacji obowiązkiem programi- sty jest jawne zwolnienie odpowiedniego wskaźnika za pomocą ope- ratora delete. Treść Ćwiczenia 4.6 obrazuje jeden ze sposobów samodzielnego two- rzenia deklaracji obiektu oraz funkcji obsługi generowanego przez ten obiekt zdarzenia. Jeżeli zdecydujemy się tworzyć komponenty dynamicznie, to wskaźniki do klas, w których są one wyrażane, nie mogą być umieszczane w sekcji __published deklaracji klasy formularza. Nie można też korzystać z usług Inspektora obiektów. Wszystkie własności i zdarzenia należy programować samodzielnie. Ć W I C Z E N I E 4.6 Dynamiczne umieszczanie komponentów na formularzu Na listingach 4.1 oraz 4.2 zaprezentowano jeden ze sposobów dyna- micznego konstruowania wraz z dołączaniem przykładowego zdarze- nia OnClick do dynamicznie tworzonego obiektu myButton klasy TButton. Przycisk tworzony jest w ciele konstruktora klasy TForm1.
  • 16. Rozdział 4. • Środowisko programisty IDE C++Builder 2006 105 Listing 4.1. Klasa TForm1 z deklaracją obiektu myButton z klasy TButton oraz funkcją obsługi zdarzenia myButtonClick() #ifndef Unit_R4_CH #define Unit_R4_CH #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> //--------------------------------------------------------- class TForm1 : public TForm { __published: // IDE-managed Components void __fastcall FormClose(TObject *Sender, TCloseAction &Action); void __fastcall FormDestroy(TObject *Sender); private: // User declarations TButton *myButton; void __fastcall myButtonClick(TObject *Sender); public: // User declarations __fastcall TForm1(TComponent* Owner); }; //--------------------------------------------------------- extern PACeAGE TForm1 *Form1; //--------------------------------------------------------- #endif Listing 4.2. Implementacja komponentu oraz funkcji obsługi generowanego przez ten komponent zdarzenia #include <vcl.h> #pragma hdrstop #include "Unit_R4_C.h" #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { // utworzenie obiektu myButton myButton = new TButton(Form1); myButton->Parent = Form1; // opisanie myButton na formularzu myButton->Caption = "myButton"; myButton->Top = 100; myButton->Left = 100; // przypisanie zdarzeniu OnClick odpowiedniej funkcji // obsługi zdarzenia myButton->OnClick = myButtonClick;
  • 17. 106 C++Builder 2006. Ćwiczenia praktyczne } //--------------------------------------------------------- void __fastcall TForm1::myButtonClick(TObject *Sender) { // ciało funkcji obsługi zdarzenia ShowMessage("Przycisk stworzony dynamicznie" " wywołał funkcję obsługi zdarzenia"); } //--------------------------------------------------------- void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action) { switch (MessageBox(0, "Zamknięcie aplikacji ?","Uwaga", MB_YESNOCANCEL || MB_ICON UESTION)) { case ID_YES: Action = caFree; break; case ID_CANCEL: Action = caNone; break; } } //--------------------------------------------------------- void __fastcall TForm1::FormDestroy(TObject *Sender) { // usunięcie obiektu myButton w momencie zamknięcia // formularza delete myButton; } //--------------------------------------------------------- W momencie niszczenia formularza wywoływana jest funkcja obsługi zdarzenia FormDestroy(), w której obiekt reprezentujący przycisk jest automatycznie niszczony. Zdarzenie OnDestroy dostępne jest w karcie zdarzeń Inspektora obiektów, w zakładce Miscellaneous. Ć W I C Z E N I E 4.7 Wielokrotne dynamiczne tworzenie i usuwanie komponentów W poprzednim ćwiczeniu omówiono jedną z metod dynamicznego tworzenia komponentów. Komponent tworzony był w konstruktorze klasy formularza (wywoływanego tylko raz), dlatego też w takich sy- tuacjach nie mamy możliwości wielokrotnego tworzenia i niszczenia
  • 18. Rozdział 4. • Środowisko programisty IDE C++Builder 2006 107 wybranego komponentu. Na listingach 4.3 i 4.4 zaprezentowano je- den ze sposobów wielokrotnego tworzenia i niszczenia komponentu w trakcie działania aplikacji. Nowy komponent edycyjny tworzony jest w funkcji obsługi zdarzenia generowanego przez przycisk umiesz- czony na formularzu w sposób standardowy. Listing 4.3. Klasa TForm1 z deklaracją obiektu myEdit z klasy TEdit oraz funkcją obsługi zdarzenia myEditChange() #ifndef Unit_R4_6H #define Unit_R4_6H #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> //--------------------------------------------------------- class TForm1 : public TForm { __published: // IDE-managed Components TButton *Button1; TButton *Button2; void __fastcall FormClose(TObject *Sender, TCloseAction &Action); void __fastcall FormDestroy(TObject *Sender); void __fastcall Button1Click(TObject *Sender); void __fastcall Button2Click(TObject *Sender); private: // User declarations TEdit *myEdit; void __fastcall myEditChange(TObject *Sender); public: // User declarations __fastcall TForm1(TComponent* Owner); }; //--------------------------------------------------------- extern PACeAGE TForm1 *Form1; //--------------------------------------------------------- #endif Listing 4.4. Implementacja komponentu oraz funkcji obsługi generowanego przezeń zdarzenia #include <vcl.h> #pragma hdrstop #include "Unit_R4_6.h" #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //---------------------------------------------------------
  • 19. 108 C++Builder 2006. Ćwiczenia praktyczne __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { if(myEdit == NULL) { // utworzenie obiektu myEdit myEdit = new TEdit(Form1); myEdit->Parent = Form1; // opisanie myEdit na formularzu myEdit->Width = 300; myEdit->Text = "Nowy komponent edycyjny. Wpisz tekst..."; myEdit->Top = 100; myEdit->Left = 100; // przypisanie zdarzeniu OnChange odpowiedniej funkcji // obsługi zdarzenia myEdit->OnChange = myEditChange; } } //--------------------------------------------------------- void __fastcall TForm1::myEditChange(TObject *Sender) { Button2->Caption = " Naci=nij aby zniszczyz komponent Edit"; } //--------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { // niszczy komponent delete myEdit; // przypisuje myEdit wskaźnik pusty myEdit = NULL; // zmienia opis komponentu Button2 Button2->Caption = "Button2"; } //--------------------------------------------------------- void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action) { switch (MessageBox(0, "ZamkniMcie aplikacji ?","Uwaga", MB_YESNOCANCEL || MB_ICON UESTION)) { case ID_YES: Action = caFree; break; case ID_CANCEL: Action = caNone; break; } }
  • 20. Rozdział 4. • Środowisko programisty IDE C++Builder 2006 109 //--------------------------------------------------------- void __fastcall TForm1::FormDestroy(TObject *Sender) { // usunięcie obiektu myEdit w momencie zamknięcia // formularza if(myEdit != NULL) delete myEdit; } //--------------------------------------------------------- Zapoznamy się teraz z jedną z metod umieszczania w programie pi- sanym w C++Builderze własnej funkcji. W tym celu wykorzystamy, skonstruowaną wcześniej, funkcję obliczającą kolejne potęgi liczby 2 (zobacz ćwiczenia 3.17 i 3.18). Formularz projektu naszej aplikacji składać się będzie z dwóch przycisków Button1 oraz Button2, repre- zentujących klasę TButton. Wykorzystamy też komponent edycyjny z klasy TMemo. Samodzielnie napisaną funkcję możemy umieszczać w kodzie źródłowym aplikacji na parę sposobów. Ć W I C Z E N I E 4.8 Definicja funkcji umieszczana poza klasą formularza Definicję funkcji umieszczamy w sposób najprostszy z możliwych: TForm1 *Form1; ... int power(int x, int y) // definicja funkcji power { int z = 1, i; for(i = 1; i <= y; i++) z = z * x; return z; } Wywołanie funkcji następuje w kontekście obsługi danego zdarze- nia i nie różni się niczym od jej wywołania stosowanego w „tradycyj- nym” C++.