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