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