(Na stránce se ještě pracuje)

Cvičení 2

Práce se šablonou Win 98 Logo App

Když se nový formulář v Delphi vytvoří pomocí ikonky New, vytvoří se standardní nový formulář a k němu příslušná Unit. Pokud se ale nový formulář vytvoří z menu File-->New, otevře se nejprve okno s nabídkou mnoha předpřipravených formulářů.

Za zmínku stojí především záložka New a v ní formuláře Application a Form (nová standardní aplikace a formulář), Unit (samotná Unit bez formuláře), DLL (knihovna DLL), DataModule (datový modul = formulář za běhu neviditelný, který budeme v příštím semestru používat k uložení komponent pro práci s databázemi), Component (nová komponenta) a Batch File (aplikace bez grafického rozhraní).

Na záložce Project1 (jméno se při přejmenování vašeho projektu změní podle aktuálního projektu) se objevují všechny typy formulářů, které jste si ve svém projektu vytvořili. Důležité je, že nový formulář se dá buď vytvořit okopírováním vzoru (volba Copy ve spodní části okna), nebo se může zdědit pomocí Inherit (v takovém případě se veškeré změny v rodičovském formuláři automaticky promítají též do všech zděděných formulářů), nebo se někdy dá prostě použít ve vašem projektu (např. About Box na záložce Forms).

Na záložce Projects je důležitá šablona Win95 Logo App. Jedná se o šablonu formuláře, který má všechny podstatné vlastnosti, které mívají aplikace pro windows: hlavní menu, toolbar s tlačítky, seznam akcí, seznam obrázků, dialog pro otevření souboru, dialog pro zápis souboru, předdefinované akce pro práci se schránkou (clipboardem) a stavový řádek.

Řešená úloha

