1. Prßce s texty
  1. V n∞kolika nejbli╛╣φch kapitolßch se seznßmφme se zßkladnφmi technikami programovßnφ VCL (nebo si je zopakujeme). Tyto techniky se t²kajφ:
  2. V tΘto kapitole se budeme zab²vat technikami prßce s textem. VCL poskytuje mnoho metod a vlastnostφ, kterΘ nßm usnad≥ujφ manipulaci s textem v komponentßch Memo a RichEdit. N∞kterΘ z popsan²ch slu╛eb je mo╛no aplikovat i na editaΦnφ komponenty. V t∞chto poΦßteΦnφch kapitolßch je uvedeno mnoho p°φklad∙, kterΘ jsou Φßstmi p°φklad∙ uveden²ch dßle. Tyto p°φklady jsou zde pouze pro ilustraci probφranΘ problematiky a nenφ je mo╛no zkou╣et samostatn∞. UvedenΘ p°φklady jsou zobrazeny modrou barvou.
    V komponent∞ RichEdit nebo Memo u╛ivatel m∙╛e zarovnßvat text k pravΘmu nebo levΘmu okraji nebo text centrovat mezi okraji. K nastavenφ zarovnßvßnφ textu pou╛φvßme vlastnost Alignment komponenty. Zarovnßvßnφ se uskuteΦnφ pouze v p°φpad∞, kdy vlastnost WordWrap je nastavena na true (p°i nastavenφ na false neexistuje prav² okraj). EditaΦnφ komponenta nepodporuje zarovnßvßnφ.
    Komponenty RichEdit nebo Memo mohou obsahovat vodorovn², svisl² nebo oba posuvnφky. Kdy╛ je povoleno zalamovßnφ slov, pak komponenta pot°ebuje pouze svisl² posuvnφk. Pokud zalamovßnφ slov vypneme, pak komponenta m∙╛e takΘ po╛adovat vodorovn² posuvnφk, nebo╗ text nenφ omezen prav²m okrajem komponenty. Nßsleduje obvyklß obsluha volby WordWrap (zalamovßnφ) v nabφdce:
    void __fastcall TEditForm::Wordwrap1Click(TObject *Sender)
    {
      Editor->WordWrap = !Editor->WordWrap;      //p°epnutφ zalamovßnφ
      if (Editor->WordWrap)
        Editor->ScrollBars = ssVertical;
      else
        Editor->ScrollBars = ssBoth;
      Wordwrap1->Checked = Editor->WordWrap;     // oznaΦenφ prvku nabφdky
    }
    Komponenty RichEdit a Memo ovlßdajφ svΘ posuvnφky r∙zn²m zp∙sobem. Komponenta RichEdit svoje posuvnφky skryje, pokud nejsou zapot°ebφ, zatφmco Memo je stßle nechßvß zobrazenΘ.
  3. V∞t╣ina aplikacφ provßd∞jφcφch zpracovßnφ textu umo╛≥uje u╛ivateli p°esouvat vybran² text mezi dokumenty a to i mezi dokumenty v r∙zn²ch aplikacφch. Objekt schrßnky v C++ Builderu zaobaluje schrßnku Windows a obsahuje metody pro vyst°i╛enφ, kopφrovßnφ a p°ilepenφ textu (a dal╣φch formßt∙, vΦetn∞ grafiky). Objekt schrßnky je deklarovßn v jednotce Clipbrd. Pro p°idßnφ objektu Clipboard k aplikaci, vybereme jednotku, kterß schrßnku pou╛φvß a do jeho hlaviΦkovΘho souboru p°idßme

  4. #include <Clipbrd.hpp>
    D°φve ne╛ m∙╛eme vlo╛it text do schrßnky, musφme jej vybrat. Zv²razn∞nφ vybranΘho textu je zabudovßno do editaΦnφch komponent. Kdy╛ u╛ivatel vybere text, pak je zobrazen zv²razn∞n∞. Ke zpracovßvßnφ vybranΘho textu pou╛φvßme vlastnosti SelText, SelLength a SelStart.
    Metoda SelectAll vybφrß cel² obsah komponenty RichEdit nebo Memo. Je to obzvlß╣t∞ u╛iteΦnΘ, pokud text p°esahuje viditelnou oblast komponenty. Obsluha volby Select All m∙╛e vypadat takto:
    void __fastcall TEditForm::Selectall1Click(TObject *Sender)
    {
      Editor->SelectAll();
    }
    Aplikace C++ Builderu pou╛φvajφcφ jednotku Clipbrd mohou pracovat se schrßnkou Windows. Pro b∞╛nΘ operace se schrßnkou jsou zde metody CutToClipboard, CopyToClipboard a PasteFromClipboard. Pro zru╣enφ vybranΘho textu v editaΦnφ komponent∞ je mo╛no pou╛φt metodu ClearSelection.
  5. ╚asto chceme v aplikacφch zakßzat volby v nabφdce, kterΘ nejsou prßv∞ pou╛itelnΘ. Nap°. v textovΘm editoru, pokud nenφ prßv∞ vybran² ╛ßdn² text, pak nelze v nabφdce Edit pou╛φvat volby Cut, Copy a Delete. Tφm, ╛e tyto volby zakß╛eme, informujeme u╛ivatele, kterΘ volby prßv∞ nem∙╛e pou╛φt. Vhodn²m okam╛ikem pro povolenφ nebo zßkaz prvk∙ jednΘ nabφdky je kliknutφ u╛ivatele na prvku v °ßdku nabφdky. V tomto okam╛iku (d°φve ne╛ nabφdka je zobrazena) m∙╛eme opravit dostupnost prvk∙ (tato udßlost vznikß takΘ p°i pou╛itφ zkracovacφ klßvesy). K zßkazu prvku nabφdky, nastavφme jeho vlastnost Enabled na false.

  6. Nßsleduje p°φklad obsluhy udßlosti OnClick pro nabφdku Edit. Jsou zde povoleny prvky Cut, Copy a Delete, kdy╛ v editoru je vybrßn text a volba Paste je povolena, pokud ve schrßnce je vlo╛en n∞jak² text.
    void __fastcall TEditForm::Edit1Click(TObject *Sender)
    {
      Paste1->Enabled = Clipboard()->HasFormat(CF_TEXT);
      bool HasSelection = Editor->SelLength > 0;
      Cut1->Enabled = HasSelection;
      Copy1->Enabled = HasSelection;
      Delete1->Enabled = HasSelection;
    }
    Metoda HasFormat objektu schrßnky vracφ informaci o tom, zda schrßnka obsahuje objekt, text, obrßzek nebo jin² formßt. Volßnφm s parametrem CF_TEXT zjistφme, zda schrßnka obsahuje text.
    V aplikacφch jsou Φasto pou╛φvßny mφstnφ nabφdky. Umo╛≥ujφ u╛ivateli minimalizovat pohyb my╣i p°i pou╛φvßnφ Φast²ch voleb. V aplikacφch textovΘho editoru, nap°. mφstnφ nabφdka m∙╛e obsahovat volby pro prßci se schrßnkou. Volby mφstnφ nabφdky obsahujφ stejnΘ obsluhy udßlostφ jako odpovφdajφcφ volby hlavnφ nabφdky. V mφstnφ nabφdce nepou╛φvßme urychlovacφ nebo zkracovacφ klßvesy (pou╛φvajφ se z hlavnφ nabφdky).
    V hlavnφ nabφdce m∙╛eme na zßklad∞ souΦasnΘ situace zakßzat n∞kterΘ volby. TotΘ╛ je mo╛no ud∞lat i v mφstnφ nabφdce. V mφstnφ nabφdce to provßdφme v obsluze udßlosti OnPopup. Pokud v mφstnφ nabφdce mßme stejnΘ volby jako v n∞kterΘ nabφdce hlavnφ nabφdky, pak lze pou╛φt stejnou obsluhu pro ob∞ nabφdky. Nap°.
    void __fastcall TEditForm::Edit1Click(TObject *Sender)
    {
      Paste1->Enabled = Clipboard()->HasFormat(CF_TEXT);
      Paste2->Enabled = Paste1->Enabled;
      bool HasSelection = Editor->SelLength > 0;
      Cut1->Enabled = HasSelection;
      Cut2->Enabled = HasSelection;
      Copy1->Enabled = HasSelection;
      Copy2->Enabled = HasSelection;
      Delete1->Enabled = HasSelection;
    }
  7. Vytvo°te jednoduch² textov² editor, ve kterΘm pou╛ijete informace uvedenΘ v p°edchozφch bodech.


  8. C++ Builder poskytuje r∙znΘ nßstroje pro vytvß°enφ formulß°∙, dialogov²ch oken a aplikacφ. Mezi tyto nßstroje pat°φ nap°. Zßsobnφk objekt∙, Pr∙vodce dialogov²m oknem a Pr∙vodce aplikacφ. Nynφ se seznßmφme se Zßsobnφkem objekt∙. DialogovΘ okno Zßsobnφku objekt∙ je mφsto, kde m∙╛eme vybφrat p°eddefinovanΘ objekty pro pou╛itφ v na╣φ aplikaci. Zßsobnφk objekt∙ je tvo°en textov²m souborem BCB.DRO v adresß°i BIN, kter² obsahuje informace o objektech vlo╛en²ch do zßsobnφku. Jeliko╛ zde na uΦebn∞ tento soubor je chrßn∞n p°ed zßpisem, nepoda°φ se nßm provΘst ╛ßdnou Φinnost vy╛adujφcφ modifikaci Zßsobnφku objekt∙ (s mo╛nostmi modifikace Zßsobnφku objekt∙ se tedy seznßmφme pouze teoreticky).

  9. Zßsobnφk objekt∙ je zobrazen automaticky po volb∞ File | New. Jednß se o okno s titulkem New Items. Zßsobnφk objekt∙ mß n∞kolik strßnek, ka╛dß z nich obsahuje jinΘ objekty vyu╛itelnΘ v na╣φch aplikacφch. V nßsledujφcφ tabulce je uveden popis standardnφch strßnek a popis prvk∙ kterΘ obsahujφ.
     
    Strßnka Popis
    New Umo╛≥uje vytvß°et novou aplikaci, konsolovou aplikaci, formulß° nebo jednotku zdrojovΘho k≤du pro pou╛itφ v na╣φ aplikaci. TakΘ umo╛≥uje vytvß°et dal╣φ objekty, jako jsou balφΦky, DLL, komponenty a datovΘ moduly.
    ActiveX Umo╛≥uje vytvß°et novΘ ovladaΦe ActiveX, knihovny typ∙ apod.
    Forms Umo╛≥uje vytvß°et standardnφ formulß°e z p°edvytvo°en²ch formulß°∙ jako je About box, strßnky se zßlo╛kami, sestavy apod.
    Dialogs Nabφzφ n∞kolik zßkladnφch typ∙ dialogov²ch oken. TakΘ obsahuje pr∙vodce vytvß°enφm dialogovΘho okna.
    Projects Obsahuje projekty, od kter²ch m∙╛eme odvozovat svΘ aplikace. Obsahuje takΘ pr∙vodce vytvß°enφm aplikace.
    Data Modules Umo╛≥uje volit z datov²ch modul∙ v na╣φ aplikaci.
    Business Obsahuje pr∙vodce pro databßzovΘ formulß°e, sestavy a dal╣φ aplikace.

    Pokud zobrazφme Zßsobnφk objekt∙ p°i otev°enΘm projektu, pak Zßsobnφk obsahuje dal╣φ strßnku s objekty tohoto otev°enΘho projektu. To umo╛≥uje rychlΘ op∞tovnΘ pou╛itφ formulß°e nebo jinΘho objektu v²b∞rem v Zßsobnφku objekt∙.
    Pod strßnkami Zßsobnφku objekt∙ jsou t°i voliΦe (Copy, Inherit a Use), kterΘ urΦujφ, jak vybran² objekt mß b²t implementovßn. V zßvislosti na typu vybranΘho objektu mohou b²t n∞kterΘ z t∞chto voliΦ∙ zakßzßny. Nap°. na strßnce New jsou zakßzßny v╣echny. Pro tuto strßnku je p°φpustnß pouze volba Copy a nenφ nutno ji tedy volit.
    Pokud zvolφme voliΦ Copy, pak C++ Builder vytvß°φ kopii vybranΘho objektu a umis╗uje ji do aplikace. V tomto p°φpad∞ je mo╛no libovoln∞ modifikovat volby objektu. P∙vodnφ objekt v Zßsobnφku nenφ ovliv≥ovßn, nebo╗ v╣echny modifikace jsou provßd∞ny na kopii objektu v na╣φ aplikaci. Je to nejbezpeΦn∞j╣φ metoda pou╛itφ objektu.
    Pou╛itφ voliΦe Inherit se podobß pou╛itφ Copy s jednou d∙le╛itou odchylkou. Nov² objekt je stßle vßzßn k p∙vodnφmu objektu. Pokud modifikujeme zßkladnφ objekt, pak zm∞ny se projevφ i v na╣em nov∞ vytvo°enΘm objektu. OpaΦn∞ to ale neplatφ, nov∞ vytvo°en² objekt lze modifikovat bez ovlivn∞nφ p∙vodnφho objektu. Nap°. kdy╛ do p∙vodnφho objektu p°idßme novou funkΦnost, pak se projevφ i v na╣em odvozenΘm objektu (pokud n∞kterΘ na╣e zm∞ny ji nedovolφ pou╛φt).
    Volba Use se pou╛φvß velmi z°φdka. Objekt ze Zßsobnφku je otev°en pro p°φmou editaci. Tuto volbu pou╛ijeme, kdy╛ mßme objekt ulo╛en v Zßsobnφku a chceme v n∞m provΘst trvalΘ zm∞ny.
    P°evzetφ vybranΘho objektu ze Zßsobnφku zßvisφ na n∞kolika faktorech. Tyto faktory zahrnujφ typ vybranΘho objektu, zda je otev°en projekt a zvolen² voliΦ. Pokud mßme otev°enou aplikaci a zvolφme vytvo°enφ novΘ aplikace, pak jsme dotßzßni zda p°ed vytvo°enφm novΘho projektu chceme souΦasn² projekt ulo╛it. Volba File | New Application je ekvivalentnφ vytvo°enφ novΘ aplikace ze Zßsobnφku objekt∙. Vytvo°enφ novΘho formulß°e ze Zßsobnφku objekt∙ zßvisφ na tom, zda je otev°en projekt. Je-li projekt otev°en, pak nov² formulß° je p°idßn k aplikaci, nenφ-li projekt otev°en, pak nov² formulß° je vytvo°en jako samostatn² formulß° (takov²to formulß° musφ b²t p°idßn k projektu pozd∞ji; nelze jej spustit samostatn∞). Tuto mo╛nost vyu╛ijeme, kdy╛ vytvß°φme nov² formulß° pro p°idßnφ do Zßsobnφku objekt∙. Obdobn∞ to platφ i o ostatnφch objektech.
    Okno zßsobnφku objekt∙ je ovladaΦ prohlφ╛eΦe seznamu podobn² jako pravß strana Exploreru Windows. Mßme tedy mo╛nost objekty Zßsobnφku zobrazit jako: VelkΘ ikony (implicitn∞), MalΘ ikony, Seznam a Detaily. Toto volφme v mφstnφ nabφdce Zßsobnφku. V mφstnφ nabφdce lze takΘ volit se°azenφ objekt∙ (podle jmΘna, popisu, datumu nebo autora).

  10. Nynφ se budeme zab²vat jednotliv²mi Φinnosti se Zßsobnφkem objekt∙. Nejprve si ukß╛eme vytvß°enφ nov²ch objekt∙ ze Zßsobnφku. Tuto Φinnost si ukß╛eme na p°φkladu. Vytvo°φme jednoduchou aplikaci s hlavnφm formulß°em, dialogov²m oknem About a druh²m formulß°em. ZaΦneme v²voj novΘ aplikace. Je zobrazen prßzdn² formulß°. Na formulß° umφstφme dv∞ tlaΦφtka a zm∞nφme jejich vlastnosti Caption na About ... a Zobraz Form2. Zvolφme File | New, p°ejdeme na strßnku Forms, vybereme objekt About box, ujistφme se, ╛e je nastaven voliΦ Copy a stiskneme OK. Modifikujeme podle sv²ch pot°eb vytvo°enΘ dialogovΘ okno (zm∞nφme ikonu, zadßme zobrazovanΘ informace apod.). Op∞t zvolφme File | New, na strßnce Forms vybereme objekt Dual list box a stiskneme OK. Nynφ ji╛ m∙╛eme vytvo°it obsluhy pro ob∞ tlaΦφtka. Program p°elo╛φme a spustφme. Program nic ned∞lß, ale ukazuje nßm jak m∙╛eme pou╛φt Zßsobnφk objekt∙ k rychlΘmu vytvo°enφ prototypu aplikace.
  11. Zßsobnφk objekt∙ umo╛≥uje efektivn∞ vytvß°et na╣e vlastnφ objekty. P°idßvßnφ objekt∙ do Zßsobnφku zvy╣uje produktivitu programovßnφ. To co jsme ji╛ vytvo°ili, m∙╛eme opakovan∞ pou╛φvat. Nenφ vhodnΘ uklßdat v╣echny vytvo°enΘ formulß°e do Zßsobnφku, ale pouze ty u nich╛ je nad∞je na ΦastΘ pou╛φvßnφ. Pokud mßme vytvo°en objekt, kter² chceme p°idat do Zßsobnφku, pak v mφstnφ nabφdce NßvrhovΘho formulß°e zvolφme Add To Reposity. V zobrazenΘm dialogovΘm okn∞ na levΘ stran∞ je seznam souΦasn²ch formulß°∙ a dal╣φch objekt∙ v aplikaci. Zde je nejprve nutno vybrat objekt, kter² chceme p°idat do Zßsobnφku. Dßle je nutno zadat titulek objektu (text zobrazovan² pod ikonou v Zßsobnφku objekt∙), popis (poskytuje podrobn∞j╣φ informaci o objektu - je zobrazovßn v Zßsobnφku p°i zobrazenφ detail∙), jmΘno autora objektu (standardnφ objekty majφ jako jmΘno autora uvedeno Borland) a vybereme strßnku Zßsobnφku, na kterou bude vklßdan² objekt umφst∞n. M∙╛eme volit z existujφcφch strßnek, nebo zapφ╣eme jmΘno novΘ strßnky. Ve spodnφ Φßsti dialogovΘho okna je tlaΦφtko Browse, kterΘ m∙╛eme pou╛φt k v²b∞ru ikony pou╛itΘ pro reprezentaci objektu. Po vypln∞nφ v╣ech polo╛ek a v²b∞ru ikony stiskneme tlaΦφtko OK a objekt je p°idßn do Zßsobnφku na specifikovanou strßnku (v na╣em p°φpad∞, v d∙sledku zßkazu zßpisu, se nßm to nepoda°φ). P°idan² objekt m∙╛eme kdykoli pou╛φt. Informace o p°idanΘm objektu obsahujφ i adresß°ovou cestu k p°idanΘmu objektu. Pokud objekt p°emφstφme nebo zru╣φme, pak jej ji╛ dßle nenφ mo╛no v Zßsobnφku objekt∙ pou╛φvat.
  12. P°idßnφ projektu do Zßsobnφku objekt∙ se od p°idßnφ samostatnΘho objektu moc neli╣φ. Pro p°idßnφ projektu zvolφme Project | Add To Repository a zobrazenΘm okn∞ zadßme po╛adovanΘ ·daje. Jinak je Φinnost obdobnß.
  13. K ·dr╛b∞ strßnek a objekt∙ v Zßsobnφku objekt∙ pou╛φvßme dialogovΘ okno konfigurace Zßsobnφku objekt∙. Toto okno zobrazφme volbou Tools | Repository nebo volbou Properties v mφstnφ nabφdce Zßsobnφku objekt∙. Toto dialogovΘ okno umo╛≥uje ru╣it objekty a strßnky v Zßsobnφku objekt∙, p°esouvat objekty z jednΘ strßnky na jinou, m∞nit po°adφ strßnek apod. Na levΘ stran∞ okna je zobrazen seznam strßnek. Kdy╛ jednu strßnku vybereme, pak na pravΘ stran∞ je zobrazen seznam objekt∙ strßnky. V seznamu strßnek nenφ uvedena strßnka New, kterß je nem∞nnß a je v╛dy zobrazena jako prvnφ. V seznamu je takΘ uvedeno [Object Repository]. Je zde seznam v╣ech prvk∙ v╣ech strßnek Zßsobnφku.

  14. D°φve ne╛ m∙╛eme editovat, ru╣it nebo p°esouvat objekt, musφme jej mφt vybran². Objekt m∙╛eme vybrat kliknutφm (v pravΘm seznamu). Po v²b∞ru objektu jej m∙╛eme editovat (stisknete tlaΦφtko Edit Object nebo dvojit∞ klikneme na objektu). P°i editaci objektu lze zm∞nit jmΘno objektu, popis, autora a takΘ strßnku na kterΘ je objekt zobrazen. Vybran² objekt zru╣φme stiskem tlaΦφtka Delete Object. Jsme dotßzßni na potvrzenφ p°ed odstran∞nφm objektu ze strßnky a ze Zßsobnφku. Zru╣enφm objektu odstranφme objekt ze Zßsobnφku, ale nezru╣φme zdrojovΘ soubory popisujφcφ objekt. Objekty m∙╛eme p°esunout z jednΘ strßnky na jinou pouh²m p°eta╛enφm objektu ze seznamu objekt∙ na po╛adovanou strßnku v seznamu strßnek.
    Zatφm jsme se zab²vali sprßvou objekt∙. ObdobnΘ Φinnosti lze takΘ provßd∞t se strßnkami Zßsobnφku objekt∙. V levΘm seznamu vybereme strßnku a pro jejφ zru╣enφ stiskneme tlaΦφtko Delete Page. P°ed zru╣enφm strßnky, musφme z nφ odstranit v╣echny objekty (lze zru╣it pouze prßzdnou strßnku). Novou strßnku p°idßme stiskem tlaΦφtka Add Page. Je zobrazeno okno, ve kterΘm zadßme jmΘno novΘ strßnky. Pro p°ejmenovßnφ, vybereme strßnku, stiskneme tlaΦφtko Rename Page a v zobrazenΘm okn∞ zadßme novΘ jmΘno strßnky.
    KonfiguraΦnφ okno Zßsobnφku objekt∙ takΘ umo╛≥uje nastavit t°i implicitnφ objekty: Pokud v seznam∙ objekt∙ je vybrßn formulß°, pak pod seznamem jsou dv∞ znaΦky (New Form a Main Form), je-li vybrßn projekt, pak pod seznamem je jedna znaΦka (New Project). Implicitnφ objekty nastavφme tak, ╛e je vybereme (postupn∞) a oznaΦφme u nich p°φslu╣nou znaΦku (ka╛dß znaΦka m∙╛e b²t nastavena pouze u jednoho objektu).
    Zru╣enφm nastavenφ t∞chto znaΦek se vrßtφme k p∙vodnφm objekt∙m.
  15. C++ Builder mß zabudovanΘ pr∙vodce vytvß°enφm dialogov²ch oken a aplikacφ. Nejprve se budeme zab²vat pr∙vodcem vytvß°enφm dialogov²ch oken. Pro spu╣t∞nφ pr∙vodce vytvß°enφm dialogov²ch oken zvolφme File | New, v Zßsobnφku objekt∙ p°ejdeme na strßnku Dialogs a vybereme ikonu (dvojit∞ na nφ klikneme) Dialog Wizard. Prvnφ strßnka pr∙vodce se nßs dotazuje, zda chceme vytvo°it jednostrßnkovΘ nebo vφcestrßnkovΘ dialogovΘ okno. Ikona v levΘ Φßsti pr∙vodce nßm ve v╣ech krocφch ukazuje vzhled vytvß°enΘho okna. Po zadßnφ volby stiskneme tlaΦφtko Next. Pokud jsme zvolili vytvß°enφ vφcestrßnkovΘho dialogovΘho okna, pak dal╣φ strßnka pr∙vodce se nßs dotazuje na jmΘna jednotliv²ch strßnek (zadßvßme je v editaΦnφm okn∞; ka╛dΘ jmΘno na jeden °ßdek). Po stisku tlaΦφtka Next p°ejdeme na poslednφ strßnku pr∙vodce. U jednostrßnkov²ch dialogov²ch oken je druhß strßnka pr∙vodce vynechßna. Na poslednφ strßnce pr∙vodce zadßvßme umφst∞nφ tlaΦφtek. Jsou zde t°i volby: tlaΦφtka v okn∞ nechceme, tlaΦφtka pod sebou u pravΘho okraje a tlaΦφtka vedle sebe u spodnφho okraje. Stiskem tlaΦφtka Finish ukonΦφme vytvß°enφ dialogovΘho okna. Je vytvo°en zßklad okna, do kterΘho ji╛ v╣echnu funkΦnost musφme dod∞lat b∞╛n²m zp∙sobem sami. Pr∙vodce je u╛iteΦn² p°i vytvß°enφ vφcestrßnkov²ch dialogov²ch oken. P°i vytvß°enφ jednostrßnkov²ch oken m∙╛eme volit p°φmo p°edefinovan² objekt v Zßsobnφku objekt∙.
  16. Pokuste se pomocφ Pr∙vodce vytvß°enφm dialogov²ch oken vytvo°it n∞jakΘ okno.
  17. Pr∙vodce vytvß°enφm aplikace nßm pomßhß k rychlΘmu vytvo°enφ prototypu aplikace. Pr∙vodce spustφme volbou File | New, v Zßsobnφku objekt∙ p°ejdeme na strßnku Projects a dvojit∞ klikneme na ikonu Application Wizard. Na prvnφ strßnce pr∙vodce vybφrßme prvky hlavnφ nabφdky aplikace. M∙╛eme zvolit p°idßnφ nabφdek File, Edit, Window a Help (nabφdky jsou v angliΦtin∞). Nabφdka Window je vhodnß pro MDI aplikace. Po volb∞ po╛adovan²ch nabφdek stiskneme tlaΦφtko Next a p°ejdeme na dal╣φ strßnku.

  18. Pokud jsme zvolili p°idßnφ nabφdky File, potom nßsledujφcφ strßnka slou╛φ pro zadßnφ filtr∙ souborov²ch dialogov²ch oken (OpenDialog a SaveDialog). Stiskneme tlaΦφtko Add a p°idßme nov² filtr (popis filtru a filtr vyjßd°en² hv∞zdiΦkovou konvencφ). TlaΦφtka Edit, Delete, Up a Down m∙╛eme pou╛φt k editaci, zru╣enφ nebo p°esunu filtru v seznamu.
    Dal╣φ strßnka pr∙vodce vytvß°enφm aplikace se t²kß vytvß°enφ palety nßstroj∙ aplikace (je zobrazena pouze pokud jsme k aplikaci p°idali nabφdku). Toto je znaΦn∞ u╛iteΦnß slu╛ba Pr∙vodce. Umo╛≥uje rychlΘ vytvo°enφ palety nßstroj∙ z voleb nabφdky. Na levΘ stran∞ okna je seznam nabφdek. Po v²b∞ru n∞kterΘ nabφdky, je na pravΘ stran∞ okna zobrazen seznam voleb tΘto nabφdky s doporuΦen²mi tlaΦφtky pro jednotlivΘ volby. Pro p°idßnφ tlaΦφtka na paletu, vybereme tlaΦφtko v seznamu a stiskem tlaΦφtka Insert jej vlo╛φme na paletu (ukßzka palety je zobrazena v hornφ Φßsti okna Pr∙vodce). TlaΦφtko Space slou╛φ pro p°idßnφ separßtoru na paletu (slou╛φ k vizußlnφmu odd∞lenφ skupiny tlaΦφtek). Pokud se n∞kterΘ tlaΦφtko z palety rozhodneme odstranit, pak jej vybereme a stiskneme Remove. Pr∙vodce vytvß°enφm aplikace takΘ nastavuje krßtkΘ nßpov∞dnΘ texty pro tlaΦφtka.
    ╚tvrtß a poslednφ strßnka Pr∙vodce vytvß°enφm aplikace umo╛≥uje nastavit jmΘno programu, adresß° pro ulo╛enφ projektu na╣φ aplikace a n∞kolik dal╣φch voleb. ZadßvanΘ jmΘno aplikace nenφ jmΘno zobrazovanΘ v dialogovΘm okn∞ Project Options, ale jmΘno projektovΘho souboru. Druh² editaΦnφ ovladaΦ slou╛φ k zadßnφ adresß°ovΘ cesty k adresß°i, ve kterΘm projekt bude ulo╛en (tlaΦφtko Browse lze pou╛φt k nalezenφ tΘto cesty, p°φpadn∞ vytvo°enφ po╛adovanΘho adresß°e). Ve spodnφ Φßsti jsou t°i znaΦky. Hornφ z nich nastavφme, pokud vytvß°φme MDI aplikaci. Dal╣φ se t²kß vytvo°enφ stavovΘho °ßdku a poslednφ k povolenφ zobrazovßnφ bublinkovΘ nßpov∞dy. Po zadßnφ v╣ech po╛adovan²ch ·daj∙ stiskneme tlaΦφtko Finish. C++ Builder vytvo°φ aplikaci na zßklad∞ specifikovan²ch voleb. Je takΘ vytvo°en k≤d aplikace, kter² budeme muset je╣t∞ doplnit. Nap°. pro obsluhu volby File | Open byl vygenerovßn tento k≤d:
    void __fastcall TMainForm::FileOpen(TObject *Sender)
    {
     if (OpenDialog->Execute())
     {
      //---- Add code to open OpenDialog->FileName ----
     }
    }
  19. Pou╛itφ pr∙vodc∙ je rychlΘ a snadnΘ. Vyzkou╣ejte si jejich pou╛itφ a vytvo°te prototyp n∞jakΘ aplikace, kterou se dßle pokuste dokonΦit (nap°. vytvo°te textov² editor).
  20. Vidφme, ╛e C++ Builder dokß╛e rychle vytvo°it prototyp WindowsovskΘ aplikace. K dokonΦenφ aplikace je zapot°ebφ doplnit je╣t∞ k≤d obsluh udßlostφ a p°idat p°φpadn∞ dal╣φ pot°ebn² k≤d. Nynφ se seznßmφme s tφm, jak C++ Builder udr╛uje deklaraci t°φdy formulß°e. Kdy╛ vytvo°φme nov² formulß°, pak C++ Builder vytvo°φ t°i soubory: soubor formulß°e, zdrojov² k≤d jednotky a hlaviΦkov² soubor jednotky. P°i vytvß°enφ deklarace t°φdy formulß°e v hlaviΦkovΘm souboru, C++ Builder vytvß°φ dv∞ sekce. Prvnφ sekce je Φßst deklarace t°φdy, kterß je spravovßna C++ Builderem. Druhou sekci spravujeme sami. Podφvejme se na n∞jakou deklaraci t°φdy formulß°e:

  21. class TMainForm : public TForm
    {
    __published:
     TMainMenu *MainMenu;
     TMenuItem *FileNewItem;
     TMenuItem *FileOpenItem;
     TMenuItem *FileSaveItem;
     TMenuItem *FileSaveAsItem;
     TMenuItem *FileExitItem;
     TOpenDialog *OpenDialog;
     TSaveDialog *SaveDialog;
     void __fastcall FormCreate(TObject *Sender);
     void __fastcall FileNew(TObject *Sender);
     void __fastcall FileOpen(TObject *Sender);
     void __fastcall FileSave(TObject *Sender);
     void __fastcall FileSaveAs(TObject *Sender);
     void __fastcall FileExit(TObject *Sender);
    private:        // private user declarations
    public:         // public user declarations
     virtual __fastcall TMainForm(TComponent* Owner);
    };
    Na t°etφm °ßdku tohoto k≤du vidφme klφΦovΘ slovo __published (nejednß se o klφΦovΘ slovo C++, ale o roz╣φ°enφ p°idanΘ C++ Builderem; urΦuje p°φstup do t°φdy podobn∞ jako private, protect nebo public). Od tohoto °ßdku a╛ k p°φkazu private je Φßst, kterß je udr╛ovßna C++ Builderem (tuto Φßst bychom nikdy nem∞li sami modifikovat). Do zb²vajφcφ Φßsti deklarace (za klφΦovß slova private nebo public), m∙╛eme p°idßvat svΘ vlastnφ deklarace datov²ch slo╛ek a metod. Za private zapisujeme soukromΘ slo╛ky a metody a za public ve°ejnΘ slo╛ky a metody. Definice metod potom zapisujeme do zdrojovΘho souboru jednotky.
    N∞kdy se dostaneme do situace, kdy pot°ebujeme zru╣it k≤d kter² vygeneroval C++ Builder. Nap°. na formulß°i mßme tlaΦφtko, kterΘ ji╛ nepot°ebujeme. Vybereme jej a stiskneme klßvesu Delete. Tφm je tlaΦφtko zru╣eno, ale nezru╣ili jsme zatφm k≤d obsluhy udßlosti OnClick tohoto tlaΦφtka (je mo╛nΘ, ╛e stejnou obsluhu bude vyu╛φvat je╣t∞ jinß komponenta formulß°e). Pokud se rozhodneme zru╣it i tuto obsluhu, pak musφme zru╣it definici funkce ve zdrojovΘm souboru a deklaraci funkce z hlaviΦkovΘho souboru (je v Φßsti spravovanΘ C++ Builderem). Toto je v²jimka z pravidla, ╛e nikdy nesmφme modifikovat Φßst deklarace formulß°e spravovanou C++ Builderem. Rychlej╣φ a snadn∞j╣φ metoda k odstran∞nφ obsluhy udßlosti z na╣eho k≤du je zru╣enφ v╣eho k≤du v obsluze a ulo╛enφ projektu. C++ Builder p°i uklßdßnφ projektu (nebo p°i p°ekladu) odstra≥uje v╣echny prßzdnΘ obsluhy udßlostφ. P°ed odstran∞nφm obsluhy je ale zapot°ebφ se ujistit, ╛e ╛ßdnß jinß komponenta tuto obsluhu nepou╛φvß. Neexistuje ale ╛ßdnß jednoduchß metoda, jak toto zjistit.
  22. ⌐ablony komponent umo╛≥ujφ vytvo°it, ulo╛it a op∞tovn∞ pou╛φvat skupinu komponent (nemusφ to b²t skupina, m∙╛e se takΘ jednat o jednu komponentu). V nßsledujφcφm p°φklad∞ si ukß╛eme jak u╛iteΦnΘ mohou b²t ╣ablony komponent.

  23. Standardnφ Windowsovsk² editaΦnφ ovladaΦ, stejn∞ jako ostatnφ ovladaΦe Windows, mß n∞jakΘ p°eddefinovanΘ chovßnφ. SouΦßstφ tohoto chovßnφ je i zp∙sob zpracovßnφ stisku klßvesy Enter. Pokud u╛ivatel stiskne klßvesu Enter v editaΦnφm ovladaΦi, pak Windows hledß implicitnφ tlaΦφtko v okn∞ (pokud je nalezne, pak jej stiskne). N∞kdy se ale dostaneme do situace, kdy bychom dali p°ednost jinΘmu chovßnφ. Nap°. v okn∞ mßme vφce editaΦnφch ovladaΦ∙ a p°i stisku klßvesy Enter chceme p°ejφt na dal╣φ ovladaΦ. ╪e╣enφ tohoto problΘmu je pom∞rn∞ jednoduchΘ. StaΦφ pouze vytvo°it obsluhu udßlosti OnKeyPress editaΦnφho ovladaΦe:
    void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)
    {
      if (Key == VK_RETURN) {
        Key = 0;
        PostMessage(Handle, WM_NEXTDLGCTL, 0, 0);
      }
    }
    Tento k≤d testuje, zda u╛ivatel stiskl klßvesu Enter (VK_RETURN). Pokud ano, pak nastavφ hodnotu Key na 0 (tφm zabrßnφme pφpnutφ, p°i stisku Enter v editaΦnφm ovladaΦi) a za╣leme zprßvu WM_NEXTDLGCTL. Tato zprßva nastavφ zaost°enφ na dal╣φ ovladaΦ v Tab po°adφ. Je to v╣e, co jsme pot°ebovali.
    Po zßpisu k≤du m∙╛eme komponentu ulo╛it jako ╣ablonu. Kdy╛ to provedeme, pak ji ulo╛φme spoleΦn∞ s k≤dem. Provedeme to takto: Umφstφme komponentu Edit na prßzdn² formulß°, zm∞nφme jejφ vlastnost Name na EnterAsTab a zapφ╣eme obsluhu udßlosti OnKeyPress. Tuto komponentu vybereme, zvolφme Component | Create Component Template a v zobrazenΘm dialogovΘm okn∞ zm∞nφme jmΘno komponenty na TEnterAsTab. Ostatnφ informace nechßme beze zm∞ny a stiskem OK ╣ablonu komponenty ulo╛φme. Na Palet∞ komponent je vytvo°ena strßnka Templates s na╣φ upravenou komponentou. M∙╛eme ji nynφ pou╛φvat normßlnφm zp∙sobem.
    Velkou v²hodou ╣ablon komponent je to, ╛e k≤d zapsan² pro obsluhy udßlosti komponenty je ulo╛en spoleΦn∞ s komponentou. ⌐ablony komponent umo╛≥ujφ vytvo°it kolekci p°izp∙soben²ch komponent, kterΘ Φasto pou╛φvßme. I kdy╛ koncepce ╣ablony komponenty pracuje takΘ s jednou komponentou, byla p∙vodn∞ urΦena pro prßci s vφce komponentami. M∙╛eme mφt skupinu komponent, kterou budeme umis╗ovat na formulß° spoleΦn∞ (vytvo°φme ╣ablonu z t∞chto komponent).
1. Prßce s texty