R01-03.DOC

(607 KB) Pobierz
Szablon dla tlumaczy

Wprowadzenie do C++Buildera

Rozdział ten stanowi wprowadzenie do C++Buildera, jednego z najczęściej używanych narzędzi do tworzenia aplikacji internetowych, bazodanowych typu desktop i klient-serwer, programowania rozproszonego itp. C++Builder łączy w sobie charakterystyczne cechy środowiska typu RAD (ang. Rapid Applications Development – błyskawiczne tworzenie aplikacji) z funkcjonalnością ANSI C++. Jest narzędziem na wskroś uniwersalnym, przydatnym zarówno dla amatorów programowania, jak i profesjonalnych zespołów projektowych.

 

Podstawowe informacje na temat zalet C++Buildera i korzyści wynikających z jego zastosowania znajdziesz na stronie http://www.borland.com/bcppbuilder/ w punktach „Features & Benefits” i „New C++Builder Users”.

Zaawansowani programiści mogą rozdział ten pominąć; pozostali znajdą w nim informacje o podstawowych elementach C++Buildera, a także porównanie jego istotnych cech z innymi środowiskami projektowymi i wskazówki dotyczące przenoszenia na jego grunt aplikacji z tychże środowisk.

Zainteresowani Czytelnicy znajdą tu również wprowadzenie do Kyliksa – jednego z najciekawszych produktów ostatnich lat, będącego w istocie adaptacją Delphi i C++Buildera na gruncie Linuksa. Kylix pozwala tworzyć zaawansowane aplikacje w środowisku tego zdobywającego coraz większą popularność systemu z równą łatwością, jak w środowisku Windows. Większość zagadnień dotyczących C++Buildera, omawianych w tej książce, odnosi się także do Kyliksa.

 

Podstawowe elementy C++Buildera

W podrozdziale tym przedstawimy podstawowe elementy C++Buildera i zilustrujemy ich zastosowanie na przykładzie prostej aplikacji.

 

Pierwsze spojrzenie

Jeżeli już zainstalowałeś C++Buildera na swoim komputerze i chciałbyś szybko wykonać za jego pomocą coś pożytecznego – nie ma na co czekać; już za chwilę staną się dla Ciebie jasne takie pojęcia, jak: projekt, komponenty VCL, inspektor obiektów i ich rola w środowisku IDE.

Pierwotnie programiści posługiwali się narzędziami dla DOS-a, uruchamianymi z wiersza poleceń. Kiedy MS Windows zdominowały rynek systemów operacyjnych, w naturalny sposób również i rynek kompilatorów zwrócił się w stronę tego środowiska; jednym z najbardziej znanych kompilatorów C dla Windows był kompilator C++ w wersji 3.1. Nie uprościło to bynajmniej samego procesu programowania, a wręcz przeciwnie: na programiście spoczywała odpowiedzialność za całokształt komunikacji z systemem operacyjnym – obsługa komunikatów, utrzymywanie odpowiedniego wyglądu okienek itp. Nawet prosty program powodujący tylko wyświetlanie pustego okienka miał rozmiar kilkustronicowy.

Sytuacja zmieniła się nieco (na korzyść programistów) po opracowaniu przez Borland narzędzia o nazwie ObjectWindows Library (OWL). OWL, zgodne ze standardami kompilatora wersji 3.1, przejmowało na siebie większość nużących szczegółów systemowych, pozwalając programiście skupić się na istocie rozwiązywanego problemu. Zostało ono rozbudowane wraz z wprowadzeniem na rynek nowego kompilatora C++ w wersji 5.0.

Prawdziwym przełomem okazało się pojawienie Delphi, narzędzia z kategorii RAD, będącego de facto czymś na kształt „wizualnego Pascala” – jeżeli trzymać się analogii do Visual Basica czy też Visual C. Niedługo później Borland opracował analogiczne narzędzie oparte na C++, nadając mu nazwę C++Builder. Korzysta ono z tych samych bibliotek co Delphi, ponadto posiada niemal identyczny interfejs użytkownika.[1] W porównaniu z innym popularnym kompilatorem – Visual C++ – charakteryzuje się większą łatwością tworzenia aplikacji i większą przenośnością tych ostatnich pomiędzy różnymi platformami.

Niewątpliwie dobre opanowanie języka programowania (również C++) wymaga kilku lat praktyki. Narzędzia kategorii RAD – np. C++Builder – mogą jednakże uczynić tę naukę bardziej efektywną, ponadto umożliwiają tworzenie nietrywialnych aplikacji już na wczesnym etapie tej drogi, a to za sprawą obiektowych komponentów VCL, skrywających w sobie wiele skomplikowanych możliwości i uwalniających użytkownika od żmudnego programowania.

