Dnes se vrátíme k textovému editoru a rozšíříme ho o panel nástrojů a do okna „O aplikaci“ přidáme Easter Egg.
Vítám vás u dalšího dílu kurzu. Dnes se vrátíme k textovému editoru, takže doufám, že jste ho od minula nezlikvidovali :-).
Návrh uživatelského prostředí
Na formulář ke stávajícím komponentám přidejte ještě tyto:
Komponenta | Název (name) | Další atributy |
TToolBar | toolbar | Přehled tlačítek a popis v tabulce níže |
TImageList | ikonky | žádné |
Tlačítka na Tollbaru:
Název (name) | Typ | Popis (caption) |
novy_btn | Button | Nový |
otevrit_btn | Button | Otevřít |
ulozit_btn | Button | Uložit |
-- | Separator | -- |
oaplikaci_btn | Button | O Aplikaci |
Také si přes nabídku File → Open
otevřete druhý formulář, okno O Aplikaci. Zde vám v návrhu nechám volnou ruku.
Určitě jste již slyšeli o tzv. Easter Eggs (pokud ne, mrkněte sem), takže si do svého editoru také jedno vajíčko vložíme. Po nějaké kombinaci kláves v dialogu O Aplikaci se zobrazí obrázek.
TImage
Komponenta TImage slouží, jak jinak, než k zobrazování obrázků. Plátno této komponenty lze využít i k softwarovému kreslení (vykreslování pomocí příkazů). Obrázek se nahrává přes ObjectInspector do Picture (nebo příkazem Image.Picture.LoadFromFile(soubor: string)). Další významnou vlastností je AutoSize, která je typu boolean a určuje, jestli se rozměry komponenty mají přizpůsobit nahranému obrázku. Opačně funguje vlastnost Stretch, která určuje, jestli se rozměry obrázku mají přizpůsobit rozměrům komponenty. Pokud obě vlastnosti necháte vypnuté (false), zobrazí se výřez.
Toolbar
Komponenta Toolbar slouží jako základ panelu nástrojů. Lze na ni umístit komponentu TCoolBar (přesouvací panel nástrojů), ale umí sama obsahovat i tlačítka. Kromě tlačítek zná i tzv. oddělovače (separators), ty vizuálně oddělují jednotlivé bloky tlačítek.
Tlačítko nebo oddělovač přidáte jednoduše tím, že kliknete pravým tlačítkem myši na Toolbar a v kontextové nabídce vyberete buď Button nebo Separator. Výhodou je, že události tlačítek lze provázat s událostmi položek menu, takže není nutné znovu ručně programovat všechny události.
ImageList
ImageList je speciální komponenta sloužící k přechovávání ikonek tlačítek apod. Výhodou je, že obrázky se automaticky vloží do programu, takže je není nutné potom distribuovat spolu s programem v samostatných souborech.
Programujeme!
Nejdřív začneme tím menu. Ale ještě předtím je nutné nahrát do ImageListu nějaké ikonky. Ikonky si stáhněte zde (ZIP archiv, ~1,3 kB) a rozbalte je do adresáře s programem. Potom dvojklikem na komponentu ImageList otevřete Seznam obrázků. Tlačítkem Add přidejte všechny čtyři ikonky. Delphi pozná, která barva se má nastavit jako transparentní (průhlednou). Tlačítkem OK dialog zavřete. Nyní v Object Inspectoru vyberte komponentu ToolBar a u vlastnosti Images vyberte z rozbalovacího menu komponentu ikonky (ImageList). Na tlačítkách by se měly hned objevit obrázky. Pokud jsou ve špatném pořadí (měly by být Nový, Otevřít,Uložit, O Aplikaci), otevřete Seznam obrázků v ImageListu a tažením myši je prohoďte.
Teď v Object Inspectoru otevřete tlačítko Nový (novy_btn) a u vlastnosti MenuItem vyberte Nov1 (Delphi se snaží pojmenovat položky menu podle popisky. Protože ale je diakritika v názvu nepřípustná, tak tyto znaky vynechává, tedy z Otevřít udělá Otevt apod.). Totéž proveďte s tlačítkem Otevřít (otevrit_btn), akorát zde vyberte položku Otvt1. Stejný postup použijte i na zbylá tlačítka na panelu nástrojů. Tím jsme tlačítka na panelu nástrojů provázali s položkami menu. Pokud teď kliknete na tlačítko, je to stejné, jako kdybyste klikli na to samé v menu. To se dá řešit i tím, že přiřadíme tlačítku událost OnClick patřící příslušné položce v menu, ale tento způsob provázání má ještě další výhody. Například pokud nastavíte Visible položky menu na false, provede se automaticky totéž i s tlačítkem a naopak.
Po těchto odstavcích samozřejmě očekávám divokou diskuzi na téma „klikací programování“. Jak jste si ale jistě uvědomili, ušetřili jsme tím hodně času a kódu. Tohle je jedna ze základních výhod „klikacího programování“. Je nutné se smířit s tím, že toto je kurz programování v Delphi a Delphi jakožto IDE kladou na „klikací programování“ důraz!
Dalším krokem bude Easter Egg v okně O Aplikaci. Vlevo si můžete prohlédnout, jak vypadá moje okno O Aplikaci, ale jak jsem řekl na začátku, jeho provedení nechám na vás. Vyhrajte si, jak jen chcete.
Nejprve nadeklarujte proměnnou egg typu string a rovnou ji inicializujte, stejně tak proměnnou znak typu integer:
egg: string = 'DELPHI';
znak: integer = 0;
Jistě vás napadlo, k čemu proměnna egg slouží. Obsahuje text, který musí uživatel napsat, aby na něj ono vajíčko vyskočilo. Proměnná znak slouží k počítání, kolik toho už uživatel napsal.
Dalším krokem je procedura obsluhující událost onKeyDown:
procedure To_aplikaci.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var ea: TForm;
img: TImage;
begin
if ssCtrl in Shift then //pokud je sisknuty Control
if Key = Ord(egg[znak]) then //pokud stisknuta klavesa odpovida ocekavanemu znaku
if znak = Length(egg) then begin //pokud uz je napsan cely text, tak udelame Easter Egg
ea:=Tform.Create(o_aplikaci); //vytvori za behu novy formular
ea.borderStyle:=bsNone; //bez ramecku
ea.Position:=poDesktopCenter; //umistime na stred obrazovky
ea.OnClose:=OnClose; //priradime mu udalost onClose
img:=Timage.Create(ea); //na formular umistime okno
img.Parent:=ea;
img.AutoSize:=true;
img.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'easteregg.jpg'); //nacteme obrazek
ea.Width:=img.Picture.Width; //prizpusobime rozmery okna
ea.Height:=img.Picture.Height;
ea.Show; //a zobrazime ho
znak := 1; //a jeste resetujeme pocitadlo znaku
end else znak := znak + 1 //pokud jeste neni napsano cele slovo, tak posuneme znak
else znak := 1; //pokud byl stisknut spatny znak, tak zase na zacatek
end;
Ještě do USES přidejte knihovnu jpeg. Obrázek, který se má zobrazit, uložte do adresáře s programem a nazvěte ho easteregg.jpg (tady nejde o to toto vajíčku nějak skrývat, cílem je ukázat, jak lze zpracovávat vstup z klávesnice a že je možné vytvořit za běhu nejen komponentu, ale i celý formulář a na něj komponentu).
Nyní ještě nadeklarujte obslužnou proceduru k události OnClose formuláře form2:
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if (Sender as TForm).Name<>'form2' then //pokud nejde o Form2
(Sender as TForm).Free; //pak dany formular uvolnit z pameti
end;
Tato událost je volána nejen z formuláře form2, ale i z onoho virtuálního formuláře, který jsme vytvořili, když je uzavřen (lze uzavřít přes Alt+F4). Pokud je Sender (objekt, který danou proceduru zavolal) formulář form2, tak se nic nestane. Pokud je však volajícím objektem formulář easter egg, pak ho uvolníme z paměti.
A jsme zase na konci
Příště pravděpodobně ještě zůstaneme u editoru, ale jaké tam budeme provádět změny, sám ještě netuším :-).
Úkol
Tentokrát žádný není :-).