Zaawansowane szukanie | Nowości
Newsy | Artykuły | Programowanie: Pascal, Object/Delphi Pascal, C++, PHP, Javascript | Poradniki | Recenzje | FAQ | Mapa

Artykuł: C++ - Pierwsza aplikacja

Programowanie obiektowe


Dzięki C++ możemy programować obiektowo, a ułatwia nam to forma w C++ Builderze. Jednak zawsze ktoś zapyta, czy można samemu tworzyć kod formy, obiektów i komponentów - odpowiedź brzmi: Tak, można. Kod formy można porównać do CSS - pomaga on określić położenie, kolory, czcionki, obramowania czy przyleganie. Forma powstała jednak po to, aby programista mógł skupić się na kodzie właściwym aplikacji - na wszystkich funkcjach, instrukcjach i warunkach. Dzięki formie można zrobić jedynie układ programu, tzn. gdzie ma się znajdować jakiś przycisk, panel, lista czy etykieta. Wszystkie akcje do tych obiektów pisane są jednak w kodzie właściwym i wszystko tutaj zależy już od programisty.

Ale jak?


Można sobie zadać pytanie - jak nasz program będzie działał od razu w środowisku graficznym Windowsa? C++ Builder jest na tyle pomocny, że sam nam generuje odwołanie do API Windowsa i dzięki temu łączy kod formy razem z kodem źródłowym w jeden kod projektu, po czym kompiluje go tworząc program pod Windows. Można sprawdzić tą procedurę wybierając z menu Projekt pozycję "View Source". Powinien pokazać nam się podobny kod:
#include <vcl.h>

#pragma hdrstop
//---------------------------------------------------------------------------
USEFORM("Unit1.cpp", Form1);
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { try { Application->Initialize(); Application->CreateForm(__classid(TForm1), &Form1); Application->Run(); } catch (Exception &exception) { Application->ShowException(&exception); } catch (...) { try { throw Exception(""); } catch (Exception &exception) { Application->ShowException(&exception); } } return 0; }
W skrócie kod ten działa tak: zostaje wczytany WinAPI, po czym próba inicializacji, sworzenia formy i uruchomienia aplikacji. Jeżeli aplikacja zawiera błędy, dzięki "catch" zostaną one wyświetlone (ShowException).

Forma


Mimo tego, że formę można modyfikować za pomocą myszki, przedstawię teraz jak budowany jest jej kod. Aby zobaczyć kod formy klikamy prawym przyciskiem myszy na formę i wybieramy "View As Text". Widzimy teraz poniższy kod:
object Form1: TForm1
  Left = 192
  Top = 114
  Width = 696
  Height = 480
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
end
Kod dotyczy jednego obiektu - samej formy. Budowanie takiego kodu polega na zadeklarowaniu jakiego obiektu dotyczy (w tym przypadku Form1: TForm1) oraz na przedstawieniu jego atrybutów i wartości (na zasadzie Atrybut = Wartość lub AtrybutGłówny.Atrybut = Wartość). Określanie każdego obiektu należy zakończyć znacznikiem end. Na przykładzie powyższego kodu możemy zauważyć, że atrybut Left odpowiada za pozycję od lewego skrawka ekranu (odległość), a atrybut Top od góry. Dzięki temu możemy określić w jakim miejscu forma ma się znajdować. Atrybuty Width i Height określają wysokość i szerokość formy. Color pozwala na określenie koloru formy, domyślnie clBtnFace wskaże kolor szary (domyślny systemu Windows). Wszystkie kolory zaczynają się od prefixu "cl". Dalej widzimy główny atrybut dla czcionek - Font, a w nim podatrybuty po kropce. Charset jest to kodowanie, Height jest to rozmiar, a Name to nazwa czcionki. Dodatkowe style (jak pogrubienie, pochylenie itp.) możemy zastosować dzięki atrybutowi Style (tutaj wartości są następujące: fsBold - pogrubienie, fsItalic - pochylenie, fsUnderline - podkreślenie, fsStrikeOut - przekreślenie). Trzeba przyzwyczaić się do tego, że każda wartość zazwyczaj ma swój prefix składający się z dwóch liter, które pełnią rolę "iniciału" atrybutu. Przykładem dla Font.Style jest prefix "fs", dla Align - "al", dla Color - "cl". Kod formy przy dużej liczbie obiektów może być naprawdę wielki. Programista nawet nie powinien posać kodu formy, bo musiałby co chwilę sprawdzać, czy wszystko leży we właściwym miejscu i ma właściwą wielkość. Dlatego właśnie na formie pracuje się głównie myszą, bo jest to sprawa jakby nie było wizualna programu. Podczas tworzenia formy pomoże nam Inspektor Obiektów, który pozwala określać wszystkie dostępne atrybuty dla danego obiektu, a także bardzo ważny atrybut jakim jest Name.
Inspektor obiektów z zaznaczonym atrybutem "Name".
Name pozwala na określenie nazwy obiektu, która potem wykorzystywana jest w kodzie właściwym. Domyślna nazwa formy to "Form1" i możemy ją zmienić na np. "Formatka".