Vytvořte aplikaci s Win95 Logo App, která má tyto vlastnosti:

  1. umí načíst zvolený textový soubor,
  2. umí ho uložit pod jiným jménem.
  3. Soubor musí být možno editovat a pracovat s ním pomocí schránky (clipboardu).
  4. Při vytvoření nového souboru se v případě, že obsah okna není prázdný, aplikace musí nejprve zeptat, zda se má stávající text uložit a kam.
  5. Okno nápovědy About musí podávat správné informace.
  6. V menu Edit musí být akce Select All se zkratkou Ctrl+A, která vybere všechen text.
  7. Pomocí pop-up menu (na pravé tlačítko myši) musí jít dělat stejné akce, jako jsou v hlavním menu pod položkou Edit.
  • Popis řešení naleznete zde.
  • Neřešené úlohy

    (Tady časem bude několik úloh ke zkoušce)

    Jak se vytvářejí jednoduchá dialogová okna

    Nejjednodušší způsob, jak vyvolat dialog s uživatelem, je pomocí předdefinovaných procedur MessageDlg a ShowMessage.

    Řešená úloha

    Vytvořte jednoduchý formulář se dvěma tlačítky, kterými se vyvolá:

    1. dialogové okno s dvouřádkovým (!) textem a s tlačítkem OK,
    2. chybový dialog s více tlačítky.
    3. Zjistěte, kterým tlačítkem uživatel odpověděl.

    Vyřešený příklad je zde.

    Přepínání mezi formuláři

    Docela typický případ je, když potřebujeme z jednoho formuláře vyvolat jiný formulář. Postupujeme tak, že pomocí New Form vytváříme nové a nové formuláře (pokud si mají být v něčem podobné, s výhodou použijte dědění - volba Inherited na stránce File-->New-->Project1) a ty potom navzájem voláme. Volání se jednoduše uskuteční tak, že se zavolá metoda Show toho formuláře, který se má objevit.

    Maličká komplikace je v tom, že když jsme např. ve formuláři Form1 a chceme zavolat Form2.Show, tak to nejde, protože Form1 žádný Form2 nezná. Abychom tuto komplikaci vyřešili, musíme do klauzule USES formuláře Form1 přidat název jednotky, ve které je Form2 obsažen, tzn. Unit2. Ale musí se to udělat chytře. O tom je následující příklad:

    Řešená úloha

    Vytvořte 3 formuláře: šedý (základní), modrý a červený, z něj zděděné. Na formulářích vytvořte tlačítka a s jejich pomocí přecházejte z jednoho formuláře do druhého a zpátky.

    Řešení je, jak výše ukázáno, vcelku jednoduché. Příslušné jednotky Unit2 a Unit3 prostě zapíšeme v Uses uvnitř Unit1. Obráceně (zapsat Unit1 do Uses v Unit2,3) nemusíme, a to hned ze dvou důvodů. Jednak už tam zapsané jsou (z důvodu dědění po Form1), jednak se ve Form2,3 žádné Show přímo nevolá, viz další odstavec. Výsledné formuláře se chovají správně - na tlačítko s barvou se vyvolá příslušný formulář, při zavření barevného formuláře se řízení vrátí do šedivého formuláře. Při zavření šedivého formuláře se zavřou všechny objekty, které vlastní, tedy i formuláře Form2 a Form3.

    Povšimněte si, že ve Form2 ani Form3 nepotřebujeme do Uses zasahovat, přestože z Form2 voláme Form3 a naopak. To proto, že volání je provedeno už ve Form1 (pomocí ActionList) a do Form2, Form3 se zdědilo. Kdybychom z Form2 chtěli zavolat Form3 přímo, tedy nikoliv zděděním, museli bychom ve Form2 do Uses zapsat Unit3, jak je to v příkladu.

    Kdybychom nechtěli, aby se začínalo formulářem Form1, ale třeba Form2, museli bychom v menu Project-->Options-->Forms přerovnat pořadí formulářů; ten, který je jako první (a současně je v okénku Main Form), se automaticky objeví při spuštění aplikace. Ostatní se sice vytvoří, ale jako neviditelné. Příklad je zde. U té příležitosti si povšimněme toho, že když ve vlastnosti Glyph tlačítka už něco je, zůstane to tam i při změně Action. Takže, když chceme změnit Action na něco jiného, musí se nejdříve obsah Glyph vymazat, jinak by nám tam zůstala stará ikonka.

    To, že se všechny formuláře rovnou vytvořily, má své výhody (Show se provede rychle), ale také své nevýhody (zabírají systémové zdroje). Proto ve specielních případech je možné způsobit, že se vytvářejí až při zavolání. V takovém případě je přesunete do pravého sloupečku a při stisku tlačítka se před zavoláním Show musí formulář nejdříve vytvořit (viz 3. přednáška).

    Závěrem podotkněme, že se snadno může stát, že dojdeme k cyklickému odkazu. Například v Unit1.Uses by mohlo být uvedeno Unit2 a Unit3 (kvůli volání formulářů) a současně by v Unit2.Uses bylo uvedeno Unit1 (kvůli dědičnosti). To samozřejmě není dovoleno. Řešením je, že se jeden z těchto Uses, v našem případě ten v Unit1, neuvede v části INTERFACE, ale až v části IMPLEMENTATION.

    Neřešené úlohy

    (Zde bude několik příkladů ke zkoušce.)

    Modální vyvolání formuláře

    Formuláře, se kterými jsme dosud pracovali, byly nemodální, tzn. z jednoho šlo přecházet do druhého, aniž by se předcházející formulář zavřel. Nyní se seznámíme s formuláři modálními, tj. takovými, které nelze opustit (v rámci jedné aplikace) jinak, než že se zavřou.

    Je třeba zdůraznit, že modálnost či nemodálnost není vlastnost okna, ale je to určeno způsobem, jakým se okno otevře. Kdybychom v předcházejícím příkladu namísto Show volali metodu pro modální otevření ShowModal, formuláře by se chovaly modálně.

    ShowModal je funkce, podle jejíž návratové hodnoty jde určit, jakým způsobem bylo okno ukončeno. Ve skutečnosti totiž formulář obsahuje vlastnost ModalResult a okno se (modálně) ukončí, když se do této proměnné přiřadí jakákoliv nenulová hodnota. Tato hodnota pak slouží jako návratová hodnota z funkce ShowModal. Když na formuláři umístíme tlačítka typu TBitBtn, tato tlačítka (s výjimkou Helpu, který aktivuje nápovědu) se už sama postarají o správné nastavení vlastnosti ModalResult. ModalResult se také nastaví na mrCancel, když zavřeme formulář. Tlačítko samozřejmě můžeme donutit, aby odesílalo do Modal Result jakoukoliv hodnotu; buď nastavíme požadované číslo do ModalResult tlačítka, jak je to uděláno u tlačítka "Help" v příkladu, nebo můžeme Modal Result nastavit v obslužné proceduře tlačítka, jako jsme to (z pedagogických důvodů) udělali u tlačítka Abort.

    Standardní dialogy

    Od modálně volaných formulářů už je jen krůček k vlastním dialogovým oknům. V podstatě by stačilo u formuláře nastavit vlastnost BorderStyle na hodnotu bsDialog. V Delphi ale můžeme s výhodou využít už předdefinované standardní dialogy. Standardní dialogy vracejí boolean hodnotu, podle které se pozná, jestli jsme něco zadali nebo ne (Storno). V případě že ano, lze v dialogovém objektu najít mnoho užitečných výsledků.

    Zadání z hlediska semestrální práce

    Nyní už bylo procvičeno všechno, co je třeba k vytvoření formulářů a jejich propojení pomocí jednoduchého volání. Do příštího cvičení už byste měli mít vytvořená všechna okna k semestrální práci, včetně dialogů. Mělo by být možno v logickém sledu přecházet z jednoho do druhého a měla by být vidět nejzákladnější funkčnost. Do podrobnější funkčnosti se nepouštějte, na příštím cvičení se nejprve seznámíme s důležitými komponentami.