Przystąpmy więc do konkretów; pominiemy przy tym wiele szczegółów dotyczących instalacji i obsługi C++Buildera, które znaleźć można w dokumentacji, a których wyczerpujący opis wymagałby odrębnej książki. Skoncentrujemy się za to na metodologii tworzenia konkretnej aplikacji.

Po prawidłowym zainstalowaniu C++Buildera i jego uruchomieniu ukaże się zintegrowane środowisko projektowe (IDE – Integrated Development Environment) przedstawione na rysunku 1.1. Składa się ono z trzech zasadniczych okien, za pośrednictwem których możliwe jest manipulowanie kontrolkami i komponentami, ustawianie ich właściwości oraz wpisywanie kodu programu.

 

Paleta komponentów

Menu główne

Pasek narzędziowy













 

Formularz

Inspektor obiektów

 

Edytor kodu

Rysunek 1.1. Środowisko zintegrowane C++Buildera 5

 

Biblioteka VCL, formularze i komponenty

Biblioteka komponentów (ang. VCL – Visual Component Library) stanowi magazyn komponentów wykorzystywanych do tworzenia aplikacji. Poszczególne komponenty biblioteki odpowiadają poszczególnym komponentom gotowego programu – menu, przyciskom, listom wyboru, obrazkom itp. Komponenty te skrywają w sobie znaczną część kodu, przez co programista zwolniony jest w dużej części z kodowania podstawowych funkcji programu. Poszczególne aspekty zachowania się komponentów mogą być regulowane za pomocą ich właściwości (ang. properties) dostępnych za pośrednictwem inspektora obiektów (patrz rys. 1.1), bądź bezpośrednio w kodzie programu. Oprócz wykorzystywania gotowych komponentów zaawansowany programista ma możliwość tworzenia nowych komponentów, stosownie do swych potrzeb.

Formularze

Poszczególne formularze aplikacji odpowiadają poszczególnym oknom działającego programu; gdy rozpoczynasz tworzenie nowej aplikacji, wyświetlony zostaje automatycznie pusty formularz, zwany formularzem głównym – w działającym programie stanie się on jego oknem głównym. Umieszczając na formularzu komponenty VCL oraz ustalając ich położenie i rozmiary, budujemy żądany interfejs użytkownika. Oprócz komponentów wizualnych istnieją również tzw. komponenty niewidoczne – na etapie projektowania są one reprezentowane przez odpowiednie ikony, natomiast w działającym programie nie są bezpośrednio widoczne w interfejsie użytkownika, jakkolwiek spełniają zadania nie mniej ważne od komponentów wizualnych. Przykładami komponentów niewidocznych są zegary (ang. timers), służące do odmierzania ustalonych odcinków czasu.

Paski narzędziowe

Paski przycisków (ang. speedbars) umożliwiają szybki dostęp do najczęściej wykorzystywanych opcji menu, jak: Run (uruchomienie aplikacji), Step Through (praca krokowa), View Form (oglądanie formularza) itp. Użytkownik ma możliwość przystosowywania zawartości pasków narzędziowych do swoich potrzeb.

Konfigurowanie pasków narzędziowych

Jedną z niezaprzeczalnych zalet środowiska IDE jest jego konfigurowalność. Zawartość dowolnego paska narzędziowego może być łatwo zmieniana poprzez dodawanie i usuwanie przycisków – wyjątkiem w tym względzie jest paleta komponentów, nie zawierająca przycisków, lecz (zgodnie z nazwą) komponenty VCL.

C++Builder zawiera następujące paski narzędziowe:

·         Standard;

·         View;

·         Debug;

·         Custom;

·         Component Palette (paleta komponentów).

 

Aby zmienić zawartość dowolnego paska narzędziowego, wykonaj kolejno następujące czynności:

  1. Kliknij prawym przyciskiem myszy gdziekolwiek w wolnym obszarze paska (poza przyciskami).
  2. Z wyświetlonego menu kontekstowego wybierz opcję Customize.
  3. Wyświetlone zostanie okno dialogowe konfiguracji (rys. 1.2); przejdź na jego stronę Commands.
  4. Przeciągnij żądane polecenia z okna dialogowego na pasek.
  5. Jeżeli chcesz usunąć któryś z przycisków, przeciągnij go po prostu poza obszar paska.

 

 

Rysunek 1.2. Okno dialogowe konfiguracji paska narzędziowego

 

Paleta komponentów