Atrybuty


Inspektor Obiektów pozwala na zmianę atrybutów każdego obiektu. Głównym atrybutem jest, jak już pisałem wcześniej, Name. Bardzo ważny dla wszystkich atrybut to Caption, który pozwala na zmianę etykiety obiektu (np. napisu na przycisku, czy tytułu formy). Aby zmienić tytuł formy (ten, który pokaże się na pasku), zmieniamy wartość atrybutu Caption. Zmieńmy go na "Moja pierwsza aplikacja".
Forma ze zmienionym atrybutem "Caption"
Jeszcze nieco teorii: zanim przejdziemy do pisania kodu właściwego, lepiej ustawić sobie wszystkie ważne atrybuty formy. Mały test:
Zmniejsz rozmiar okna formy i naciśnij F9. Zobacz, czy formę da się rozciągać. Teraz wyłącz program, zmień atrybut BorderStyle na BsSingle i ponownie naciśnij F9. Teraz formy nie da się już rozciągać.
Zmiana atrybutu BorderStyle jest bardzo przydatna. Jeżeli nie chcemy, aby program dało się maksymalizować lub minimalizować, należy skorzystać ze zmiany atrybutu BorderIcons, gdzie można zmienić wartości dla poszczególnych podatrybutów (bsSystemMenu - zamykanie ("krzyżyk"), bsMaximize - maksymalizacja, bsMinimalize - minimalizacja, bsHelp - pomoc ("pytajnik")) na True (tak) lub False (nie).
Wiele atrybutów można przestawić w Inspektorze Obiektów, dlatego polecam się nimi "pobawić" i potestować. Dla osób znających język angielski nie powinno być z tym kłopotów.

Niech się stanie


Czas zacząć tworzyć swoją pierwszą aplikację, dość patrzenia się na pustą formę. W oknie narzędziowym odszukujemy komponentu "Label" z symbolem dużej litery "A" na domyślnej zakładce (Standard). Jest to etykieta, którą umieszczamy na formie. Widać, że w Drzewie Projektu pokazał się nowy obiekt, a w liście rozwijalnej Inspektora Obiektów widać jego nazwę (Label1). Zmieniamy Name na "Etykieta" i Caption na Moja pierwsza aplikacja. Czcionka jest mała, więc zmieniamy jej rozmiar w Inspektorze Obiektów.

Wciskamy F9 i widzimy, że w programie widać już jakiś napis. Ale nadal nic się nie dzieje. Wstawmy więc przycisk, wybieramy komponent "Button" i umieszczamy go na formie. Zmieniamy "Caption" na "Kliknij na mnie". Czas na napisanie kodu. Wybieramy zakładkę "Events" w Inspektorze Obiektów i klikamy dwa razy na akcję "OnClick", a ponieważ jest to akcja domyślna, możemy kliknąć dwa razy na sam przycisk, co spowoduje przeniesienie nas do kodu właściwego, gdzie kompilator wstawi domyślną aukcję:
void __fastcall TFormatka::Button1Click(TObject *Sender)
{

}
void __fastcall rozpoczyna każdą procedurę. Po tym znaczniku należy umieścić według schematu: Nazwa formy z przedrostkiem "T" (dlaczego "T" napiszę później) i po dwóch dwukropkach nazwę naszej akcji z zaznaczeniem w nawiasie, że jest to obiekt typu Sender (o tym także później). W kodzie możemy używać komentarzy, które są pomijane przez kompilator, więc może tam być dowolny tekst. Komentarze dla jednej linii możemy pisać tak jak w języku PHP po znaku "//", a dłuższe komentarze, także jak w języku PHP, rozpoczynając znakiem "/*" i kończąć "*/". Kod właściwy składa się z większej ilości plików projektu, w których deklaruje się zmienne itp. (o tym także później), odwołania do tych plików jak np.
#include "Unit1.h"
co spowoduje wczytanie do projektu pliku Unit1.h (działa to podobnie jak w języku PHP).
Kontynuując: gdy mamy już stworzoną akcję OnClick (która jak nazwa wskazuje wywoła się przy kliknięciu na przycisk) napiszmy teraz prostą procedurę, która wyświetli okno dialogowe z daną wiadomością i przyciskiem OK. Skorzystamy z funkcji ShowMessage, która bez konieczności tworzenia nowej formy wyświetli okno dialogowe. Zatem piszemy:
void __fastcall TFormatka::Button1Click(TObject *Sender)
{
ShowMessage("Tak działa moja pierwsza aplikacja"); // Ważne jest, aby tekst pisać w znakach " "
}
Pamiętajmy, że każda funkcja musi być zakończona średnikiem!
Teraz uruchamiamy aplikację (F9), po czym klikamy na przycisk "Kliknij na mnie". Efekt jest widoczny - pokazuje się okno dialogowe z tekstem "Tak działa moja pierwsza aplikacja".

