15. Formuláře II
  1. V další aplikaci se podrobněji seznámíme s modálními dialogovými okny. Hlavní formulář této aplikace bude obsahovat dvě komponenty Label s texty ?Toto je první text a Toto je druhý text a tlačí a tlačí? Konfigurace .... Tlačítkem zobrazíme naše dialogové okno. Dialogové okno (nastavíme jeho vlastnost BorderStyle na bsDialog) obsahuje dvě značky s texty ?Zobrazení prvního textu a Zobrazení druhého textu a dvě komponenty tlačí? BitBtn (s texty OK a Cancel). Titulek dialogového okna změníme na Volba konfigurace. Pokud bychom dialogové okno zobrazovali pouze metodou ShowModal, nebylo by to vůbec užitečné. Jeden z možných přístupů je tento: Nastavíme počáteční hodnoty dialogového okna, zobrazíme dialogové okno a bylo-li stisknuto OK, pak přeneseme nové hodnoty do hlavního formuláře. Obsluha stisku tlačítka v hlavním formuláři tedy může obsahovat příkazy:

  2. Form2->CheckBox1->Checked = Label1->Visible;
    Form2->CheckBox2->Checked = Label2->Visible;
    if (Form2->ShowModal() == mrOk) {
      Label1->Visible = Form2->CheckBox1->Checked;
      Label2->Visible = Form2->CheckBox2->Checked;
    }
    Aplikace je hotova a můžeme ji vyzkoušet.
  3. V další aplikaci si ukážeme rozšiřování dialogového okna. Vyjdeme z předchozí aplikace. Nejprve musíme dialogové okno doplnit tlačítkem (BitBtn) Více >> a novými ovladači. Okno zvětšíme, nové ovladače vložíme na zvětšenou oblast formuláře a okno opět zmenšíme na původní velikost. Přidané ovladače (mimo tlačítka Více) jsou tedy mimo viditelnou plochu. V našem případě se např. pokusíme rozšířit formulář směrem dolů. Na zvětšenou plochu přidáme další dvě značky s texty Kurzíva a Tučně pro zadání stylu písma na hlavním formuláři. Potřebujeme ještě znát výšku rozšířeného formuláře. Obsluha stisku tlačítka Konfigurace na hlavním formuláři bude nyní tvořena příkazy:

  4. Form2->CheckBox1->Checked = Label1->Visible;
    Form2->CheckBox2->Checked = Label2->Visible;
    Form2->CheckBox3->Checked = Label1->Font->Style.Contains(fsItalic);
    Form2->CheckBox4->Checked = Label1->Font->Style.Contains(fsBold);
    if (Form2->ShowModal() == mrOk) {
      Label1->Visible = Form2->CheckBox1->Checked;
      Label2->Visible = Form2->CheckBox2->Checked;
      TFontStyles X;
      if (Form2->CheckBox3->Checked) X << fsItalic;
      if (Form2->CheckBox4->Checked) X << fsBold;
      Label1->Font->Style = X;
      Label2->Font->Style = X;
    }
    Do deklarace typu dialogového okna vložíme soukromé položky:
    int PuvVyska, NovaVyska;
    Vlastnost AutoScroll dialogového okna musíme nastavit na false a pro dialogové okno vytvoříme několik obsluh událostí. Obsluha OnCreate bude tvořena příkazy (zapamatujeme si výšku normálního a zvětšeného okna):
    PuvVyska = Height;
    NovaVyska = sem zapíšeme výšku zvětšeného okna ;
    Obsluhu OnActivate tvoří příkazy (zakážeme nové ovladače, povolíme tlačítko Více a nastavíme původní výšku okna):
    Height = PuvVyska;
    BitBtn3->Enabled = true;
    CheckBox3->Enabled = false;
    CheckBox4->Enabled = false;
    Zbývá ještě vytvořit obsluhu tlačítka Více:
    BitBtn3->Enabled = false;
    CheckBox3->Enabled = true;
    CheckBox4->Enabled = true;
    Height = NovaVyska;
    Aplikace je hotova a můžeme ji vyzkoušet. Zajímavější efekt dosáhneme, když novou výšku (Height = NovaVyska;) budeme nastavovat v cyklu:
    for (int I = Height; I <= NovaVyska; I++) {
      Height = I;
      Update();
    }
    Vyzkoušejte.
  5. V předchozí aplikaci jsme pracovali s typem TFontStyles. V Builderu je definovaná šablona třídy

  6. Set<typ,minimum,maximum>,
    která implementuje typ množina z Pascalu. Musíme specifikovat tři parametry šablony: typ (typ prvků množiny; obvykle char nebo výčtový typ), minimum (minimální hodnota, kterou množina může obsahovat; nemůže být menší než 0) a maximum (maximální hodnota, kterou množina může obsahovat; nemůže být větší než 255). Každá instance množiny je objekt vytvořený na základě těchto tří parametrů. Tato třída má metody Clear (odstraňuje všechny prvky z množiny) a Contains (zjištění zda množina obsahuje prvek určený parametrem). Dále jsou zde překryty následující operátory: - (rozdíl dvou množin), * (průnik množin), + (sjednocení množin), != (operátor nerovnosti), == (operátor rovnosti), = (operátor přiřazení), << (přidání prvku do množiny), >> (vyjmutí prvku z množiny) a kombinované operátory -=, *= a +=. Typ použitý v předchozím zadání je deklarován takto:
    enum TFontStyle { fsBold, fsItalic, fsUnderline, fsStrikeOut };
    typedef Set<TFontStyle, fsBold, fsStrikeOut> TFontStyles;
  7. Následující nová aplikace vytváří seznam použitých souhlásek a seznam použitých samohlásek v zadaném textu (uvažujte pouze písmena bez diakritických znamének). Na formulář vložíme editační ovladač pro zadávání textu, tři komponenty Label (první nad editační ovladač a další dva pod) a tlačítko. Editační ovladač vyprázdněte, u horní komponenty Label změňte Caption na Zadej text:, vlastnosti Caption zbývajících komponent Label vyprázdněte a text tlačítka změňte na Zjisti. Pro tlačítko vytvoříme tuto obsluhu události OnClick:

  8. typedef Set<char, 'A', 'Z'> TMnozPismen;
    TMnozPismen Samohl, Souhl, PouzSouhl, PouzSamohl;
    Samohl << 'A' << 'E' << 'I' << 'O' << 'U' << 'Y';
    char Znak;
    for (Znak = 'A'; Znak <= 'Z'; Znak++) Souhl << Znak;
    Souhl -= Samohl;
    int I;
    for (I = 1; I <= Edit1->Text.Length(); I++){
      Znak = UpCase(Edit1->Text[I]);
      if (Souhl.Contains(Znak)) PouzSouhl << Znak;
      if (Samohl.Contains(Znak)) PouzSamohl << Znak;
    }
    Label2->Caption = "Seznam použitých souhlásek: ";
    for (Znak = 'A'; Znak <= 'Z'; Znak++)
      if (PouzSouhl.Contains(Znak)) Label2->Caption = Label2->Caption + Znak;
    Label3->Caption = "Seznam použitých samohlásek: ";
    for (Znak = 'A'; Znak <= 'Z'; Znak++)
      if (PouzSamohl.Contains(Znak)) Label3->Caption = Label3->Caption+Znak;
    Prostudujte si použití operací s množinami. Aplikaci vyzkoušejte.
  9. Upravte předchozí aplikaci tak, aby se rozlišovala velikost písmen.
  10. V další aplikaci si ukážeme použití nemodálního dialogového okna. Hlavní formulář obsahuje pět komponent Label se jmény (Pavel, Marek, Aleš, Karel a Jana). Jestliže uživatel klikne na některé jméno, změní se jeho barva na červenou; jestliže na ně uživatel klikne dvojitě, program zobrazí dialogové okno (Form2) se seznamem jmen, ze kterých je možno vybírat. Na formuláři je ještě tlačítko Styl zobrazující dialogové okno pro zadávání stylu použitého písma. Aplikace se tedy skládá ze tří formulářů: hlavního formuláře a dvou dialogových oken. Obsluha kliknutí na všech komponentách Label na hlavním formuláři je tvořena příkazy:

  11. if (Sender->ClassNameIs("TLabel")) {
      Label1->Font->Color = clBlack;
      Label2->Font->Color = clBlack;
      Label3->Font->Color = clBlack;
      Label4->Font->Color = clBlack;
      Label5->Font->Color = clBlack;
      ((TLabel *)Sender)->Font->Color = clRed;
    }
    Obdobně obsluha OnDoubleClick pro všechny komponenty Label je tvořena příkazy (práce se seznamy bude podrobně popsána později; pro pochopení jsou příkazy obsluhy doplněny komentáři):
    if (Sender->ClassNameIs("TLabel")) {
      // Výběr aktivního jména v seznamu
      Form2->ListBox1->ItemIndex = Form2->ListBox1->Items->
                       IndexOf(((TLabel *)Sender)->Caption);
      // Zobrazení dialogového okna a kontrola výběru
      if ((Form2->ShowModal() == mrOk) & (Form2->ListBox1->ItemIndex >= 0)){
        // Zkopíruje vybraný prvek do komponenty Label
        int X = Form2->ListBox1->ItemIndex;
        ((TLabel *)Sender)->Caption = Form2->ListBox1->Items->Strings[X];
      }
    }
    Dialogové okno se seznamem neobsahuje žádný kód (nebudeme pro něj vytvářet žádné obsluhy událostí). Obsahuje komponentu ListBox a dvě tlačítka BitBtn (s texty OK a Cancel; určíme je vlastností Kind). Do komponenty ListBox vložíme několik jmen (asi 10) a musí se v nich vyskytnout všechna jména uvedená na hlavním formuláři. Pro toto dialogové okno nastavíme ještě tyto vlastnosti: ActiveControl na ListBox1, BorderStyle na bsDialog a Caption na Vyber jméno. Tím je toto dialogové okno hotovo. Hlavní formulář obsahuje ještě tlačítko. Obsluha jeho stisku je tvořena příkazem:
    Form3->Show();
    Dialogové okno Styl obsahuje dvě tlačítka BitBtn (s texty Použij a Uzavři - budeme je definovat sami; pro nemodální okna nelze použít Ok a Cancel), tři značky s texty ?Kurzíva?, ?Tučně? a ?Podtrženě? a komponentu Label s textem ?Příklad zobrazení?. Značky zde ovládají styl zobrazení komponenty Label. Např. pro značku Kurzíva vytvoříme tuto obsluhu události OnClick:
    TFontStyles X = Label1->Font->Style;
    if (CheckBox1->Checked) X << fsItalic;
    else X >> fsItalic;
    Label1->Font->Style = X;
    Obsluhy ostatních značek jsou obdobné, vytvořte je sami (fsBold a fsUnderline). U tlačítka BitBtn1 nastavíme tyto vlastnosti: Caption na Použij, Default na true a pro Glyph vybereme nebo vytvoříme vhodný obrázek. Obdobně pro BitBtn2: Cancel na true, Caption na Uzavři a opět vybereme obrázek pro Glyph. Vlastnosti formuláře nastavíme takto: ActiveControl na BitBtn1, BorderStyle na bsDialog a Caption na Vyber styl. Obsluha stisku tlačítka BitBtn2 bude tvořit příkaz Close a obsluha BitBtn1 bude obsahovat příkazy:
    TFontStyles X = Label1->Font->Style;
    Form1->Label1->Font->Style = X;
    Form1->Label2->Font->Style = X;
    Form1->Label3->Font->Style = X;
    Form1->Label4->Font->Style = X;
    Form1->Label5->Font->Style = X;
    Zde přistupujeme k hlavnímu formuláři a musíme tedy do Unit3 vložit příkazem File | Include Unit Hdr hlavičkový soubor  Unit1. Aplikaci již můžeme vyzkoušet. Povšimněte si, že stiskem tlačítka Použij okno neuzavřeme.
  12. Komponenta BitBtn může také automaticky obsloužit několik bitových map. Můžeme připravit jednu bitovou mapu obsahující určitý počet obrázků (symbolů) a nastavit tento počet jako hodnotu vlastnosti NumGlyph. Všechny podobrázky musí mít stejnou velikost, protože celková bitová mapa je dělena na stejné části. Jestliže v bitové mapě uvedeme více symbolů, pak jsou použity podle následujících pravidel: První symbol je použit pro povolené tlačítko (implicitní zobrazení), druhý pro zakázané tlačítko, třetí je použit při kliknutí na tlačítku a čtvrtý, když tlačítko zůstane stisknuté. Chybět mohou pouze poslední nebo poslední dva (tři) symboly. Použití si ukážeme na aplikaci, kde na formulář umístíme pouze komponentu BitBtn a komponentu značky (CheckBox), kterou tlačítko budeme zakazovat a povolovat. U tlačítka nastavíme vlastnost Glyph na následující obrázek. Vytvoříme jej pomocí Editoru obrázků a bude mít rozměry 96 x 32 bodů.
  13. Pokud obrázek nechcete vytvářet, můžete si jej stáhnout - Stažení obrázku. Vlastnost Caption tlačítka změníme na Pal, vlastnost NumGlyphs na 3, Spacing na 15 a tlačítko zvětšíme. Obsluha stisku tlačítka bude tvořena příkazem:
    ShowMessage("Prásk");
    a obsluha OnClick značky bude:
    BitBtn1->Enabled = ! BitBtn1->Enabled;
    Nyní již aplikaci můžeme vyzkoušet. Ovládejte aplikaci tak, aby jste uviděli všechny tři obrázky. Když připravujeme bitovou mapu pro tlačítko nebo jinou grafickou komponentu, pak barva, která je použitá v levém dolním rohu, je považována za transparentní (obvykle je to barva clOlive). Transparentní barva je průhledná barva (je vidět barva pozadí).
  14. Návrhový formulář C++ Builderu je vizuální programovací nástroj. Umožňuje umisťovat, vybírat, přesouvat a zarovnávat komponenty. Návrhový formulář také umožňuje měnit velikost a pozici samotného formuláře, přidávat nabídku a vytvářet specializovaná dialogová okna. Místní nabídka návrhového formuláře obsahuje tyto prvky:

  15.  
    Volba Popis
    Align to Grid Přichycuje vybrané komponenty do rastru Návrhového formuláře
    Bring to Front Přesouvá vybrané komponety před ostatní komponenty.
    Send to Back Přesouvá vybrané komponety za ostatní komponenty.
    Revert to Inherited Návrat k původnímu stavu vybraných komponent.
    Align Zobrazí dialogové okno zarovnávání.
    Size Zobrazí dialogové okno změny velikosti.
    Scale Zobrazí dialogové okno změny měřítka.
    Tab Order Zobrazí dialogové okno editace Tab pořadí.
    Creation Order Zobrazí dialogové okno vytvářecího pořadí.
    Add to Repository Přidává tento formulář do Zásobníku objektů (vytváří z něj šablonu).
    View as Text Zobrazí popis formuláře jako text v Editoru kódu. Text formuláře můžeme editovat. Volbou View as Form v místní nabídce Editoru kódů pak opět převedeme text zpět na formulář. Tyto činnosti provádí také Alt+F12.

    U většiny komponent lze měnit velikost. Vybraná komponenta je vybavena záchytnými čtverečky a přetažením těchto záchytných čtverečků myší lze změnit velikost komponenty. Velikost komponenty lze určit již při vkládání komponenty na formulář. Stiskneme tlačítko myši v požadovaném místě levého horního rohu komponenty a tlačítko uvolníme v požadovaném protějším rohu komponenty. Např. u nevizuálních komponent nelze změnit velikost (jsou reprezentovány ikonou).

  16. Návrhový formulář má zabudovaný rastr, který usnadňuje návrh formuláře. Tento rastr je implicitně zobrazen. Rozteč rastru je implicitně 8 bodů (svisle i vodorovně). Při vkládání komponent na formulář (a také při přemisťování)  jsou rohy komponenty umístěny do bodů tohoto rastru. To usnadňuje zarovnávání komponent a také vytváření komponent stejných rozměrů. Používání rastru a jeho rozteč ovládáme na stránce Preferences dialogového okna zobrazeného volbou Options | Environment. Je zde také možno určovat zda rastr bude zobrazený (nezobrazovaný rastr zůstává stále aktivní).
  17. Komponenty umístěné na formuláři musíme před prováděním některých operací s komponentami (přesun, změna vlastnosti, zrušení apod.) vybrat. Výběr jedné komponenty provedeme tak, že na ní klikneme. Vlastnosti a události vybrané komponenty jsou zobrazeny v Inspektoru objektů.

  18. Můžeme také vybrat více komponent, se kterými potom budeme pracovat jako se skupinou. To lze provést třemi způsoby: Při použití prvního způsobu je nutno první komponentu vybrat normálním způsobem a potom stisknout a držet stisknutou klávesu Shift. Nyní, když klikneme na komponentu, pak je přidána do výběru (opětovným kliknutím na již vybrané komponentě ji z výběru odstraníme). Po dokončení výběru klávesu Shift uvolníme.
    Při použití výběrového obdélníku stiskneme tlačítko myši v jednom rohu pomyslného obdélníka obklopujícího vybírané komponenty a přesuneme kurzor myši do protějšího rohu tohoto obdélníka, kde tlačítko myši uvolníme. Rohy obdélníka musí ležet na formuláři a ne na nějaké komponentě. Když již máme takto proveden výběr, pak lze použít předchozí techniku (stisknutou klávesu Shift) k přidání (nebo odebrání) nějaké komponenty k výběru. Můžeme také použít stisknutou klávesu Shift a další tažení výběrového obdélníka. Někdy máme komponenty umístěné na jiné komponentě. Komponenta Panel je často používaná jako kontejner pro další komponenty. Při vkládání komponenty na jinou komponentu postupujeme stejně jako při vkládání komponenty na formulář, s tím rozdílem, že komponeta na kterou vkládáme musí být vybrána. Při výběru skupiny komponent umístěných na jiné komponentě je nutno při použití výběrového obdélníka držet stisknutou klávesu Ctrl.
  19. Přesun komponenty je jednoduchá úloha. Pro přesun komponenty umístíme kurzor myši nad komponentu stiskneme levé tlačítko myši a přetáhneme ji do nové pozice. Při tažení skupiny komponent postupujeme stejně. Po dokončení výběru, umístíme kurzor myši nad některou vybranou komponentu a provedeme tažení do nové pozice. Nelze provést tažení skupiny komponent, pokud tyto komponenty mají různé nadřízené komponenty. Komponenty nelze přesunout mimo jejich nadřízenou komponentu.

  20. Komponenty můžeme uzamknout. Uzamčené komponenty nelze přemisťovat ani měnit jejich velikost. Je to užitečné, když jsme návrh formuláře dokončili a chceme zabránit nechtěnému posunu komponent. Komponenty uzamkneme volbou Edit | Lock Controls. Dalším použitím této volby komponenty opět odemkneme.
  21. Umístěním jedné komponenty na jinou můžeme dosáhnout zajímavého vizuálního efektu. Např. čtverec se stínem můžeme vytvořit umístěním bílého čtverce nad černý čtverec (oba jsou komponenty Shape a horní je nepatrně posunut). Pro získání stejného čtverce (barvu změníme dodatečně) lze použít operace se schránkou. Operace Cut, Copy a Paste se používají běžným způsobem.
  22. Velikost vybrané komponenty lze změnit tažením. U některých komponent nelze velikost změnit (nevizuální komponenty). Velikost skupiny komponent tažením změnit nelze (lze změnit např. změnou vlastnosti Width nebo Height v Inspektoru objektů). Ke změně velikosti vybrané komponenty nebo skupiny komponent o jeden bod, držíme stisknutou klávesu Shift a stiskneme klávesu se šipkou (změna velikosti nastane ve směru šipky). Změnu velikosti vybrané skupiny komponent lze provést i pomocí dialogového okna změny velikosti. Tuto možnost je vhodné použít, když komponenty mají mít stejnou výšku nebo šířku. Dialogové okno zobrazíme volbou Edit | Size. Pro šířku a výšku jsou v okně k dispozici tyto volby: beze změny, zmenšit na nejmenší, zvětšit na největší a zadání konkrétní hodnoty.

  23. Jinou možností změny velikosti je dialogové okno měřítka. Pokud např. chceme zmenšit velikost komponent i samotného formuláře na polovinu, pak zadáme měřítko 50. Dialogové okno zobrazíme volbou Edit | Scale.
  24. Bez ohledu na to, zda rastr formuláře je zapnut, můžeme zarovnávat komponenty na formuláři. K zarovnávání lze použít dialogové okno zarovnávání (Edit | Align) nebo paletu zarovnávání (View | Alignment Palette). Paleta zarovnávání obsahuje tlačítka s volbami: zarovnat levé okraje, vodorovně zarovnat středy, centrovat vodorovně v okně, vodorovně stejné mezery, zarovnat pravé okraje a obdobné volby pro svislé zarovnávání. Dialogové okno zarovnávání nabízí stejné volby jako paleta.
  25. Jiný typ zarovnávání lze nastavit pomoví vlastnosti Align. Tato vlastnost řídí, jak komponenta je zarovnávána v nadřízené komponentě (formuláři). Možné hodnoty jsou uvedeny v následující tabulce.

  26.  
    Hodnota Popis
    alBottom Komponenta je zarovnávána se spodním okrajem nadřízeného okna. Příkladem takto zarovnávané komponenty je stavový řádek hlavního formuláře.
    alClient Komponenta zaplní celou klientskou oblast nadřízeného okna. Pokud jiné komponenty zabírají část klientské oblasti, pak takto zarovnaná komponenta vyplní zbytek klientské oblasti.
    alLeft Komponenta je zarovnána s levým okrajem nadřízeného okna. Příkladem je paleta nástrojů na levém okraji okna.
    alNone Komponenta zůstává tak, jak byla navržena. Implicitní stav pro většinu komponent.
    alRight Komponenta je zarovnána s pravým okrajem nadřízeného okna. 
    alTop Komponenta je zarovnána s horním okrajem nadřízeného okna. Příkladem je paleta nástrojů.

    Použití tohoto zarovnávání si ukážeme na následující aplikaci. Začneme novou aplikaci. Na libovolné místo formuláře umístíme komponentu Panel. Povšimněte si, že vlastnost Align panelu je nastavena na alNone. Změníme tuto hodnotu na alTop a panel se přesune k hornímu okraji formuláře (jeho výška se nezmění) a je rozšířen na šířku formuláře. Když se jej pokusíme přetáhnout doprostřed formuláře, pak se stále vrací k hornímu okraji. Jestliže se pokusíme změnit šířku formuláře, pak se nám to opět nepodaří. Změna výšky panelu ale proběhne bez problémů. Změníme-li vlastnost Align na alBottom, pak se panel přesune ke spodnímu okraji. Při změně Align na alLeft nebo alRight se výška panelu stane šířkou a panel zabírá celou výšku formuláře. V tomto případě nelze měnit výšku panelu. Změna Align na alClient způsobí, že panel pokryje celou klientskou oblast formuláře. Nelze změnit jeho velikost v žádném směru. Po změně Align na alNone je opět možno změnit velikost panelu a přemisťovat jej.

  27. Nyní se pokusíme vytvořit prototyp aplikace, která bude připomínat Notepad Windows. Prototyp je aplikace, která má vzhled pracující aplikace, ale není plně funkční. Začneme vývojem nové aplikace. U formuláře změníme vlastnost Name na Zapisnik a vlastnost Caption na Zápisník 1.0. Zvolíme Project | Options, v zobrazeném dialogovém okně přejdeme na stránku Application a do části Title zadáme Zápisník 1.0. Okno uzavřeme stiskem OK.

  28. Mnoho aplikací má paletu nástrojů. Dříve než ji vytvoříme uděláme prázdné místo při horním okraji okna. Na formulář umístíme komponentu Bevel, změníme její vlastnost Height na 2 a vlastnost Align na alTop. Nyní již začneme vytvářet paletu nástrojů. Na formulář vložíme komponentu panel, změníme její vlastnost Name na Paleta, vlastnost Height na 32, BevelOuter na bvNone, vlastnost Caption vyprázdníme a vlastnost Align nastavíme na alTop. Tím je panel přesunut k hornímu okraji pod již dříve vytvořenou komponentu Bevel (při změně vlastnosti Align na alTop je komponenta přesunuta k hornímu okraji pod dříve vytvořené komponenty se stejně nastavenou vlastností Align; záleží tedy na pořadí komponent, ve kterém je u nich nastavována vlastnost Align).
    Na panel postupně přidáme dvě tlačítka. Na Paletě komponent vybereme SpeedButton a umístíme jej na panel (ne na formulář). Změníme u něj vlastnost Name na OtevreniSouboru, Left na 5, volbou View | Alignment Palette zobrazíme dialogové okno zarovnávání a zvolíme na ní Svislé centrování. Dvojitě klikneme na hodnotě u vlastnosti Glyph a zavedeme soubor FILEOPEN.BMP (je v adresáři Program Files\Common Files\Borland Shared\Images\Buttons). Obdobně vytvoříme tlačítko UlozeniSouboru (Left nastavíme na 32 a soubor FILESAVE.BMP).
    Dále na formulář přidáme stavový řádek (StatusBar; je na stránce Win32 Palety komponent). Ať jej umístíme kamkoli, je vždy přemístěn ke spodnímu okraji formuláře. Změníme jeho vlastnost Name na StavovyRadek.
    Na fotmulář přidáme ještě komponentu Memo. Změníme u ní Name na Memo, zrušíme text v ní zobrazený, vlastnost ScrollBar nastavíme na ssVertical, vlastnost Name vlastnosti Font změníme na Fixedsys a Align na alClient.
    To co jsme vytvořili může tvořit základ skutečné aplikace. Pokud je formulář příliš malý nebo velký můžeme změnit jeho velikost. Všechny komponenty mění svoje rozměry podle rozměrů okna.
    Nyní asi budeme mít problém, pokud budeme chtít vybrat myší samotný formulář (je celý překryt různými komponentami a není možno na něj kliknout). Stiskem Esc vybereme nadřízenou komponentu právě vybrané komponenty. Takto je možno vybrat v tomto případě formulář.
    Pokud nyní náš prototyp spustíme, pak do komponenty Memo je možno zapisovat text a můžeme stisknout některé z tlačítek palety (nic se ale nestane). Aplikace zatím není plně funkční. Později ve vývoji této aplikace budeme pokračovat. Jednotku formuláře uložíme pod jménem ZapisHlavni a projekt jako Zapis.
  29. Tab pořadí určuje pořadí, ve kterém komponenty získávají zaostření při stisku klávesy Tab. Formuláře C++ Builderu automaticky podporují navigaci po komponentách pomocí klávesy Tab. Na následující komponentu přejdeme stiskem Tab a na předchozí stiskem Shift+Tab.

  30. Jsou dva typy vizuálních komponent. Windowsovské komponenty jsou komponenty, které mohou získat zaostření (Edit, ListBox, Button a mnoho dalších). NeWindowsovské komponenty zaostření získat nemohou (Image, SpeedButton a další). Tab pořadí se týká pouze Windowsovských komponent.
    Původně je Tab pořadí určeno pořadím vkládání komponent na formulář. Tab pořadí lze změnit modifikací vlastnosti TabOrder pro jednotlivé komponenty v Inspektoru objektů. Tato metoda je ale poněkud složitá. Jiná možnost je použití dialogového okna editace Tab pořadí (zobrazíme je volbou Edit | Tab Order). Toto dialogové okno zobrazuje všechny Windowsovské komponenty současného formuláře podle nastaveného Tab pořadí. Ke změně Tab pořadí klikneme na jméno komponenty u které chceme změnit Tab pořadí a pomocí tlačítek šipek ji přesuneme do požadovaného pořadí. Tab pořadí je číslováno od nuly. Někdy chceme zabránit v přechodu na některou komponentu. K odstranění některé komponenty z Tab pořadí, nastavíme vlastnost TabStop této komponenty na false. Ke změně zaostření můžeme použít metodu SetFocus. Např. ke změně zaostření na komponentu Button1 použijeme příkaz:
    Button1->SetFocus();

Kontrolní otázky:

  1. Pokud Paleta nástrojů C++ Builderu neobsahuje tlačítka voleb, které často používáme, lze Paletu nástrojů doplnit?
  2. Po umišťování více komponent Label na formulář se snažíme vybrat některou komponentu. Namísto výběru je na formulář vložena další komponenta Label. Co děláme špatně?
  3. Co musíme udělat, abychom vybrali skupinu komponent umístěných na panelu?
  4. Proč používá C++ Builder termín jednotka při odkazování na zdrojový soubor?
  5. Jak zobrazíme dialogové okno Editoru palety nástrojů C++ Builderu?
  6. Jaký je nejjednodušší způsob pro umístění více stejných komponent na formulář?
  7. Jakou metodu používáme k zobrazení modálního formuláře?
  8. Jakou metodu používáme k zobrazení nemodálního formuláře?
  9. Jak lze přiřadit k události již definovanou obsluhu události?
Řešení
15. Formuláře II