Druhý Form

Většinou nevystačíme s jediným formulářem. Druhý Form vytvoříme snadno - v menu zvolíme File a New Form (také je možné použít ikonku, zpravidla čtvrtá v druhé řadě, s nápovědou New Form). Při spuštění programu se ovšem vždy zobrazí jen ta první. O zobrazení ostatních si musíme říci.

Popis komponenty Form2 je v další unitě, statndartně se jmenuje unit2 [obojí lze pochopitelně přejmenovat - jméno formuláře pomocí Object Inspectoru, vlastnost (property) Name, jméno unity při ukládání projektu na disk; mimochodem, nesmíme zapomenout po vytvoření unit2 ihned znovu uložit celý projekt (File - Save Project As...) do vhodného adresáře, do kterého máte právo na zápis].

Pokud budeme chtít s unit2 pracovat (například zobrazit Form2), musíme překladačí říci, že ji budeme v unit1 používat. Vyhledáme záložku unit1 (pozor, editor nyní nabízí dva listy, pojmenované podle unit) a zde deklaraci uses (skoro nahoře). Někam, nejlépe na konec seznamu, doplníme jméno naší unity - unit2:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes,
  Graphics, Controls, Forms, Dialogs, unit2;

type

Překladač při sestavování programu postupuje tak, že nejprve přeloží všechny zde uvedené unity, a teprve poté pokračuje v překladu dále na stránce. Pokud tedy budeme z unit2 potřebovat volat unit1 (někdy to není nutné), nemůžeme toho již dosáhnout výše uvedeným postupem, jakkoli je ve výše uvedeném případě jediný správný. Musíme najít místo, kde lze uvést interní deklaraci unity, aniž by tato měla vliv na ostatní soubory. Takové místo je za klíčovým slovem implementation. Zde již není uvedeno nic, takže deklaraci uses si musíte vytvořit sami (připomínám, že text je v souboru unit2.pas, pro nás na záložce unit2):

implementation

uses unit1;
{$R *.DFM}

procedure TForm2.Edit1Change(Sender: TObject);

Text byl převzat z konečné verze dále řešeného příkladu, původně následoval jen end s tečkou, označující konec překladu. Nyní k zadání: Máme vytvořit pomocný formulář, na kterém bude komponenta Edit, umožňující změnit text na původním formuláři - pro zjednodušení například samotný název okna formuláře, Form1.Caption. Rozmístění komponent po ploše bude u Form1 a Form2 následující:

Na formuláři Form2 je již připraven ScrollBar pro další pokračování příkladu.

Prozatím není nutné nic měnit v Object Inspectoru. Do unit1 dopíšeme jen obsluhu tlačítka, vyvolávajícího druhý formulář. Formulář lze zobrazit už jen tím, že mu přepneme property Visible na True, což má stejný význam, jako vyvolání metody Show u příslušného formuláře. V tomto okamžiku můžeme pracovat na obou formulářích současně. Protože zejména u složitějších programů může docházet k chybám, pokud jsou současně aktivní dvě okna, budeme se snažit této metodě vyhnout a volat raději metodu ShowModal, která způsobí, že právě zobrazené okno nude jediné aktivní. Jedinou nevýhodou je, že se nesmí stát, aby okno zmizelo (např. nastavením Visible na False), protože pak by nebylo zobrazeno žádné okno, které by umožňovalo pokračovat v práci s programem.

procedure TForm1.Button1Click(Sender: TObject);
begin
  unit2.Form2.ShowModal;
end;

Obdobně do unit2 zapíšeme jako obsluhu události OnChange komponenty Edit1 přenesení obsahu textu do záhlaví formuláře:

procedure TForm2.Edit1Change(Sender: TObject);
begin
  unit1.Form1.Caption := Edit1.Text;
end;

Protože nedochází ke dvojznačnosti, není vlastně třeba psát ve výše uvedených případech slova unit1 a unit2 (například ve druhém případě by stačilo napsat Form1.Caption := Edit1.Text;). Zůstanu u složitějšího zápisu z důvodu přehlednosti.

Zůstaneme ještě okamžik u tohoto příkladu a ukážeme si na něm využití komponenty ScrollBar (ikonka na liště Standard). Tato komponenta se často používá k nastavení nějakého parametru v zadaném rozsahu, tažením myší. Může být kdekoli na ploše. Pomocí property Kind můžeme nastavit, zdali bude vodorovně, nebo svisle (sbHorizontal, sbVertical). Rozsah, ve kterém vrací čísla, je dán nastavením vlastností Min a Max. Hodnotu odečítáme v property Position. Pokud je skutečný grafický rozsah menší, než zadaná čísla, můžeme k přesnějšímu nastavení návratové hodnoty (Position) použít šipky, které ji mění o jedničku (vše jsou samozřejmě celá čísla).

ScrollBar umístíme na Form2 a použijeme jej pro posouvání tlačítka Button1 po ploše prvního okna. Rozsah posouvání je dán velikostí okna (Form1.ClientWidth) a šířkou tlačítka (Form1.Button1.Width). Property Max je ovšem třeba nastavit předtím, než bude poprvé použita, tedy před zobrazením druhého okna. Protože je zobrazeno funkcí ShowModal, není třeba ošetřovat, zda nedošlo ke změně velikosti prvního formuláře - to se prostě stát nemůže. Nová obsluha tlačítka tedy bude vypadat následovně (šedivě generované úseky i obsluha z původního příkladu):