Jak widzimy w pasku tytułowym komunikatu widnieje napis "Project2". Aby zmienić główną nazwę aplikacji, wchodzimy w Project -> Options i przechodzimy na zakładkę Application. Tam można zmienić ikonę aplikacji jak i jej nazwę.

Dzięki tej zmiane po kliknięciu na "Kliknij na mnie" zobaczymy okno z tytułem "Mój program".
Czas na trochę bardziej skomplikowane zadanie - zróbmy tak, aby po kliknięciu na przycisk napis "Etykieta" zmienił się na "Blablabla". W tym celu należy napisać poniższy kod:
void __fastcall TFormatka::Button1Click(TObject *Sender)
{
 Etykieta->Caption = "Blablabla";
}
W kodzie można zmieniać atrybuty danych obiektów. Nazwaliśmy sobie etykietę "Etykieta", dzięki czemu w kodzie można odwoływać się do niej pod taką właśnie nazwą. Atrybut zmienia się właśnie dzięki znakom "->", a działa to na takiej zasadzie: Samochód->Skręć_w_prawo lub Samochód->Skręć_w_lewo. Takich kombinacji jest więcej jak np. Samochód->Skręć(Lewo) - w nawiasie podaje się wartość, lub np. Samochód->Kolor = clCzerwony; co spowoduje zmianę koloru samochodu na czerwony. Oczywiście są to tylko najprostrze z możliwych przykładów.
Na koniec stwórzmy aplikację, która wyświetli komunikat, zmieni nazwę etykiety i zamknie się sama po naciśnięciu przycisku OK. Tą procedurą podsumuję cały ten artykuł. Napiszmy taki kod:
void __fastcall TFormatka::Button1Click(TObject *Sender)
{
 Etykieta->Caption = "Blablabla"; // Zmieni się nazwa etykiety
 ShowMessage("Program zostanie zamknięty"); // Wyświetli się komunikat
 Close(); // Program zostanie zamknięty
}
W kodzie panuje taka zasada, że procedury wykonują się po kolei i gdy coś je zatrzymie (np. wyświetlenie okna dialogowego), program także zostanie wstrzymany, dlatego właśnie program zamknie się dopiero po naciśnięciu przycisku OK (który spowoduje dalsze działanie programu) dzięki procedurze Close(), która odwołuje się domyślnie do formy. Możemy ją zapisać w taki sposób: Formatka->Close();, ale "Formatka" jest uznawana przez kompilator jako król, więc do niej tyczą się akcje bez nazwy domyślnie (np. kod "Caption = "coś" zmieni tytuł formy na "coś").
Jak już mówiłem - projekt C++ składa się z wielu plików. Na szczęście C++ Builder dba o to, aby wszystkie zostały poprawnie zapisane w jednym miejscu. W tym celu wybieramy File -> Save All lub File -> Save Project As, co pozwoli nam zapisać dotychczasowy projekt i potem go wczytać ponownie. Projekt ten przyda się do następnego rozdziału. W tym krótkim artykule przedstawiłem najprostrze funkcje języka C++. Następny: "Zmienne, warunki i pętle" jest poświęcony stawianiu warunków, pętli i w dalszym ciągu najprostrzych funkcji.

Autor: Michał Gacki
Główny programista i założyciel Bil Software.
Informacje o autorze | Kontakt