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