Paleta komponentów, znajdująca się bezpośrednio pod menu głównym, stanowi zasobnik komponentów VCL. Komponenty te zorganizowane są w strony, odpowiadające poszczególnym kategoriom. Aby przenieść komponent na formularz, należy kliknąć jego ikonę w palecie komponentów, a następnie kliknąć w miejscu, w którym ma się on docelowo znaleźć. Jak już wcześniej wspomniano, wygląd i szczegóły funkcjonowania komponentów mogą być regulowane za pomocą właściwości, dostępnych za pośrednictwem inspektora obiektów lub bezpośrednio w kodzie programu.

 

Zdarzenia i ich obsługa

Tym, co decyduje o dynamice działającego programu, są zdarzenia (ang. events). Aby wyjaśnić ich istotę, zbudujemy prostą aplikację w postaci pojedynczego przycisku na formularzu (rys. 1.3). Przyciski są niezwykle często spotykanymi elementami interfejsu użytkownika, który za ich pośrednictwem poleca aplikacji wykonanie określonych czynności.

Komponent odpowiadający przyciskowi umieszczony jest w palecie na stronie Standard pod nazwą Button; jego ikona przedstawia przycisk z napisem OK. Aby przenieść ów komponent na formularz, należy kliknąć najpierw tę ikonę, a następnie odpowiednie miejsce formularza.

Rysunek 1.3. Prosta aplikacja – pojedynczy przycisk na formularzu

Tak przygotowaną aplikację można już skompilować i uruchomić, lecz nie okaże się ona szczególnie użyteczna: klikanie w przycisk nie będzie powodowało żadnych widocznych efektów. Dzieje się tak dlatego, iż zdarzenie generowane w wyniku kliknięcia przycisku nie jest w żaden sposób obsługiwane. Darujmy sobie w tym momencie ścisłą definicję „zdarzenia”; na użytek tworzonej aplikacji można przyjąć, iż w wyniku wystąpienia zdarzenia wywoływana jest odpowiednia funkcja, zwana funkcją obsługi zdarzenia (ang. event handler). Aby przypisać funkcję obsługującą kliknięcie przycisku, zakończmy uruchomioną aplikację, powracając do etapu projektowania i kliknijmy ów przycisk dwukrotnie (lewym przyciskiem myszy); C++Builder wyświetli wówczas fragment kodu aplikacji z wygenerowanym szkieletem odpowiedniej funkcji obsługi:

 

void __fastcall TForm1::Button1Click(Tobject *Sender)

{

}

Ten sam efekt można wywołać, wybierając komponent Button1 w inspektorze obiektów, przechodząc na stronę Events i klikając dwukrotnie pozycję odpowiadającą zdarzeniu OnClick. Jak łatwo zauważyć, nazwa funkcji składa się z nazwy odpowiedniego komponentu (Button1) i nazwy zdarzenia (Click).

Po kliknięciu prawym przyciskiem myszy okna edytora kodu i wybraniu z menu kontekstowego pozycji Open Source/Header File C++Builder wyświetli następujący kod:

 

//---------------------------------------------------------------------------

 

#ifndef Unit1H

#define Unit1H

//---------------------------------------------------------------------------

#include <Classes.hpp>

#include <Controls.hpp>

#include <StdCtrls.hpp>

#include <Forms.hpp>

//---------------------------------------------------------------------------

class TForm1 : public TForm

{

__published:              // IDE-managed Components

        TButton *Button1;

        void __fastcall Button1Click(TObject *Sender);

private:              // User declarations

public:                            // User declarations

        __fastcall TForm1(TComponent* Owner);

};

//---------------------------------------------------------------------------

extern PACKAGE TForm1 *Form1;

//---------------------------------------------------------------------------

#endif

 

Powyższy kod generowany jest automatycznie i jego szczegóły nie są w tej chwili szczególnie istotne; zamieściliśmy go tutaj raczej w celu pokazania, w jak dużym stopniu C++Builder potrafi wyręczyć programistę. Powróćmy jednak do naszej funkcji obsługi, obecnie jeszcze pustej. Sprawmy, by kliknięcie przycisku na formularzu powodowało zakończenie działania programu – w tym celu kliknijmy w oknie edytora kodu zakładkę Unit1.cpp i uzupełnijmy rzeczoną funkcję obsługi następująco:

 

 

void __fastcall TForm1::Button1Click(Tobject *Sender)

{

  ShowMessage("Witam!To jest aplikacja testowa. Naciśnij OK");

  Close();

}

 

 

Teraz należy skompilować i uruchomić aplikację – można to zrobić na jeden z trzech sposobów:

·         naciskając klawisz F9;

·         wybierając opcję Run z menu Run;

·         klikając przycisk (na pasku narzędziowym) w kształcie zielonego trójkącika.

 