procedure TForm1.Button1Click(Sender: TObject);
begin
  unit2.Form2.ScrollBar1.Max :=
    Form1.ClientWidth - Button1.Width;
  unit2.Form2.ShowModal;
end;

Vlastní ošetření funkce OnChange u Scrollbar1 v unit2 pak již je jednoduché:

procedure TForm2.ScrollBar1Change(Sender: TObject);
begin
  unit1.Form1.Button1.Left := ScrollBar1.Position;
end;

Řešený příklad naleznete v příslušném adresáři. Pro další komponenty již raději použijeme nový formulář.


Další vlastnosti již probraných objektů

Nejprve si připravíme nový program (File - New Application). Jako vždy v učebně jej nejprve uložíme do jiného adresáře. Pro následující úlohu si na formulář připravíme tlačítko a tři CheckBoxy. Přepíšeme hodnotu vlastností Caption na "Tlačítko" a na jména vlastností "Enabled", "Visible" a "ShowHint", které budeme zkoušet. Přepneme hodnotu vlastnosti Checked u všech tří CheckBoxů na True, protože výchozí hodnota v programu bude taková.

Visible označuje, zda je daný prvek na formuláři viditelný. Lze jej použít ke skrytí prvků, které v dané situaci nemají na formuláři opodstatnění. Někdy se také používá k alternativnímu zobrazení - například na stejném místě formuláře se dle situace, například podle zadaného hesla, zobrazí buď políčko Edit, nebo text Label.

Enabled u tlačítka označuje, zda je lze stiknout a vyvolat tak jemu přiřazenou funkci. U políčka Edit značí, že je povoleno text editovat. Pokud je tato vlastnost u objektu nastavena na False, objekt je zobrazen šedivě a nelze jej ovládat (uživatel nemá tuto možnost - program však stále může například u Edit měnit hodnotu vlastnosti Text a tím obsah Edit boxu.

Property Hint poskytuje nejsnazší možnost, jak rychle poskytnout uživateli krátkou nápovědu. Obsahuje krátký text, který se na okamžik objeví pod objektem v případě, že na něj najedeme kursorem myši. Jako ukázku si můžete zkusit najet kursorem na kteroukoli ikonku v Delphi. Nestačí vyplnit hodnotu této vlastnosti, je třeba také nastavit hodnotu vlastnosti ShowHint na True.

V našem programu si vyplníme property Hint na vhodnou hodnotu (zadáme nějaký text) a doplníme vhodnou obsluhu všech tří CheckBoxů:

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
  Button1.Visible := CheckBox1.Checked;
end;

procedure TForm1.CheckBox2Click(Sender: TObject);
begin
  Button1.Enabled := CheckBox2.Checked;
end;

procedure TForm1.CheckBox3Click(Sender: TObject);
begin
  Button1.ShowHint := CheckBox3.Checked;
end;

Vyřešený příklad naleznete v příslušném souboru.


RadioButton

RadioButton se vyskytuje obvykle ve skupině. Název pochází z přepínačů vlnových rozsahů starých rádií (tranzistoráků), kde šlo stisknout vždy jen jedno tlačítko (nebo mělo jít - na jednom takovém se mi podařilo stisknout dokonce všechny čtyři najednou). Na aktivním formuláři může být vždy jen jedno stisknuté tlačítko tohoto druhu současně. Z druhé strany, pokud již uživatel vašeho programu nějaké tlačítko stiskne, bez podpory programu bude pak vždy některé z nich stisknuté. Těmito dvěmi vlastnostmi se liší od CheckBoxu; je-li stisknuto, zjistíme v property Checked.

 

Často potřebujeme více skupin takových tlačítek, nebo je prostě jen chceme obsluhovat (psát k nim program) společně. V tomto případě zvolíme komponentu RadioGroup. Texty (názvy) jednoltivých tlačítek pak vyplníme v property "Items". Items je typu TStrings - v dané kolonce klikneme na tlačítko s třemi tečkami a vyplníme příslušný formulář, jedno jméno tlačítka pro jeden řádek. RadioGroup má některé omezení, například všechny texty jsou stejným fontem (a tedy i stejnou barvou), nebo nelze odstranit rámeček okolo skupiny tlačítek. Výhodou je, že číslo stisknutého tlačítka lze najít v property ItemIndex. První tlačítko má číslo 0, druhé vrací číslo 1, třetí 2, atd., podle počtu vyplněných řádek. Pokud zde dosadíme hodnotu -1, nebude vybráno žádné tlačítko.

Další neprobrané objekty - prohlédněte si je sami a všimněte si zmíněných vlastností (properties):

ListBox. Items (Tstrings), ItemIndex; Multiselect, SelCount, Selected[i].

ComboBox.

BitBtn. Kind, ModalResult, Glyph.

MaskEdit - EditMask...

StaticText. BorderStyle.