12. Třídy v C++ Builderu II
  1. Nyní se stručně seznámíme s třídami jednotlivých komponent. Jelikož komponent je velmi mnoho rozdělíme je do několika kategorií. Jednotlivé kategorie jsou popsány v dalších bodech.
  2. Standardní komponenty jsou ty, které zaobalují často používané ovladače Windows. Třídy standardních komponent zahrnují: TButton, TEdit, TListBox, TMemo, TMainMenu, TPopupMenu, TCheckBox, TRadioButton, TRadioGroup, TGroupBox a TPanel. Většina těchto tříd zaobaluje Windovsovské ovladače.

  3. Další zajímavou standardní komponentou je TPanel. Tato komponenta reprezentuje obdélníkovou oblast na formuláři, obvykle se svými vlastními komponentami, kterou je možno chápat jako samostatnou jednotku. Např. můžeme vytvořit paletu nástrojů tím, že na panel vložíme tlačítka. Pokud přesuneme panel, pak tlačítka se přesouvají s ním. Panel může být použit pro řadu různých úloh.
    C++ Builder má další skupinu komponent, které můžeme zahrnout mezi standardní ovladače. Tyto ovladače nalezneme na stránce Additional Palety komponent. Třídy reprezentující tyto komponenty zahrnují: TBitBtn, TSpeedButton, TMaskEdit, TStringGrid, TDrawGrid, TImage, TShape, TBevel a TScrollBox. Třída TBitBtn reprezentuje tlačítko, které má obrázek. TSpeedButton je také tlačítko s obrázkem, ale tato komponenta je určena k použití na paletách nástrojů. Není to pravé tlačítko a jeho použití nespotřebovává zdroje Windows jako ostatní tlačítka. Můžeme jich tedy používat větší množství. Komponenta TImage umožňuje umístit obrázek na formulář. Komponentu TBevel používáne k vytváření rámečků a čar, které zlepšují vzhled formuláře. TStringGrid a TDrawGrid umožňují prezentovat informace v tabulkovém formátu.
  4. VCL má třídy komponent, které zaobalují mnoho uživatelských ovladačů 32-bitových Windows. Tyto třídy zahrnují: TListView, TProgressBar, TTreeView, TTabControl, TPageControl, TRichEdit, TImageList, TStatusBar, TAnimate, TCoolBar a několik dalších. Některé z těchto tříd jsou komplikovanější a třídy VCL které je reprezentují jsou také složitější. Bude nám trvat delší dobu, než se s nimi plně seznámíme.
  5. VCL má databázové komponenty, které zahrnují vizuální i nevizuální třídy. Nevizuální databázové komponenty zahrnují TDataSource, TDatabase, TTable a TQuery. Tyto ovladače zaobalují databázové operace. Třídy vizuálních databázových komponent jsou částí databázových operací VCL, které uživatel vidí a pracuje s nimi. Např. komponenta TDBGrid je používána pro přístup uživatele do databázové tabulky, která může být reprezentována komponentou TTable. TDBGrid zde pracuje jako rozhraní mezi uživatelem a tabulkou. Pomocí TDBGrid může uživatel prohlížet a editovat databázovou tabulku na disku. Komponenta TDBNavigator poskytuje tlačítka, které umožňují uživateli posun v databázové tabulce. Ostatní vizuální třídy databázových komponent přiřazují standardní ovladače Windows k databázovým položkám. Tyto třídy zahrnují: TDBText, TDBEdit, TDBListBox, TDBImage a mnoho dalších.
  6. Windows má dialogová okna, která používáme k otevírámí souborů, ukládání souborů, volbě písma, volbě barev apod. VCL tato dialogová okna obaluje ve třídách TOpenDialog, TSaveDialog, TOpenPictureDialog, TSavePictureDialog, TFontDialog, TColorDialog, TPrintDialog a TPrinterSetupDialog. Do této skupiny VCL přidává dále třídy TFindDialog a TReplaceDialog. Všechny tyto komponenty jsou nevizuální.
  7. Stránka System Palety komponent obsahuje různé vizuální a nevizuální komponenty. Jsou zde např. komponenty TTimer, TMediaPlayer a TPaintBox. Jsou zde také komponenty týkající se OLE a DDE.
  8. Skupina Win 3.1 obsahuje některé starší komponenty. Je zde také skupina komponent, které umožňují vytvářet svá vlastní dialogová okna otevírání a ukládání souborů. Jedná se o TFileListBox, TDirectoryListBox, TDriveComboBox a TFilterComboBox.
  9. Třídy GDI (Graphics Device Interface) umožňují pracovat aplikacím GUI. Tyto třídy (jsou odvozeny od TPersistent) umožňují používat bitové mapy, písma, kontexty zařízení, štětce a pera. Pomocí těchto objektů je možno grafiku a text zobrazovat v okně. Třídy GDI nejsou přiřazeny ke specifické komponentě, ale mnoho komponent má instance těchto tříd jako vlastnosti. Např. editační ovladač má vlastnost Font, která je instancí třídy TFont.

  10. Termín kontext zařízení je velmi dobře znám programátorům vytvářející programy pro Windows. Ve VCL tento termín není často používán. To proto, že VCL zaobaluje kontext zařízení ve třídě TCanvas. VCL používá termín canvas (plátno) k odkazování na kontext zařízení Windows. Plátno poskytuje plochu, na kterou můžeme kreslit pomocí metod MoveTo, LineTo, TextOut apod. Bitové mapy lze zobrazit na plátně pomocí metod Draw a StretchDraw. Koncepce plátna usnadňuje kreslení.
    Třída TCanvas obsahuje instance dalších tříd GDI. Např. když použijeme metodu LineTo, k nakreslení čáry, pak čára je kreslena současnou barvou pera. Vlastnost Pen je použita k určení současné barvy pera a je instancí třídy TPen. TPen má vlastnosti, které určují typ kreslené čáry: šířku čáry, styl čáry (plná, čárkovaná, tečkovaná apod.) a režimu, ve kterém je čára kreslena.
    Třída TBrush reprezentuje štětec použitý jako výplňový vzor pro operace s plátnem prováděnými metodami FillRect, Polygon a Ellipse. Vlastnosti TBrush zahrnují Color, Style a Bitmap. Vlastnost Style umožňuje nastavit styl šrafování pro štětec. Vlastnost Bitmap umožňuje specifikovat bitovou mapu jako výplňový vzor.
    Třída TBitmap zaobaluje operace s bitovými mapami ve VCL. Má vlastnosti Palette, Height, Width a TransparentColor a metody LoadFromFile, LoadFromResourceID a Save ToFile. TBitmap je používána dalšími třídami komponent jako je TImage, TBitBtn a TSpeedButton ve spojitosti s TCanvas.
    Třída TFont provádí operace s písmem. Má vlastnosti Color, Height a Style. Třída TFont je používána všemi třídami komponent, které zobrazují text.
  11. VCL obsahuje další třídy, které můžeme používat ve svých aplikacích. Tyto třídy zjednoduššují některé programovací úlohy ve Windows. Např. třída TIniFile usnadňuje používání (čtení i vytváření) konfiguračních souborů Windows. K provádění operací s registry Windows má VCL třídy TRegistry a TRegkeyInfo.

  12. Třída TStringList slouží jako pole řetězců. TStringList je používán mnoha třídami komponent k ukládání řetězců. Např. třída TMemo používá objekt TStringList jako svou vlastnost Lines. TStringList má možnost ukládat svůj seznam řetězců do souboru nebo zavádět řetězce ze souboru pomocí metod LoadFromFile a SaveToFile.
    Další užitečná třída VCL je TList. Tato třída umožňuje vytvářet pole objektů požadovaného typu. Třída TList ukládá seznam ukazatelů. Hlavní výhodou této třídy je to, že při přidávání (odstraňování) objektů, se pole dynamicky zvětšuje (zmenšuje).
  13. Při našem seznamování s pracovními rámci jsme uvedli kód (v C++ a v OWL) pro zobrazení bitové mapy na obrazovku. Nyní vyřešíme obdobnou úlohu v C++ Builderu. Začneme vývoj nové aplikace. Na formulář vložíme komponentu Image (je na stránce Additional Palety komponent) a nastavíme její vlastnost Align na alClient. Tím komponenta obrázku zaplní celou klientskou oblast formuláře. Vlastnost Stretch nastavíme na true. Dále dvojitě klikneme ve sloupci hodnot vlastnosti Picture a v zobrazeném editoru vlastnosti obrázku stiskneme tlačítko Load. V dialogovém okně otevírámí souborů přejdeme do adresáře Program Files\Common Files\Borland Shared\Images\Splash\256Color a vybereme nějaký soubor (např. HANDSHAKE.BMP). Po stisku tlačítka Open se vrátíme do Editoru obrázků, který uzavřeme stiskem OK. Když aplikaci spustíme, pak lze měnit velikost okna a obrázek vždy zaplňuje klientskou oblast okna.
  14. V tomto zadání se budeme zabývat projekty v C++ Builderu. Projekt je kolekce souborů, které jsou určeny k vytvoření samostatného spustitelného souboru nebo DLL. Mimo samostatného projektu, C++ Builder umožňuje vytvářet skupiny projektů. Skupina projektů je kolekce projektů C++ Builderu. Skupinami projektů se budeme zabývat později.

  15. Když vytvoříme projekt, pak C++ Builder vytváří minimálně 6 souborů (předpokládáme typickou aplikaci GUI): Zdrojový soubor projektu je soubor, který obsahuje funkci WinMain a další spouštěcí kód C++ Builderu. Tento soubor můžeme zobrazit volbou View | Project Source. Zdrojový soubor a hlavičkový soubor hlavního formuláře jsou soubory, které obsahují definici a deklaraci třídy hlavního formuláře. C++ Builder vytváří další zdrojový soubor a hlavičkový soubor pro každý další vytvořený formulář. Soubor zdrojů hlavního formuláře a soubor zdrojů projektu jsou binární soubory, které popisují hlavní formulář a ikonu aplikace.
    Někdy v tomto procesu C++ Builder vytváří vytvářecí soubor projektu. Vytvářecí soubor je textový soubor, který obsahuje informace o nastavených volbách překladače, jménech zdrojových souborů a formulářů tvořících projekt a vkládaných souborech knihoven. Překladač čte vytvářecí soubor, když jsou překládány zdrojové soubory, které tvoří projekt. V tomto procesu je několik důležitých věcí. Nejprve překladač C++ překládá zdrojové soubory C++ do binárních OBJ souborů. Potom překladač zdrojů překládá všechny zdroje, jako jsou ikona programu a soubory formulárů do binárních souborů zdrojů. Dále začíná pracovat sestavovací program. Sestavovací program přebírá binární soubory vytvořené překladači, přidává potřebné soubory knihoven a sestavuje je v jeden celek. V průběhu překladu a sestavování vznikají další soubory.
    V následující tabulce jsou uvedeny typy souborů, které jsou používány C++ Builderem.
     
    Přípona Popis
    CPP Zdrojové soubory C++. Obvykle se jedná o jeden soubor pro každou jednotku, jeden soubor pro projekt a také další zdrojové soubory, které mohou být přidány k projektu.
    DFM Soubor formuláře. Obsahuje popis formuláře a všech jeho komponent. Každý formulář má svůj vlastní DFM soubor.
    DSK Soubor pracovní plochy. Tento soubor obsahuje informace o otevřených oknech na pracovní ploše. Při dalším spuštění C++ Builderu jsou otevřena stejná okna a jsou stejně rozmístěna. Tento soubor je vytvářen pouze, pokud je to povoleno (volba Tools | Environnment Options, stránka Preferences, značka Desktop).
    EXE Výsledný spustitelný program.
    H Hlavičkové soubory C++, které obsahují deklarace tříd. Mohou to být soubory generované C++ Builderem nebo naše vlastní.
    HPP Také hlavičkové soubory C++. Tyto hlavičkové soubory jsou vytvářeny C++ Builderem při instalaci komponent. Hlavičkové soubory VCL mají také příponu CPP.
    IL? Čtyři soubory, jejichž přípona začíná IL jsou soubory vytvářené inkrementálním sestavovacím programem. Zrychlují sestavení, neboť se provedou pouze změny vzniklé od posledního sestavování.
    OBJ Přeložené binární soubory. Vznikají překladem zdrojových souborů C++.
    BPR Vytvářecí soubor projektu. Textový soubor s popisem, který C++ Builder potřebuje k překladu a sestavení projektu.
    RES Přeložený binární soubor zdrojů vytvořený překladačem zdrojů.
    TDS Tabulka symbolů přeloženého programu. Je využíván při ladění.
    Existují ještě další soubory s příponami BPG, BPK a BPL, kterými se zatím nebudeme zabývat. Případné další soubory, které obsahují v příponě znak ~ jsou záložní soubory.
    Minimální množina souborů potřebná k vytvoření projektu je tvořena soubory s příponou CPP, H, DFM a BPR. Všechny ostatní soubory, např. v případě nedostatku místa na disku, je možno smazat a C++ Builder je schopen je znova vytvořit. V C++ Builderu nerušte žádné soubory, s výjimkou souborů uložených v adresáři Examples.
  16. Mnoho obsluh událostí používá parametr Sender, který je typu TObject, a proto do tohoto parametru je možno přiřadit libovolný objekt VCL. Parametr Sender je vždy komponenta, která je příčinou vzniku události. Toto můžeme použít v obsluze události k zjištění komponenty, která událost způsobila. Ukážeme si to na následující nové aplikaci. Na formulář vložíme dvě editační komponenty a 4x komponentu Label (v každé nastavíme jiný typ písma, případně jinou velikost a barvu). V této aplikaci se budeme snažit přetáhnout vlastnost Font z některé komponenty Label do některé editační komponenty. Aplikace by měla pracovat tak, že myší ukážeme na zvolenou komponentu Label, stiskneme tlačítko myši a při stisknutém tlačítku přemístíme ukazatel myši na některou editační komponentu, kde tlačítko myši uvolníme. K zajištění této činnosti musíme provést několik věcí. U komponent z nichž zahajujeme tažení, tj. u komponent Label, je zapotřebí nastavit vlastnost DragMode na hodnotu dmAutomatic. Tím dosáhneme toho, že z těchto komponent můžeme zahájit tažení. Dále je zapotřebí určit, kde tažení může skončit. To určujeme parametrem Accept (je typu bool) u obsluhy událostí OnDragOver jednotlivých komponent. U jedné editační komponenty tedy vytvoříme obsluhu této událostí a zjistíme v ní, zda tažení začalo v některé z komponent Label. Pokud ano, pak zde tažení skončit může (Accept nastavíme na true), jinak tažení nebude akceptováno. U ostatních komponent obsluhu této události měnit nemusíme, neboť implicitní hodnota parametru Accept je false, tažení na ostatních komponentách tedy skončit nemůže. Obsluha událostí OnDragOver u editační komponenty tedy bude tvořena příkazem:

  17. Accept = Source->ClassNameIs("TLabel");
    V tomto příkazu testujeme zda hodnota parametru Source (počátek tažení) je typu TLabel, tj. zda tažení začalo v některé komponentě Label. Dále pro editační komponentu musíme vytvořit obsluhu události OnDragDrop (určíme, co se má provést po ukončení tažení). Tato obsluha musí změnit typ písma v editačním ovladači na písmo komponenty Label, ze které jsme začali tažení. Obsluha bude tedy tvořena příkazem:
    if (Sender->ClassNameIs("TEdit") && Source->ClassNameIs("TLabel"))
    {
      TEdit *CilovyEdit = (TEdit *)Sender;
      CilovyEdit->Font = ((TLabel *)Source)->Font;
    }
    Pomocí přetypování musíme parametry Sender a Source převést na správný typ. Obě obsluhy událostí musíme také přiřadit druhé editační komponentě. Tím je aplikace dokončena. Můžeme ji vyzkoušet.
  18. Upravte předchozí aplikaci takto: Namísto typu písma přetahujte vlastnost Color a tažení provádějte na komponentu Memo. Na formuláři vytvořte několik komponent Label s různými barvami a tyto barvy přetahujte (měňte barvu textu komponenty Memo).
  19. Vytvořte formulář s editačním ovladačem (vlastnost Text nastavíme na 0) a s deseti tlačítky, jejichž vlastnosti Caption jsou jednotlivé číslice. Při stisku některého tlačítka, přidejte příslušnou číslici na konec vlastnosti Text editační komponenty. Pro všechna tlačítka používejte stejnou obsluhu události stisku tlačítka (do editační komponenty přidáme Caption stisknutého tlačítka). Tím jsme vytvořili základ jednoduché kalkulačky.
  20. Nyní se pokusíme zlepšit vzhled naší kalkulačky. Editační ovladač nahradíme komponentou Panel, na kterou vložíme Label. U komponenty Panel vyprázdníme vlastnost Caption a změníme její barvu. U komponenty Label změníme vlastnost Alignment na taRightJustify, vlastnost AutoSize změníme na False, a Caption změníme na 0. Dále u komponenty Label zvětšíme písmo a změníme jeho barvu. Potlačíme také zobrazování počátečních nul (jestliže při stisku tlačítka číslice má Label1->Caption hodnotu 0, pak do této vlastnosti vložíme prázdný řetězec).
  21. Na formulář vytvořený v předchozím zadání přidejte další tlačítko, s jehož pomocí budete nulovat komponentu Label, tj. provedeme příkaz  Label1->Caption = "0";. Dále přidejte tlačítko pro zadávání desetinné tečky. Zajistěte také, aby bylo možno zadat nejvýše jednu desetinnou tečku (deklarujeme globální proměnnou typu bool informující o tom, zda v čísle je tečka již zobrazena).
  22. Ve vytváření kalkulačky pokračujte přidáním tlačítka pro změnu znaménka (zajistěte, aby pro nulu změna znaménka nešla použít).
  23. Na formulář dále přidáme tlačítka +, -, *, / a =. Pokuste se dosáhnout toho, aby naše kalkulačka pracovala jako běžná kalkulačka. Signalizací chyb se zatím nezabývejte, pouze ošetřete dělení nulou (v komponentě Label např. zobrazte text Error).
  24. Přidejte dále tlačítka pro výpočet některých funkcí. Můžete také přidat tlačítka pro práci s pamětí a případně některé další činnosti kalkulačky.
12. Třídy v C++ Builderu II