Kliknięcie przycisku na formularzu w uruchomionym programie spowoduje teraz wywołanie funkcji TForm1::Button1Click, której treść jest raczej intuicyjnie jasna nawet dla początkującego programisty: otóż najpierw wyświetlone zostanie okienko ze standardowym komunikatem (polecenie „Naciśnij OK.” odnosi się do przycisku w tymże oknie, nie do naszego przycisku na formularzu – przyp. tłum.), po którego zamknięciu wywołana zostanie metoda Close() naszego formularza głównego, zamykająca ów formularz i tym samym kończąca wykonanie programu.

 

Pierwsze programy

Pokażemy teraz, jak łatwo jest zbudować niewielkim wysiłkiem całkiem przyzwoity program – oczywiście jeżeli ma się pod ręką C++Buildera. Wybierz z menu głównego opcję File|New Application; C++Builder stworzy nowy projekt i wyświetli pusty formularz główny.

Przejdź na stronę Additional w palecie komponentów i kliknij komponent Image (rys. 1.4):

 

 



 

Image

Rysunek 1.4. Komponent Image

Kliknij następnie formularz – komponent Image zaprezentuje się w postaci czarnej ramki. Przejdź do inspektora obiektów, znajdź właściwość Stretch i ustaw ją na true.

 

Następnie przejdź na stronę Dialogs palety komponentów (być może konieczne okaże się przewinięcie palety w lewo) i kliknij najpierw komponent OpenDialog (rys. 1.5), a następnie kliknij w pobliżu lewego górnego narożnika formularza, gdzie powinna pojawić się ikona tego komponentu.

 













OpenDialog





             

 

Rysunek 1.5. Komponent OpenDialog

W inspektorze obiektów, wskazującym komponent OpenDialog1, znajdź właściwość Filter i wpisz w jej pole wartości następujący tekst:

 

Bitmapy|*.BMP

 

W ten oto sposób stworzyłeś komponent dialogowy, za pomocą którego będzie możliwy wybór plików z rozszerzeniem .BMP.

 

Kolej teraz na dwa przyciski, z których pierwszy inicjował będzie akcję wczytywania pliku, drugi natomiast posłuży do zakończenia pracy aplikacji. Komponent przycisku Button znajduje się w palecie na stronie Standard (rys. 1.6); w czasie jego klikania przytrzymaj klawisz Shift – spowoduje to, iż komponent pozostanie zaznaczony i każdorazowe kliknięcie w obszarze formularza powodować będzie umieszczenie na nim kolejnego przycisku, do czasu kliknięcia w białą strzałkę na początku palety. Dla naszej aplikacji potrzebne są dwa przyciski – C++Builder automatycznie nada im nazwy Button1 i Button2.

 

 

 

 



 

 

Button

 

 

Rysunek 1.6. Komponent Button

 

 

 

 

Wypadałoby nadać pierwszemu z przycisków tytuł adekwatny do roli, jaką ma on pełnić w aplikacji – w tym celu kliknij go, a następnie w inspektorze obiektów przypisz właściwości Caption napis Wczytaj.

 

Kolejnym komponentem naszej aplikacji będzie pasek statusu, na którym wyświetlana będzie nazwa wczytanego ostatnio pliku. Przejdź do strony Win32 w palecie komponentów i kliknij komponent StatusBar (rys. 1.7); gdy klikniesz formularz, pasek stanu automatycznie usadowi się przy jego dolnej krawędzi.

 



 

StatusBar

 

Rysunek 1.7. Komponent StatusBar

 

Używając inspektora obiektów ustaw właściwość SimplePanel paska StatusBar1 na true.

 

Należy teraz sprawić, by przycisk opatrzony tytułem „Wczytaj” istotnie powodował wczytanie pliku bitmapy; jak zapewne pamiętasz, jest to kwestia właściwego obsłużenia generowanego przez ów przycisk zdarzenia OnClick. Kliknij go dwukrotnie i uzupełnij wyświetlony szkielet funkcji zdarzeniowej do następującej postaci:

 

void __fastcall TForm1::Button1Click(TObject *Sender)

{

  if (OpenDialog1->Execute())

  Image1->Picture->LoadFromFile(OpenDialog1->FileName);

  StatusBar1->SimpleText = OpenDialog1->FileName;       

}

 

Wyświetlone okno edytora kodu przysłoniło formularz, ale to żaden kłopot – za pomocą klawisza F12 można łatwo przełączać się pomiędzy formularzem i odpowiadającym mu modułem kodu źródłowego; można w tym celu użyć również stosownego przycisku na pasku narzędziowym (rys. 1.8).

 



 

 

Rysunek 1.8. Przycisk przełączający pomiędzy edytorem kodu a f...

Zgłoś jeśli naruszono regulamin