DoporučujemeZaložit web nebo e-shop

Návody

 

Návod na delphi by ...Kukensius

  1. Pokud chcete vůbec programovat, potřebujete program, ve kterém byste vytvářeli ty své. A jelikož zde budu psát jak programovat v Borland Delphi, budete si nějaké muset pořídit. Novější verze můžete stáhnout z internetu ( na stránkách borlanduhttp://www.borland.com/products/downloads/download_delphi.html - 169MB), ale i stejně jako starší si je můžete koupit. Nákup má tu výhodu, že dostanete příručku a nevýhodu, že musíte najít a dojít do obchodu, kde Delphi prodávají. Říkáte si: "A co ty peníze co za něj utratím? To toho Kuka nezajímá?" Ale ano, vím o nich, ale říká se, že čas jsou peníze a při stahování tak velkého souboru ztratíte spoustu času, tudíž jsem ten čas a peníze vykrátil. image
     

  2. A teď se dostáváme k samotnému programování:
    SEZNÁMENÍ S PROSTŘEDÍM:
    Delphi je složeno ze čtyř nebo pěti oken.
     1. okno, to nahoře obsahuje menu a nabídku objektů, které můžete vložit do svého programu("Delphi X - Project1").
     2. okno, to vlevo dole obsahuje editor nastavení funkcí vloženého a vybraného objektu("Object Inspector").
     3. okno, to vpravo dole s plochou na psaní je jakoby papír, na který svůj program píšete("Unit1.pas").
     4. okno, to zbylé vpravo dole je předloha okna vašeho programu, do níž umísťujete objekty("Form1").
     5. okno, je vlevo uprostřed a je jenom v novějších verzích. Je v něm vlastně jakýsi strom vašich objektů("Object TreeView").
     
  3. Abyste mohli programovat, potřebujete zatím těchto 5 věcí, které se píší v textovém okně ("Unit1.pas") :
         1. příkaz se ukončuje středníkem (" ; ")
         2. text se ohraničuje apostrofy ("  'Ahoj!'  ")
         3. k srovnání dvou věcí se používá dvojtečka a rovná se (" := ")
         4. vlastnosti se od objektů oddělují tečkou (" . ")
    Př.: Edit.Text := 'Toto je zápisník!';
         5. příkaz pro zavření okna je CLOSE (" Close; ")

     
  4. Začněme oknem "Object Inspector":
    Je rozdělený na tři části:
      1.: Nejvýše umístěná je část, kde si vybíráte objekt, jehož parametry chcete nastavovat.
      2.: Pod ním jsou dvě záložky("Properties" a "Events"), kterými změníte tabulku dole z tabulky vlastností na tabulku Akcí a naopak.
      3.: Tabulka dole je nejdůležitější. V ní editujete různé věci, jako například šířku, nápis atd.

    Protože každý objekt má své vlastní speciální vlastnosti, budu zde popisovat ke každému objektu tabulku dole zvlášť. Teď však napíšu všeobecnosti, které potom budu vynechávat:
        Name - název objektu, který budete potom používat při písemném editování programu.
        Left - pozice objektu (jak moc vpravo bude) braná vzhledem k jemu nadřazenému objektu (např.: Left = 100 u okna - Okno bude 100 pixelů od levé části obrazovky; Left = 100 u tlačítka - Tlačítko bude 100 pixelů od levé části okna programu)
        Top - pozice objektu (jak moc dole bude) braná vzhledem k jemu nadřazenému objektu (např.: Top = 100 u okna - Okno bude 100 pixelů od vršku obrazovky; Top = 100 u tlačítka - Tlačítko bude 100 pixelů od vršku okna programu)
        Visible - nastavuje se akorát True, nebo False (T.=Ano, F.=Ne), zda bude objekt vidět (Pozn.: Radši to nezkoušejte u okna, těžko se pak zavírá image)
        Enabled - nastavuje se akorát True, nebo False (T.=Ano, F.=Ne), zda bude objekt přístupný (bude vidět, ale bude zašedlý a například na tlačítko nepůjde mačkat)
        Tag - to je spíš jen taková blbůstka pro vás, ale stejně jako NAME to má každý objekt. Je to jakékoli číslo (INTEGER - viz příště), které určíte, můžete ho měnit a je to vlastně taková proměnná pro každý objekt (ten si jí však nevšímá - není na ní závislý)

    No, tak to je ze všeobecných věcí přibližně všechno, tak se vrhněme na první objekt, OKNO (FORM)!
     
  5. Vybrat ho můžete buď kliknutím na něj v Delphi okně s ukázkou, nebo vybráním v horní části Object Inspectoru. Jednodušší je ale požít kliknutí (zvláště, když nevíte jak se ten a ten objekt jmenuje).

      Když před změnami v Object Inspectoru kliknete na okno, objeví se v horním rámečku v OI(Object Inspector) nápisForm1          TForm1. To znamená že máte vybrán objekt typu TForm1, který se jmenuje Form1. Změníme-li v tabulce Properties řádek Name (jméno, jak znáte již z předchozího textu) třeba na OknoHra, bude nápis OknoHra          TOknoHra.

      V tabulce Properties je spoustu věcí. Tak vám vypíšu ty nejdůležitější, ale i těch je příšerně moc:

        BorderStyle - Tohle se vám někdy může hodit, určuje se zde styl rámu okna:
              -bsDialog-okno má stálé rozměry (šířku a výšku), nemá ikonu a má pouze tlačítko pro uzavření okna.
              -bsNone-okno prostě nemá okraj. Ani horní lištu s tlačítkem pro zavření.
              -bsSingle-okno má stálé rozměry (šířku a výšku), ale dá se maximalizovat a minimalizovat. Jinak má vše!
              -bsSizeable-okno má všechno příslušenství a dá se roztahovat (měnit rozměry).
              -bsSizeToolWin-okno se dá roztahovat (měnit rozměry), horní lišta je užší, nemá ikonu a má pouze tlačítko pro uzavření okna.
              -bsToolWindow-okno má stálé rozměry (šířku a výšku), horní lišta je užší, nemá ikonu a má pouze tlačítko pro uzavření okna.

        BorderWidth - šířka okraje okna (místo, kam nemůžete vkládat objekty)

        Caption - nápis vlevo nahoře na liště okna (napravo vedle ikony)

        Color - barva pozadí okna

        Constraints - maximální a minimální rozměry roztahovatelného okna, dělí se na MaxHeight(maximální výška okna), MinHeight(minimální výška okna), MaxWidth(maximální šířka okna) a MinWidth(minimální šířka okna)

        Cursor - tvar kurzoru myši, když ukazuje na okno

        Height - výška okna při spuštění (v pixelech)

        Hint - popisný, pomocný text, který se objeví po chvíli držení kurzoru nad oknem

        Icon - ikona vlevo nahoře na liště. Načtete jí z disku a zůstane uložená v programu

        Menu - vyberete si název menu, které bude zobrazeno v okně (musíte ale nejprve nějaké vytvořit)

        PopupMenu - vyberete si název postranního menu, které bude zobrazeno po kliknutí pravým tlačítkem myši na okno (musíte ale nejprve nějaké vytvořit)

        Position - nastavíte pozici okna na obrazovce. Je zde spoustu typů, ale já nevidím moc velké rozdíly. Jediné co používám je poScreenCenter, čímž se okno při spuštění pokaždé vycentruje doprostřed obrazovky.

        ShowHint - nastavíte, zda se bude zobrazovat popisný, pomocný text (Hint)

        TransparentColor - nastavíte, zda bude nějaká barva v okně průhledná

        TransparentColorValue - vyberete si barvu, která bude průhledná, pokud máte nastaveo True u TransparentColor

    Tak to by byly asi ty nejdůležitější věci. Ty ostatní jsem ještě nepoužil...
     
    A na tabulku Events se podíváme později. Nyní se podíváme na jiné objekty.
     
  6. V hlavním, horním okně máte takový blok plný ikon a záložek. Zde si vybíráte objekty, které budete vkládat.image 
    Zatím uvedu ty nejdůležitější ze složky Standart. Vkládají se tak, že kliknete na ikonku a následně na okno tam, kam chcete objekt umístit. V této části si uvedeme první tři: LABEL(nápis - ikona A), EDIT(rámeček na editaci jednořádkového textu - ikona s rámečkem s ab) a BUTTON(tlačítko, ikona tlačítka s OK).

    Začněme ještě šipkou. Když máte vybranou šipku(kurzor), můžete editovat již vložené objekty či okno (posunovat, roztahovat). Tato ikona je ve všech oddílech nabídky.

    Vložíme-li objekt do okna příkladu, v okně "Object TreeView" se objeví název objektu závislý na jiném (například na okně). čím více vpravo název je, tím více je podřazený.
     
  7. LABEL to jest NÁPIS. Tento text je v programu na pevno a uživatel s ním nic neudělá.
    Řekněme si nějaké zajímavosti v tabulce Properties v Object Inspectoru:


        Caption - nápis, který se zobrazí

        Color - barva pozadí textu

        Font - když na to kliknete 2x, zobrazí se windowsovské okno na nastavení fontu, barvy textu atd.

    A to je ze zvláštností vše. Když tu něco, co chcete vědět není, uvedl jsem to již u dřívějších objektů, nebo to není důležité.
     
  8. EDIT to jest rámeček, ve kterém může uživatel programu psát text.
    Řekněme si nějaké zajímavosti v tabulce Properties v Object Inspectoru:


        BorderStyle - nastavíte zda bude mít Edit rám (bsSingle), nebo ne(bsNone)

        Color - barva editačního pole

        MaxLength - maximální počet vepsaných znaků


        ReadOnly - když je TRUE, smíte z Editu pouze kopírovat, ale nesmíte zapisovat. Pokud je FALSE, zapisovat smíte

        Text - nápis, který se zobrazí v rámečku, dokud se nezačne upravovat

    A to je ze zvláštností vše. Když tu něco, co chcete vědět není, uvedl jsem to již u dřívějších objektů, nebo to není důležité.
     
  9. BUTTON to jest TLAČÍTKO. Tlačítko s nápisem.
    V tabulce Properties v Object Inspectoru budete potřebovat speciální akorát:


        Caption - nápis na tlačítku

    Ale zde už bychom si mohli uvést hlavní buňku z tabulky Events v Object Inspectoru:

        OnClick - "když na objekt kliknete" - pošle vás to do okna do procedury Click v okně s textovým editováním programu. Zde napíšete, co se stane, když se klikne na tlačítko (Např.:
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Close;
    end;
     - okno se po stisknutí tlačítka zavře!)
  10. Tak a teď si ukážeme pár věcí při dělání samotného programu:
      Nejprve si nastavíme parametry okna. Pojmenujte ho Okno a ostatní si dejte podle sebe, nebo to neměňte!
      Když máme nastavené okno, vložíme EDIT. Pojmenujeme ho Edit a ostatní opět jak chcete - jak se vám líbí, ale aby se dal v Editu editovat text.
      Jakmile máme Edit nastavený, radši si program uložíme. K tomu slouží ikona s dvěma disketami za sebou. Objeví se postupně dvě okna. V prvním uložíte nějak okno a v druhém pojmenujete program (stejně se bude jmenovat výsledný EXE soubor).
      Potom program vyzkoušíme. Klikneme na ikonku PLAY (zelená šipka doprava). Program se automaticky uloží jako název programu + .EXE a spustí se. Nyní by už měly všechny nastavené parametry fungovat. V Editu by měl jít psát text a ostatní funkce by měly být takové, jaké jste zadali.
      Nyní běžící program vypneme a zpět v Delphi vložíme tlačítko (BUTTON). Pojmenujeme jej Tlacitko, nápis (Caption) dáme třeba "Přepiš text" a ostatní jak chcete.
      Teď, když program spustíte, mělo by jít tlačítko mačkat, ale nic nedělat. Program vypneme a v Delphi ještě přidáme LABEL. Pojmenujeme ho Napis a ostatní zase jak chcete.
      Nyní ale program stále nic nedělá. A tak dvojitě klikneme na tlačítko, čímž se rychleji dostaneme do procedury Click. Zde napíšeme:
    Napis.Caption := Edit.Text;
      Tím dosáhneme toho, že po kliknutí na tlačítko se v nápisu dole objeví to, co uživatel napsal do Editu.
      Když program spustíte, mělo by to fungovat. Pokud chcete, můžete přidat ještě nějaké tlačítko, u kterého do procedury Click napíšete třeba:
    Napis.Caption := 'Ahoj, lidi';
      A po stisknutí tohoto tlačítka bude nápis dole "Ahoj lidi".
  11.   Tentokrát se pustíme už do trochu složitějších věcí. Ale nebojte se, tak strašné to zas nebude, přijdou i horší časy!
      Borland už dříve vyrobil program Pascal (Basic). S ním se programovaly programy v textovém režimu MS-DOS. Vše se navíc muselo psát. Dalo se pracovat s grafikou, ale složitě. A v Delphi? V Delphi se akorát vloží BitMaPa (soubor s koncovkou .bmp) a v okně máte obrázek. No, ale vy už od minule víte, že vše se musí dělat přes objekty. Proto tentokrát v prvním bodě zavítáme do položky "Additional":
      A vložíme si ikonku s obrázkem krajinky:

    IMAGE to je prostý obrázek.
    Obrázek má pár zajímavostí v tabulce Properties v Object Inspectoru:


        Center - obrázek (bitmapa) bude uprostřed objektu Image

        Picture - bitmapa, která bude v obrázku zobrazena a uložena. Po kliknutí na 3tečky se objeví okno. Dáte Load... , vyberete si na disku bitmapu a uzavřete okna pomocí OK. Bitmapa je nyní uložena v programu a nemusíte ji schovávat na disku.

        Stretch - bitmapa se roztáhne po celé ploše obrázku


        Transparent - když je TRUE bitmapa bude průhledná v místech, kde je stejná barva, jako v levém dolním bodě bitmapy

       A to je ze zvláštností vše. Teď už mohou být vaše programy zajímavější a hezčí.
     
  12.   Tak jsem vám ukázal věc ze složky Additional, ale teď se zase vrátíme do standartní položky "Standard"image:
      Jako druhý objekt si dnes ukážeme panel:

    PANEL to je plocha, vystouplá, propadlá nebo stejně vysoká jako okolí, na kterou pokládáme ostatní objekty! Je ve složce Standard skoro úplně vpravo. Po kliknutí na plochu se objeví jakoby takové tlačítko. Je ale mnohem větší a při klikání se neprohýbá. Ale co když na něj položíme třeba tlačítko, nebo obrázek? Zkuste ho posunout pryč z panelu! Che, che, nejde to, co? Pokud jste si všimli, v okně Object TreeView se od panelu udělala čára doprava a teprve na ní je navázán objekt v panelu. A k čemu to tedy je? Když třeba chcete část okna jinak barevnou! Co použijete (zatím, protože složitější věci ještě neznáte)? PANEL!
    I u panelu vám řeknu pár specialit v tabulce Properties v Object Inspectoru:

        Align - pokud jste dělali experimenty, možná jste si všimli, že tato položka je i jinde, ale tady mi připadala nejpodstatnější. Je to jakoby takové přilepování:
              -alBottom-objekt se přilepí ke spodku nedřazeného objektu (má jeho šířku a neodtrhneme ho od spodku objektu)
              -alClient-Tak to někdy dokáže pěkně zprzit vaší práci s rozměry objektu! Ten se prostě roztáhne po celé nadřazeném objektu a vy s rozměry nic nenaděláte.
              -alLeft-objekt se přilepí k levé straně nedřazeného objektu (má jeho výšku a neodtrhneme ho od levé části objektu)
              -alNone-objekt zůstane stejný na stejném místě (nepřilepuje se)
              -alRight-objekt se přilepí k pravé straně nedřazeného objektu (má jeho výšku a neodtrhneme ho od pravé části objektu)
              -alTop-objekt se přilepí k vršku nedřazeného objektu (má jeho šířku a neodtrhneme ho od vršku objektu)

        BevelInner - nastaví druh vnitřní části :
              -bvLowered- je propadlá
              -bvNone-je stejná jako okolí
              -bvRaised-je vystouplá

        BevelOuter - nastaví vystouplost celého panelu :
              -bvLowered- je propadlý
              -bvNone-je stejný jako okolí
              -bvRaised-je vystouplý
    Pozn.:  Pokud nastavíte BevelOuter a BevelInner každý opačně, bude vnitřek stejně vysoko jako okolí, ale bude ohraničen rantlem (vystouplým či propadlým)


        BevelWidth - šířka jednoho okraje (délka svahu panelu v pixelech)

        Caption - nápis na panelu (já ho moc nepoužívám, takže ho vždy smažu)

        Color - barva pozadí (plochy) panelu

        A to je ze zvláštností vše. Docela dost věcí navíc, tak je využijte!
  13.   Tak jdeme dál. Teď vám řeknu (vlastně napíšu), jak si předem vybrat několik věcí:
    CHECKBOX je "zaškrtávací krabička". Je to malý rámeček, u nehož je popisek. Když na něj klikneme, objeví se, nebo zmizí "fajfka" v rámečku.image

    CheckBox má několik specialit (překvapení, že?):


        Alignment - určíte buď že bude rámeček vlevo a nápis vpravo (taRightJustify) nebo naopak - nápis vlevo a rámeček vpravo (taLeftJustify)

        Caption - Popisek u rámečku

        Checked - buď TRUE (rámeček je zaškrtnutý), nebo FALSE (je prázdný)


        Color - barva pozadí textu a okolí rámečku

        Font - font popisku rámečku

        State 
    - nastaví obsah rámečku
              -cbGrayed- šedá "fajfka"
              -cbChecked- černá "fajfka"
              -cbUnchecked- prázdný


       A to je ze zvláštností vše. Na konci tohoto dílu si ukážeme bližší využití!
     
  14.   A co když chcete ze zaškrtávátek vybrat pouze jedno? K tomu slouží
    RADIOBUTTON. V určité skupině těchto objektů může být zatržen pouze jeden. Akorát narozdíl od CheckBoxu je rámeček ve tvaru kolečka a označen je tečkou!
    Funkce v tabulce Properties v Object Inspectoru jsou stejné jako u CheckBoxu (3.).

      V jednom nadřazeném objektu se budou RadioButtony přepínat mezi sebou. V odlišných však vznikají skupiny. Např.: Do Panel1 dáte RadioButton1 a RadioButton2 a do Panel2 dáte RadioButton3 a RadioButton4. Potom se budou přepínat mezi sebou RB1 a RB2, ale když na ně kliknete, nezmizí kolečko z RB3 nebo RB4. A naopak...
     
  15.   V prvním bodě jsem vám ukázal věc ze složky Additional a teď navštívíme položku System:
      Začneme prvním objektem zleva a ostatní až jindy:

    TIMER - Kdo umí anglicky, už si asi domyslel, že to bude něco s časem. Je. Každému se přece do programu hodí načasování. Třeba že když se otevře okno (spustí program), je jeho obsah prázdný - a po pěti sekundách BAF, objeví se tlačítko- dejme tomu na ukončení. Ano i taková blbost je program. A já vám teď napíšu, jak Timer využít. Jako příklad uvedu ten potroublý program:
      Nejprve to chce znát funkce Timeru v tabulce Properties v Object Inspectoru:


        Enabled POZOR!!!!! U Timeru je výjimka: nastaví se zde, zda časovač běží(TRUE), nebo ne(FALSE)!

        Interval To je základ Timeru. Nastavíte čas v tisícinách sekundy (takže pokud chceme těch 5 sekund, doplníme 5000), po kterém se spustí obsah položky OnTimer  v tabulce Events. 

        A teď rovnou k příkladu:
    Vložíme Timer a Button(Tlačítko)-ten pojmenujeme Konec a VISIBLE nastavíme na FALSE - tlačítko není vidět.
    A u Timeru-pojmenujte ho třeba Cas-nastavíme:
      ENABLED nastavíme na TRUE, protože chceme, aby Timer běžel.
      INTERVAL na 5000, což je 5sekund.
    Teď už víme, že to, co máme v položce OnTimer se spustí každých pět sekund, ale:
    1.-nic v ní nemáme
    2.-stačí nám to pouze jednou
    Proto klikneme na rámeček OnTimer a do okna na editaci textu napíšeme:
      Konec.Visible := True; - Tlačítko je vidět.
      Cas.Enabled := False; - Přestane běžet časovač.
    Vidíte, A JE TO! Teď už jen nastavit po kliknutí na tlačítko Close; a je to kompletně, jak jsem nahoře naplánoval...
     
  16.   A teď si řekneme, jak tvořit proměnné (pro ty, co neví co to je: je to část paměti počítače, do které si cokoli uložíte, ale musíte předem určit, co do ní chcete uložit):
      Nejprve si najděte v okně s editací textu tento úsek:
    private
      { Private declarations }
    public
      { Public declarations }
    end;

    Máte ho? Dobře jdeme dál:

      Určovat proměnné budeme za (pod) nápis PUBLIC ve tvaru:
    Název : typ proměnné;
      Název-může být jakýkoli(bez háčků, čárek - pouze čísla a písmena)
      Typ proměnné: dnes si ukážeme jeden:


    Integer - Je to celé číslo od - 2.147.483.648 do 2.147.483.647.
      Dá se s ním volně počítat. Standartní znaménka:
    KRÁT - 
    * (hvězdička)
    PLUS - 
    + (plus)
    MINUS - 
    - (minus)
      Akorát u dělení je výjimka (dělí se se zbytkem):
    VÝSLEDEK DĚLENÍ - 
    div (vyjde výsledek, ale zbytek se vypustí)
    ZBYTEK PŘI DĚLENÍ - 
    mod (vyjde zbytek a výsledek se vypustí)
    Př.: 5 div 2 = 2
        5 mod 2 = 1
        5*2=10
        5+2=7
        5-2=3

     
  17.   Tak jsme si ukázali, jak počítat, a teď si ukážeme, jak čísla využít:
    Potřebujeme znát příkaz 
    IF (POKUD). To jeden z nejhlavnějších příkazů v Delphi.
    Má tvar : if NázevProměnné znaménko výsledek then
      
    NázevProměnné-jméno proměnné, u které zjišťujete danou věc
      Znaménko-porovnání, může být:
              -
    =- proměnná je stejná jako výsledek
              -
    <- proměnná je menší než výsledek
              -
    >- proměnná je větší než výsledek
              -
    <>- proměnná je jiná než výsledek
              -
    <=- proměnná je stejná nebo menší než výsledek
              -
    >=- proměnná je stejná nebo větší než výsledek
      Výsledek-je to číslo nebo název jiné proměnná, kterou porovnáváme s první proměnnou.
    Př.: 
    if Cislo1 = Cislo2 then
      Close;

    Tento příkaz znamená, že pokud hodnota proměnné Cislo1 bude stejná, jako hodnota proměnné Cislo2, ukončí se program.
      Pokud chcete, aby se staly dvě věci, musíte je ohraničit BEGINem a ENDem!:
    if Cislo1 = 57 then
    begin
      Button1.Caption := 'Tlačítko';
      Button1.Hint := 'Popisek tlačítka';
    end;

    Nyní se poté, co bude Cislo1 mít hodnotu 57, objeví na tlačítku Button1 objeví nápis tlačítko a pokud je na něm nastavené, že se zobrazí HINT, po ukázání na tlačítko se objeví pomocný popisek s nápisem "Popisek tlačítka".
      Vidíte a umíte další věc!
     
  18.   Opakování? Ano to lze taky. Pomocí příkazu
    Repeat (OPAKOVAT). Program bude prostě vyhrazenou část opakovat pořád dokola (ale ne do nekonečna - tedy přesněji: záleží na programátorovi)
    Má tvar : 
    repeat
      něco;
    until (rovnice);
      
    Něco-část programu, která se má opakovat
      Rovnice-část programu se bude opakovat, dokud se nestane to v rovnici
        Př.:
    repeat
      Cislo := Cislo + 1;
    until (Cislo = 100);

    Tohle je celkem na nic, ale jako příklad to stačí. K proměnné Cislo se pokaždé přičte 1. A až se hodnota Cislo dostane na stovku, bude program pokračovat dál.
    P.S.: A co myslíte, že se stane, když nějaký inteligent naprogramuje toto:
    repeat
      Button.Visible := True;
    until (1=2);
    Ano, tlačítko se bude do nekonečna zviditelňovat... (pro ty pomalejší: 1 se nikdy nebude rovnat dvojce!!!!!)

     
  19.   Opakování? Ano to lze taky. Že už jsem to psal? Ano, toto je ještě jeden druh opakování. Ale zde se vám nestane, že se bude opakovat do nekonečna:
    For (PRO). Ano, není to celý příkaz a tak ho sem rovnou napíšu:
    for Integerproměnná := prvníčíslo to posledníčíslo do

    O co jde? Tento příkaz bude opakovat část programu za příkazem (buď jeden příkaz, nebo příkazy ohraničené BEGINem a ENDem). Ale: při prvním průběhu části programu se bude Integerproměnná (nějaká proměnná typu Integer) rovnat proměnné, či číslu prvníčíslo. Při dalších opakováních se k Integerproměnné přičte vždy jednička. Jakmile bude mít Integerproměnná stejnou hodnotu jako posledníčíslo, opakování skončí.
        Př.:
    for Cislo := 0 to 15 do
      Cislo2 := Cislo2 + Cislo;

    V prvním kole se k Cislo2 přičte 0, ve druhém 1... a v posledním 15.
    Celkem jednoduché a lepší než repeat, ale k něčemu se třeba více hodit nemusí...
     
  20. Je čas udělat dětem pá pá! Ne, ne, ne! Teletubbies NE! A konec jakbysmet.
    Došlo na příklad:
      Už toho umíte celkem dost, tak si uděláme kvalitní program:
    Form1 přejmenujte na Okno, BorderStyle na bsNone a ostatní jak chcete.
    Přidejte tlačítko a pojmenujte ho Ukoncit. Caption bude "KONEC" a Visible False.
    Hlavně to nepouštějte, nejde to zvřít (leda tak pomocí Alt+F4). Nastavte, že po kliknutí na tlačítko se program ukončí(příkaz Close;). A teď vložte 2 RadioButtony. Jeden pojmenujte On a druhý Off. On bude mít Caption "Lze ukončit" a Off "Nelze ukončit".
    Klikněte dvakrát na On a objeví se (stejně jako u tlačítka) okno na editaci textu.
    Napište: Ukoncit.Visible := True;
    To samé udělejte u Off, ale napište: Ukoncit.Visible := False;
    Pro dokonalost u Off v položce Checked nastavte True;
    A je to při kliknutí na On se tlačítko objeví a když kliknete na Off, zmizí!
    Zatím jsme moc věcí zvrchu nevyužili a taky nevyužijeme, ale aby dělal program něco zjímavého, přidáme pár věcí: Pomocí Image můžete přidat obrázky, ale teď se pustíme do něčeho, co vám bude připadat možná trochu ŤUK ŤUK:
      Vložte časovač (Timer) a pojmenujte ho Timer (prostě smažte jedničku image). Interval nastavte na 250 a Enabled na False.
    Vytvořte si proměnnou Cislo! Klikněte dvojitě na Okno (sice předbíhám, budu o tom mluvit až příště, ale to snad vydržíte), objeví se odstavec (procedura) v textu, kam se píše to, co se stane při spuštění programu. Sem dejte: Cislo := 0;
    A přidáme zase dva Radiobuttony (na panel!!!Klidně na nevystouplý). Play a Stop. U Stop nastavíme Checked na True. U Play nastavíme, že po kliknutí na něj se spustí Timer (Timer.Enabled := True;) a u Stop Timer.Enabled := False;
    A teď Panel. Nastavte Name na Panel a BevelOuter na bvRaised.
    A nyní se vraťme k Timeru. Klikněte na něj dvakrát (je to to samé, jako kliknout na položku OnTimer v Events). Napište:
    Cislo := Cislo +1;
    if Cislo = 1 then
      Panel.BevelOuter := bvNone;
    if Cislo = 2 then
      Panel.BevelOuter := bvLowered;
    if Cislo = 3 then
      Panel.BevelOuter := bvNone;
    if Cislo = 4 then
    begin
      Panel.BevelOuter := bvRaised;
      Cislo := 0;
    end;

    A je to! Uvidíte sami, co bude Panel dělat. A to je pro tentokrát vše. Užijte si hraní s Delphi a nestrácejte čas hraním her image!
  21. Druhá část byla celkem zmatená a tak to tato bude muset zase urovnat. Říkali jsme si o proměnných, ale uvedli si jenom INTEGER. Dnes přistoupíme i k jiným:
      Začněme třeba tím nejjednodušším. Buď ano, nebo ne! Přesněji True, či Flase:

    BOOLEAN 

    Například položka Enabled. To je Boolean. Určíte buď TRUE (=ano), jako přístupné, nebo FALSE (=ne), jako nepřístupný! Další příklady booleanů: Visible, ShowHint aj.

    Užití: 
    if Panel1.Visible then

      Panel1.Visible := False;
    To je to samé jako:

    if Panel1.Visible = True then
      Panel1.Visible := False;
    To 1. je zkrácené. U zjišťování FALSE, se však musí psát vše:

    if Panel1.Visible = False then
      Panel1.Visible := True;

    Tímhle jsem vlastně ukázal všechen způsob zápisu a můžeme se pustit do textů:
     
  22.   Už znáte celá čísla, ano/ne a zbývá text:
    STRING
    V překladu "řetězec". A čeho? Symbolů! Tj. číslic, písmen, znamének, prostě všeho, co najdete na klávesnici.  Příklady stringů: Caption, Text aj.


    Užití: 
    if Panel1.Caption = 'Ahoj' then

      Panel1.Caption := 'Nashle';
    A naopak:

    if Panel1.Caption = 'Nashle' then
      Panel1.Caption := 'Ahoj';

    Texty už znáte, tak se vraťme k číslům:
     
  23.   Jako poslední umístím čísla! Tato jsou ale na rozdíl od Integeru i desetinná:
    REAL
    Číslo, které se těžko ohraničuje, ale mělo by být přibližně mezi -10*10 na 38 a 10*10 na 38. Je to ale šílené. Kolik desetinných míst má, to taky nevím. Hlavní je, že se s ním dá lépe počítat:
    KRÁT - 
    * (hvězdička)
    PLUS - 
    + (plus)
    MINUS - 
    - (minus)
    DĚLENO - 
    / (lomeno)
    Př.: / 2 = 2.5
        5*2=10
        5+2=7
        5-2=3


    Používá se podobně, jako Integer. A to je protentokrát z proměnných vše!
     
  24.   A teď je na řadě pár vychytávek:
    IntToStr & StrToInt
    Slouží pro převod STRINGU na INTEGER a naopak(IntToStr=Integer na String a StrToInt=String na Integer).
     Užití: 
    Panel1.Caption := 'Je to ' + IntToStr(Pocet);
    Nápis na panelu bude "Je to " a hodnota proměnné Pocet!

    Pocet := StrToInt(Edit1.Text);
    Proměnná Pocet bude mít hodnotu čísla, které se napíše do Editu1. Zde mohou nastat problémy: Pokud do Editu1 doplníte písmeno, program bude hlásit chyby!

      Ale jdeme dále:
    Var
    To jsem měl uvést už minule. Pokud nechcete, aby vám proměnná zabírala část operační pamět
    i celou dobu spuštění programu, ale jen za běhu nějaké procedury (oddílu v programu). Užití:
      Mezi řádek s procedure a řádek s begin se vloží var a za něj už píšete stejně, jako za Public nahoře v programu. Tentokrát se však proměnná zruší po proběhnutí procedury (oddílu od begin k příslušnému endu). Př.:

    procedure TForm1.FormCreate(Sender: TObject);
    var
      Napis : string;
      Cislo : Integer;
    begin

    ......

    end;

    Místo ...... je samozřejmě nějaký duchaplný obsah procedury.
     A mám to. 2 mouchy jednou ranou. Seznámení s procedurami a s varem (ne vody, ale příkazem var image).
     
  25.   A poslední 2 vychytávky:
    Randomize & Random
    Slouží k tvorbě náhodných čísel. Musíte nejprve (na začátku programu, nebo před generováním čísla)  napsat příkaz

    Randomize;
    Ten spustí "generátor" náhodných čísel. Pak už stačí psát např.:
    Cislo := Random(10);
    To znamená, že Cislo bude mít náhodnou hodnotu od nuly (včetně ní) do 10 (bez ní) - může být tedy 0, 1, 2, 3, 4, 5, 6, 7, 8, nebo 9!
    Chcete-li číslo např. od 12(bez ní) do 50 (včetně ní), napíšete
    Cislo := Random(38) + 13; 
    Když bude číslo vyprané počítačem nula, Cislo bude 13, když bude číslo 37, bude Cislo 37+13 a to je 50!
      To bychom měli. A teď poslední:

    Else
    Neboli Jinak! Používá se za endem, ale ne vždy! Užití:

    if Cislo = 1 then
    begin
      Cislo := 2;
    end else
    if Cislo = 2 then
      Cislo := 3  else
    if Cislo = 3 then
    begin
      Cislo := 1;

    end;
    Pokud je Cislo 1:
      Stane se v první části dvojkou. Ale 2. část se ptá, jestli je Cislo dvojka a to už nyní je! Proto se musí vložit ELSE. Pokud se spustí 1. část, ostatní, navázané na sebe pomocí else, se nespustí!
    Tento způsob se hodí třeba do Timeru (časovače)! K Cislu se vždy přičte jedna a místo zbytečného Cislo := ... se dá nějaká věc, která se bude opakovat ve třech (nebo i více, či méně) fázích!
     

      POZOR!!!!!
    Za příkaz před příkazem else a za příkaz else se nepíše středník (;)!
    Př.: řádek 4 - za end není ;
    řádek 6 - za Cislo := 3 není ;
     

    A to je ze specialitek vše! Teď se pusťme do dalších objektů:
     
  26.   Navštívíme položku Additional:
      Třetí od leva je okénko s dvěma křížky (##):

    MASKEDIT - To je vlastně MASKovací EDIT. Jak vypadá rámeček ve Windows na zadání uživatelského helsa? Stejně jako ten na jméno (to je EDIT). Ale když do něj něco chcete psát, vždycky se objeví hvězdička (*). V Delphi si dokonce symbol (místo *) můžete vybrat. Ale to si řekneme u funkcí v tabulce Properties v Object Inspectoru:

        PasswordChar - Zde si nastavíte, co se bude zobrazovat místo písmen, číslic a jiných znaků. Pokud zadáte #0 , bude každé písmeno takové, jaké má být. Pokud například P, bude místo Ahoj PPPP!

        A to je vlastně všechno. Správný text je v položce TEXT, akorát se zobrazí něco jiného.
    Zůstaňme v položce Additional a pojďme k jiným objektům:
     
  27.   "Já chci taky tlačítka, jako jsou v Malování! Ta s těmi obrázky!" "Ano? Není problém! S Delphi ne!" Řešení leží na druhém místě zleva v Additional:
    SPEEDBUTTON - Nejlepší (a nesložitější) tlačítko v Delphi, které znám!
    Je zde spousta nastavení 
    tabulce Properties v Object Inspectoru a tak ji rovnou rozebereme: 

        Caption - Za prvé se dá tlačítku přidat nápis (což bych podle ikonky v nabídce objektů nečekal).

        Flat - Za druhé z tlačítka uděláte placku, která když nad ní najedete kurzorem vystoupí a když na ní kliknete, tak se propadne. Je to Boolean, takže se nastavuje TRUE (bude to placka), nebo FALSE (je to tlačítko).

        Glyph - A za třetí přidáme tlačítku slibovaný obrázek. Klikneme dvakrát na položku Glyph, v okně na Load... a načteme nějaký obrázek (bitmapu - *.bmp). A je to!

        GroupIndex - "A za čtvrté?" "V Malování kliknu na obrázek a ten zůstane promáčknutý!" Proto je tu číslo skupiny tlačítek. V každé skupině je jedno tlačítko promáčknuté. Pokud máte GroupIndex 0, není v žádné skupině. Jakmile je tlačítko v nějaké skupině, zůstane po kliknutí promáčknuté. Když ale na jiné tlačítko jeho skupiny kliknete, vymáčkne se ven a zamáčknuté bude to nové!

    Teď mi odpusťte menší skok v tabulce Properties v Object Inspectoru zpět nahoru:

        Down - Boolean! Vy už určitě víte, co to je! Ano, TRUE (tlačítko bude promáčknuté - pokud nemáte GroupIndex 0), nebo FALSE (tlačítko bude normálně)!

      No a to je všecičko image! Jdeme dál:
     
  28.   Když už jsme u těch tlačítek, ukážeme si ještě jedno - poslední (úplně vlevo):
    BITBTN - Talčítko, s funkcemi podobnými, jako u SpeedButtonu. Spíš slabšími - jde zde dát jenom nápis a obrázek image.
    Asi vás zklamu, že jsem vypleskal jeden bod za takový šmejd, ale někdy by vás to stejně čekalo...

    Tak mi to promiňte a pojďte dělat tvary:
     
  29.   Tvary? Všechny ne, jenom elipsu, obdélník a zaoblený obdélník. Objekt je v Additional (kde jinde v této části? image) sedmý zleva (trojúhelníček, čtvereček a kroužek) :
    SHAPE - Když jsem u geniálního SpeedButtonu napsal, že mne překvapilo, že jde přidat nápis, zde mne naopak překvapilo, že nejde dělat trojúhelník, když je na obrázku.
    Ale to je jedno! Odeberme se k vlastnostem v tabulce Properties v Object Inspectoru

        Brush - To je výplň - má dvě odvětví:
    COLOR - barva výplně
    STYLE - vzorek výplně (mřížka, plná, přímky...)


        Pen - To je obrys - má čtyři odvětví:
    COLOR - barva obrysu
    MODE - tomu sám nerozumím, ale stejně je mi to k ničemu
    STYLE - typ obrysu (přerušovaná čára, plná čára...)
    WIDTH - šířka (tloušťka) obrysu (pera) v pixelech


        Shape - Tohle je to nejdůležitější! Tvar:
              -stCircle-Objekt má tvar kruhu. Je vždy největší, jaký může ve vyhraničeném prostoru být.
              -stEllipse-Objekt má tvar oválu (elipsy). Roztáhne se vždy po celém vyhraničeném prostoru.
              -stRectangle-Objekt má obdélníku. Je stejný, jako vyhraničený prostor (je to skoro to samé, jako Panel image).
              -stRoundRect-Objekt má obdélníku se zaoblenými rohy. Je stejný, jako vyhraničený prostor (kromě rohů).
              -stRoundSquare-Objekt má tvar čtverce se zaoblenými rohy. Je vždy největší, jaký může ve vyhraničeném prostoru být.
              -stSquare-Objekt má tvar čtverce. Je vždy největší, jaký může ve vyhraničeném prostoru být.


      A teď můžete svůj program ozdobit tvary (bohužel na trojúhelníkem image)...
     
  30. "AND THAT'S ALL, FOLKS!" = "A TO JE VŠE, PŘÁTELÉ!"
    Teď už jen zbývá souhrn této části pomocí příkladu:
      S funkcemi, které už umíte, se dá udělat celkem dobrý program:
    Rozhodl jsem se, že si uděláme STOPKY!
    O co jde ve stopkách? O měření času. A co je k tomu třeba? TIMER.
    Do okna Okno tedy vložíme Timer a pojmenujeme ho Meric. Interval nastavíme na 100 (uděláme stopky s přesností na desetiny sekundy). Enabled ještě nastavíme na False. Abyste poznali, že se dá na cokoli použít položka Tag (
    v tabulce Properties v Object Inspectoru - je to Integer), budeme ji používat jako počet desetin sekundy.
      A teď k samotnému času: Klikněte dvakrát na Meric a do procedury, která se vytvoří v okně na editaci textu, pište:

    Meric.Tag := Meric.Tag + 1;
    To je zatím vše, ale později se ještě vrátíme! Teď vytvoříme 4 Labely. První (jmenuje se Minuty) dáme nalevo. Napravo od něj dáme druhý (jmenuje se Dvojtecka). Třetí (jmenuje se Sekundy) umístíme ještě více vpravo a  čtvrtý (jmenuje se Desetiny) umístíme na konec této řady (vpravo). Teď nastavíme položky Caption:
    Minuty- 00
    Dvojtecka- :
    Sekundy- 00
    Desetiny- ,0
      Teď Labely uspořádáme tak, aby tvořily nápis 00:00,0
    Font a ostatní neškodné věci si nastavte podle sebe! Teď spustíme program a zkontrolujeme, zda nápis opravdu vypadá tak, jak má (není nutné kontrolovat, ale je to jistější a času to moc nezabere). Vrátíme se do procedury Merice, kam už jsme psali. Za to už napsané píšeme dál:
    Desetiny.Caption := ',' + IntToStr(Meric.Tag mod 10);
    Nápis Desetiny bude čárka a poslední číslice počtu desetin sekundy. Vytvoříme si 2 proměnné (můžete i pomocí var pro proceduru, do které právě píšete) Seconds a Second. A píšeme dál za předchozí příkaz.
    Seconds := Meric.Tag div 10;
    Second := Seconds mod 60;
    if Second div 10 = 0 then
      Sekundy.Caption := '0' + IntToStr(Second) else
      Sekundy.Caption := IntToStr(Second);

    Teď jsme se postarali o zobrazení počtu sekund.
    Nejprve jsme určili počet sekund (např. 125). Dále jsme vyrušili minuty (podle př. zbylo 5). Pokud počet vydělíme deseti a vyjde nula (př. 5 děleno 10 = 0  zb.5 - takže VYJDE), zapíše se nula a připíše počet sekund (podle př. 05). Pokud ale nevyjde nula, napíše se jenom číslo. Bez tohoto opatření by měl nápis tvar 00:5 ,X (X znamená nějaké číslo), ale s opatřením má tvar 00:05,X (tedy tak, jak to má být)!
    Teď jsme si to objasnili a můžeme psát dál:
    Minuty.Caption := IntToStr(Seconds div 60);
    if StrToInt(Minuty.Caption) = 100 then
      Meric.Tag := 0;

    Tak jsme zapsali počet minut. Funguje až do 99. Jakmile bude mít hodnotu 100, vynuluje se čas (k tomu slouží druhý a třetí řádek - příkaz)!
    Když teď program spustíme, stejně nebude fungovat. Musíme nejdřív spustit Meric. Vytvoříme proto dvě jakákoli tlačítka (co vás zaujalo - SpeedButton, Button, nebo BitBtn). Jedno pojmenujte Stop a druhé Null. U Stop nastavte Caption jako "Spustit". Klikněte dvakrát na Stop a pište:
    if  Meric.Enabled then
    begin
      Meric.Enabled := False;
      Stop.Caption := 'Spustit';
    end else
    begin
      Meric.Enabled := True;
      Stop.Caption := 'Zastavit';
    end;

    Když na Stop kliknete a Meric bude měřit čas, měření se zastaví a na Stopu se objeví nápis Spustit. Pokud ale měřič neběžel, spustí se a Stop bude mít nápis Zastavit.
    Tak, teď už jenom klikněte dvakrát na Null a napište:
    Meric.Tag := 0;
    HOTOVO! Stopky jsou vyrobeny. Vzhled si zvolte svůj. Ten bude vždy na vás image! Doufám, že víte, co jste naprogramovali a co k čemu slouží. Pokud ne, můžete mi klidně napsat. A ne jenom k této části. Přeji veselou zábavu. Schválně změřte, jestli vydržíte měřit tak dlouho, že se stopky samy od sebe vynulují image. Že si mezitím někam odskočíte, nebo budete dělat něco jiného než civět na vaše graficky krásné stopky, je podvod a pokus už neplatí image. Ahoj a programujte (už můžete dělat spousty věcí)...
  31. A je to tady! Co? Budeme si vyprávět (vlastně budu psát) o položce EVENTS v OBJECT INSPECTORu:
      Začněme u hlavního objektu tj. okna:

    FORM
    Je zde spousta položek a tak je probereme podrobněji:
     
      OnActivate
    Po dvojitém kliknutí na položku vás program odkáže do okna na editaci textu (tak tomu je u všech (černě psaných) položek v Events). Je zde přibližně toto:
    procedure TForm1.FormActivate(Sender: TObject);
    begin

    end;
     

    Možná jste to už v minulé části pochopili, ale dnes to rozvinu: Tento úsek programu se nazývá procedura. Je to samostatná část programu, která se spustí při určité akci. A druh akce značí právě název položky v Events. Nejprve je v proceduře nápis procedure, aby program věděl, o co se jedná. Poté následuje typ okna (Najdete ho vpravo nahoře v Object Inspectoru. Dá se také vytvořit tak, že před název okna přidáte velké T.), tečka a název procedury. V závorce jsou proměnné, které se nastaví při spouštění procedury. Mezi begin (začátek) a end;(konec) se píše to, co se má provést.
         Tato položka se spustí, když se otevře okno. Celkem užitečné!
     

      OnClick
    (nebudu psát všechny položky - jen ty nejdůležitější) To je jedna z nejzákladnějších položek
    . Spustí se, když na okno kliknete. Výborné!
     

      OnClose
    Spustí se, když zavíráte okno. Hodí se až pro program s více okny!
     

      OnCreate
    Podle mne nejdůležitější!!!!! Jednodušeji se do okna pro editaci dostanete dvojitým kliknutím na okno s ukázkou programu! Aktivuje se při spuštění programu (ještě před otevřením okna). Bez chyby!
     

      OnDblClick
    Zkratka OnDoubleClick. To je další z nejzákladnějších položek
    . Spustí se, když na okno dvojitě kliknete (dvakrát rychle za sebou). Bezva!
     

      OnKeyDown
    Spustí se, když budete držet stisknuté tlačítko klávesnice. Jsou zde důležité proměnné v závorce:
    Key - tlačítko, které je zmáčknuto (získáte číslo tlačítka - např.: Enter je 13, Esc je 27...)
    Shift - zjistí, zda je tlačítko stisknuto speciálně. Typy:
      ssShift - je stisknutý Shift
      ssAlt - je stisknutý Alt
      ssCtrl - je stisknutý Ctrl
      ssLeft - je stisknuté levé tlačítko myši
      ssRight - je stisknuté pravé tlačítko myši
      ssMiddle - je stisknuté prostřední tlačítko myši
      ssDouble - bylo dvakrát kliknuto na myš
    P.S.: Pozor! U Shiftu ze zjišťuje typ jiným způsobem než jinde:
    if ssShift in Shift then nebo
    if not(ssAlt in Shift) then
    Pokud je ssShift v Shift (může toho totiž být zmáčknuto více), nebo to druhé: Pokud není ssAlt v Shift!
     
      OnKeyPress
    Aktivuje se, když kliknete na tlačítko na klávesnici. Procedury jsou stejné, jako u OnKeyDown, akorát!!!!: Key není Integer, ale Char (#s číslem)! Pokud chcete převést char na integer, slouží k tomu příkaz v bodě číslo 5!
      
      OnKeyUp
    Aktivuje se, když pustíte tlačítko na klávesnici. Procedury jsou stejné, jako u OnKeyDown.
     

      OnMouseDown
    Spustí se, když budete držet stisknuté tlačítko myši na okně. Proměnné v závorce:
    Button - rovná se buď mbLeft (je stisknuté levé tlačítko), mbRight (pravé tl.), nebo mbMiddle (je držené prostřední tlačítko)
    Shift - viz Shift u OnKeyDown
    X,Y - pozice kurzoru v okně (X je sloupec a Y řádek / X je vodorovný rozměr, Y svislý)
     

      OnMouseMove
    Spustí se, když pohnete myší nad oknem. Proměnné jsou skoro stejné (není zde Button) jako u OnMouseDown. To se celkem hodí!!!!!
      

      OnMouseUp
    Spustí se, když pustíte stisknuté tlačítko myši na okně. Proměnné jsou stejné jako u OnMouseDown.
      

      OnMouseWheel
    Spustí sepři otáčení kolečkem myši. Nejdůležitější z proměnných je WheelDelta, která určuje hodnotu posunutí kolečkem (je Integer).
     

      OnResize
    Spustí se, když měníte rozměry okna (roztahujete, smršťujete...). Hodí se!!!!!
      

      OnShow
    Spustí se při zviditelnění okna (funguje skoro stejně jako OnActivated).
      

    A to je vše!!!!! Šílené, že?
     
  32.   První bod byl šíleně dlouhý! Teď si řekneme pár dalších věcí! Začněme vytvářením vlastních procedur:
      Nejprve najděte část programu, kde je napsáno
    private
    { Private declarations }
    public
    { Public declarations }
    end;

    Nyní budeme psát nad tento text. Pokud už nějaké procedury máte, budete psát pod poslední. Pokud ne, prostě pište nad private image. Pište ve tvaru:
    procedure název;
    Místo "název" napište jméno vaší procedury (nesmí se tak jmenovat nic jiného!).
    Teď už jste program připravili na to, že bude mít o proceduru NÁZEV víc.
    Pro lepší vysvětlení pojmenuju proceduru třeba Procedurka (procedure Procedurka;). Když jsme už program připravili, zajedeme až na konec celého textu. Najdeme zde: end. To nám říká, že program končí (za endem musí být tečka). Za něj se už nic nepíše. Musíme tedy před něj! Napište nejprve:

    procedure typokna.název;
    begin

    Typokna je (viz. v bodě 1.) jakoby název okna, před který se přidá velké T. V našem případě tedy (okno pojmenujeme Okno:
    procedure Okno.Procedurka;
    begin

    Dále pište, co se má stát když napíšete do programu: 
    Názevproměnné;
    V našem případě:
    Procedurka;
    Celou proceduru pak ukončete příkazem end;!
    A k čemu je to dobré? Vždyť to už můžete napsat obsah procedury rovnou na místo, kam dáte v našem případě
    Procedurka;! To je pravda, ALE: pokud chcete jednu věc dělat v programu vícekrát, ušetříte na celkové velikosti výsledného EXE souboru. A navíc: Když program rozdělíte do procedur, bude přehlednější!!!!!

    Když už jsme u přehlednosti...
     
  33.   Chcete mít program přehledný? Ano? Potom vás jistě potěší, že si můžete dělat poznámky:
    // & {}
    Delphi podle těchto dvou znaků pozná, že jde o poznámku a nečte jí, při vytváření vašeho programu. Vy se však díky poznámkám můžete lépe orientovat! Pokud Delphi narazí na //, vynechá text na řádku za //. Př.:
    Label1.Caption := 'Ahoj!'; //Na Label1 je Ahoj!
    Label2.Caption := 'Sbohem'; //Na Label2 je Sbohem!

    Takto si uděláte poznámky na jeden řádek! Že je text pouhá poznámka poznáte tak, že se nápis sklopí doprava. A jak udělat na více řádků? Když Delphi narazí na {, vynechává text, dokud nenarazí na }. Takže poznámku si můžete dát také mezi {}. Př.:
    Label1.Caption := 'Ahoj!'; {Na Label1 je Ahoj!
    Teď je už další řádek! Ale poznámka ještě neskončila!}


    Tak a další bod je za námi! Že byl krátký? Tak se podívejte na první! Když uděláte průměr, nejsou nějaké krátké!
     
  34. Jako poslední ze složitostí si dnes řekneme, jak dělat vlastní proměnnou!
    Nejprve najděte na začátku programu
    type
      TForm1 = class(TForm)

    Část textu "Form1" se mění podle toho, jak máte pojmenované své Okno. Např.:
    type
      TVokno = class(TForm)

    Okno se jemnuje Vokno!
    My budeme psát mezi tyto dva řádky!
    set of ()
    Je to jakoby seznam názvů. První proměnná, kterou musíte nadefinovat sami!
    Pod type tedy pište:
    TNeco = set of (prvnínazev, druhynazev, tretinazev);
      Místo TNeco napiste svůj název typu procedury (T musí zůstat!!!!!). Do závorky potom pište názvy, u kterých se bude zjišťovat, zda v proměnné jsou! Můžete jich napst kolik chcete a oddělujte je čárkami. Př.:
    TKamaradi = set of (Pepa, Lojza, Franta, Ruda, Ada); 

    Teď máme určený typ proměnné TKamaradi. Nyní si jí vytvoříme: K ostatním proměnným pište třeba: Kamosi : TKamaradi;
    Jenoduché, ne? A teď práce s naší proměnnou:
    Vynulování seznamu: Kamosi := [];
    Určení přesného obsahu: Kamosi := [Lojza, Ruda, Ada];
    Přidání názvu: Kamosi := Kamosi + [Pepa];
    Odebrání názvu: Kamosi := Kamosi - [Pepa];
    Přidání názvu: Kamosi := Kamosi + [Pepa];
    Zjištění, zda je určitý název v seznamu: if Franta in Kamosi then
    A zjištění, zda určitý název není v seznamu: if not(Franta in Kamosi) then


    Vidíte a umíte další užitečnou věc!!!!!
     
  35.   A teď si ukážeme, jak převádět různé proměnné a uvedeme si pár nových typů:
    Nejprve typ proměnné (tj. např. Integer):

    Char
    Na počítači můžeme psát spousty různých znaků, písmen, číslic atd. Ale jak si to ten chudák zapamatuje? Převede si znaky na čísla! Např.: A má číslo 97, B 98, C 99, D 100, E 101 atd. A co znak pro další řádek? Enter má číslo 13! A char právě udává místo znaků čísla. A jak ho odlišit od Integeru? Jednoduše, před číslem v charu je znak # (křížek). Takže F bude v charu #102, A bude #97, Enter bude #13, Esc #27 atd.
    Že je to převod znaků? Tak si zkuste vložit Label a napsat:
    Label1.Caption := #97 + 'hoj' + #13 + 'člověče';
    Co se objeví? Toto:
    ahoj
    člověče


    A teď pár vychytávek:
    Ord & Chr
    Převádí char na integer a naopak! Ord převede char na integer a chr převede integer na char. Jednoduše: Prostě ubere, nebo přidá křížek (#). 


    StrToIntDef
    Znáte StrToInt? A stalo se vám někdy, že program hlásil chybu, protože se na číslo převádělo např. 458f26? Není divu! "f " není číslice! Od toho je příkaz StrToIntDef. Zde zadáte číslo, které se má doplnit a je to! Píše se ve tvaru:
    Cislo := StrToIntDef(Napis, Nahrada);
    Napis je string, který chceme převést na integer Cislo. Nahrada je číslo, kterým bude nahrazen string, pokud z něj nepůjde utvořit číslo!


    TryStrToInt

    To jest ZkusStringdoIntegeru! TryStrToInt je další vychytralost proti špatnému zapsání čísla ve stringu. Píše se ve tvaru:
    JdeTo := TryStrToInt(Napis, Cislo);
    Pokud je string Napis převoditelný na integer, boolean JdeTo bude True a integer Cislo bude číslo, které bylo napsáno v Napisu. Když ale převést nejde, Cislo se nezmění a JdeTo bude False. Jednoduché, ne?

     
    To se celkem hodí, ne? Třeba to vyřeší vaše problémy!
     
  36.   Tak to bylo převádění Integeru na String. A teď si ukážeme, jak převádět Real na Integer:
      Nejprve však musím říct, že pokud chcete převést Integer na Real, použijte pouhé :=!
      Na převod Realu na Integer jsou dva způsoby:


    Round
    To znamená zaokrouhlit! Doufám, že víte, co znamená zaokrouhlit! Jestli ne, tak v Delphi radši s čísly nepracujte! Píše se ve tvaru:
    IntegerCislo := Round(RealCislo);
      Na ukázku napíšu příklad:
    Cislo := Round(15.55);
      Pozor na psaní desetinné čárky! Je zde místo ní tečka!!!!! Kolik bude Cislo? 16! Pětka zaokrouhluje nahoru!

     
    Trunc

    A druhým způsobem číslo prostě ořízneme!  Píše se ve tvaru:
    IntegerCislo := Trunc(RealCislo);
      Na ukázku napíšu příklad:
    Cislo := Trunc(15.55);
      Kolik bude Cislo? 15! 55 se prostě zruší a zbyde 15!

    A když už jsme u Realu, ukážeme si jeho úpravy:

     
    Int

    To znamená zaokrouhlit! Doufám, že víte, co znamená zaokrouhlit! Jestli ne, tak v Delphi radši s čísly nepracujte! Real se prostě zaokrouhlí a vznikne zaokrouhlený real. Píše se ve tvaru:
    RealCislo1 := Int(RealCislo2);
      Na ukázku napíšu příklad:
    Cislo := Int(15.55);
    Kolik bude Cislo? 16! Pětka zaokrouhluje nahoru! Vyjde real 16.0!

     
    Frac

    Šílené, ale třeba se vám to bude hodit! Co to udělá? Odřízne číslo před desetinnou čárkou. Jak to pak dopadne? Např. ze 156.487 vznikne 0.487! Chápete? Píše se ve tvaru:
    RealCislo1 := Frac(RealCislo2);
      Na ukázku napíšu příklad:
    Cislo := Frac(15.55);
      Kolik bude Cislo? 0.55! 15 se prostě zruší a zbyde 0.55!


    Celkem dobrá blbůstka ne? Snad nějakou z nich využijete!

    A jako poslední jsem si nechal ještě dva převody.

    FloatToStr
    Převod realu na string! Velice, velice užitečné! Užívá se: 
    Napis := FloatToStr(RealCislo);
      Na ukázku napíšu příklad:
    Label1.Caption := 
    FloatToStr(15.55);
      Jaký nápis bude na místě Labelu1? Záleží na vašem nastavení! Prostě patnáct celých pět. Buď 15,55 , nebo 15.55 . Záleží na nastavení ve Windows (jak máte nastavené oddělování celých a desetinných čísel)
    A ještě

    StrToFloat
    Převod stringu na real! Používá se stejně jako FloatToStr! 
     
  37.   Jdeme dál! Přejdeme k poznávání objektů v tabulce v hlavním okně. Navštívíme položku Win32:
      Přibližně páte od leva je okénko s tečkami, lištou a posuvníčkem. Je to:

    TRACKBAR - Zde si rovnou bez pomoci klávesnice určíte hodnotu nějakého integeru. Učiníte tak pomocí posuvníku. Určíte si pár věcí a TrackBar vám pak vrátí číslo. A co máme v Object Inspectoru:

        Frequency 
    To je jakoby stupnice. Určíte, po kolika jednotkách se budou zobrazovat čárky. Když dáte např. 2, každý druhý bod posuvníku bude označen čárkou.

        Max Zadáte číslo, které bude jako nejvyšší možná určená hodnota.

        Min Zadáte číslo, které bude jako nejnižší možná určená hodnota.

        Orientation Nastavíte buď trVertical, aby byla lišta svisle, nebo trHorizontal a bude vodorovně.

        Position Pozice. Prostě hodnota, kterou jste posuvníkem zvolili. Integer!

        SelEnd - Konec označené části lišty TrackBaru.

        SelEnd Začátek označené části lišty.

        SliderVisible Visible určitě víte co je. Ale Slider? To je to, co jsem nazval posuvníkem. Ten ukazatel na liště. Takže pokud nechcete, aby nebyla vidět hodnota, nastavte False a posuvník zmizí!

        TickMarks Nastavíte, kde budou značky (čárky u lišty). Typy:
              -tmBoth-označení jsou okolo lišty (vpravo a vlevo, nebo nahoře a dole)
              -tmBottomRight-označení jsou na jedné straně lišty (vpravo, nebo dole)
              -tmTopLeft-označení jsou na jedné straně lišty (vlevo, nebo nahoře)


        TickStyle Nastavíte typ zobrazení značek:
              -tsAuto-značky jsou tam, kam je nastavíte jinde (např. ve Frequency)
              -tsManual-označení jsou pouze na kraji (maximální a minimální hodnota)
              -tsNone-u lišty nejsou žádné označení

        A to je všechno. Na to, že jsme už probrali tolik objektů, je toho hodně!
    A v EVENTS? Je zde:

     
      OnChange
    Spustí se, když se změní hodnota Position! Bezva!!!!!
     

    A to je vše! Ale jenom o TrackBaru, teď jdeme dál:
     
  38.   A co opačně? Správně! Jde to. Jinak bych se neptal! Zobrazit hodnotu? Instalovali jste někdy něco? Vzpomínáte na ukazatel procent? Přibývala jedna barva na proužku a druhá se ztrácela. O toho je objekt na liště hned napravo od TrackBaru:
    PROGRESSBAR - Myslím, že už jsem ho před chvílí dostatečně popsal, takže se převalíme k Object Inspectoru:

        Smooth - buď bude na liště čára, nebo několik obdélníčků. Nastavíte-li True, bude to čára, zadáte-li False, budou to obdélníčky!

    Hodně specialit, že? image No nic! Vynahradili jsme si to výše, ne?
     
  39.   A poslední objekt, co tentokrát probereme je okénko na výběr klávesových zkratek. Je asi osmý od leva v oddílu Win32 a je to obrázek rámečku a v něm je Alt:
    HOTKEY - Co to je, jsem popsal výše, a tak se pusťme do vlastností v tabulce Properties v Object Inspectoru

        HotKey - To je klávesová zkratka, která je napsána v rámečku

        InvalidKeys - Zde si vyberete, s jakými tlačítky se nesmějí vytvářet kombinace. Nastavíte-li true např. u hcShift, nemůže uživatel programu zadat zkratku obsahující klávesu Shift. Nastavíte-li false u hcNone (je tam standartně), nesmíte mít jako zkratku jednu samotnou klávesu (např. jenom A).

        Modifiers - A co když máme v InvalidKeys nastaveno hcShift na true? A já zadám třeba zkratku Shift + K? Shift se nahradí klávesou, kterou zde nastavíte. Zadáte-li tedy v Modifiers true u hkCtrl, místo Shift + K se objeví zkratka Ctrl + K!

      Sice zatím neumíte zkratky použít, ale dojde na to. A proč skákat z jedné položky výběru objektů do druhé. Tak jsem to probral předem a až budeme brát menu, budeme mít náskok...
     
  40.  Na konec jsem se rozhodl, že vám popíšu výrobu programu na vypočítání průměru! Začněme složitějším způsobem, který jsem používal, protože jsem tenkrát ještě neuměl převádět Real na String! Z původního programu ještě neznáte jeden objekt a tak ho nahradíme Editem (sice se nám program ještě ztíží, ale to nevadí!). Takže: do okna vložíme 3 tlačítka, jeden Edit a čtyři Labely! Názvy (nápisy):
    okno:Okno(Průměr (r))
    tlačítka: OK(O K) , Konec(Konec) , Maz(Znova)
    edit: Edit(0)
    labely: Napis(r =), R(0), Napis2(,), Des(0)
    Labely poskládejte vedle sebe tak, aby tvořily nápis: "r = 0 , 0"

      Zbytek si poskládejte, jak chcete. Teď si vytvořte proměnné:
    Vys, Pocet, Soucet, Zb, Hodnota : Integer;
      A jdeme dál! Při kliknutí na tlačítko Konec nastavte pouhé Close;.
      U Editu nastavte k proceduře OnChange:

     Hodnota := StrToInt(Edit.Text);
      A teď ta hlavní část mého programu:
    Po kliknutí na OK nastavte:
    Pocet := Pocet + 1;
    Soucet := Soucet + Hodnota;
    Vys := Soucet div Pocet;
    Zb := Soucet mod Pocet;
    Zb := Zb * 10;
    Edit.Text := '';
    R.Caption := IntToStr(Vys);
    Des.Caption := IntToStr(Zb div Pocet);

      A je to! image Skoro! Ale průměr už to dělá! Nevíte jak?
    Pocet určuje počet čísel.
    Soucet je součet všech čísel.
    Vys je výsledek dělení součtu čísel jejich počtem a
    Zb je zbytek. Ten se potom násobí desetkrát, aby se zjistilo desetinné číslo!
    Vynuluje se nápis v Editu,
    do R se napíše Vys (výsledek) a
    do Des se napíše Zb vydělení Poctem.
      Pokud jste to nepochopili, už nic nenadělám! 
    A teď ještě vynulování: Při kliknutí na Maz nastavte:
    Pocet := 0;
    Soucet := 0;
    Vys := 0;
    Zb := 0;
    Edit.Text := '';
    R.Caption := IntToStr(0);
    Des.Caption := IntToStr(0);

      A je to kompletní! 

    Ale ještě jsem slíbil druhou metodu! Tu trochu zkrátím:
    Proměnné máte: 
    Pocet, Mezicislo, Cislo: real;
    A jak na to?
    Objekty necháme stejné, akorát smažeme Napis2, Des, u Editu zrušíme OnChange a upravíme OnClick u OK:
    Pocet := Pocet + 1;
    Mezicislo := Mezicislo + StrToFloat(Edit.Text);
    Cislo := Mezicislo / Pocet;
    Edit.Text := '';
    R.Caption := FloatToStr(Cislo);

    Vidíte... A je to... Vynulovat to snad dokážete sami, ne?
  41. Pátá část by měla (aspoň podle mne) být trochu slavnostnější. A když je navíc přidána v den prvních narozenin (výročí) Kukensius pages, je už co říct:
      Začněme něčím, co vám možná chybělo, ale co jsem ve svých programech měl!
    A to je HUDBA, ZVUKY a VIDEO!
    Samozřejmě to jde! Začněme tedy s MÉDII!:
    Otevřete si položku System (v nabídce objektů), v níž je hned vlevo Timer. Třetí zleva je to, co hledáme:

    MEDIAPLAYER
    To vám přehraje skoro všechno! Nejprve si řekneme, jaké má funkce navíc a potom jak přehrávat určité soubory:
     
        AutoEnable 
    Když není otevřená médium, jsou tlačítka na přehrávání nepřístupná. Když se ale otevře, jsou přístupná. Zde se tato funkce zapíná (True) a vypíná (False).

        AutoOpen Když zadáte adresu média (např.: C:\Windows\Media\Ding.wav), automaticky se otevře (když není otevřené, nedá se přehrát, ale když se otevře neexistující médium, může způsobit problémy). Zde se tato funkce zapíná (True) a vypíná (False).

        AutoRewind Když médium zastavíte tlačítkem (nebo příkazem) STOP, automaticky se přetočí na začátek (pokud by se nepřetočilo, nehrálo by). Zde se tato funkce zapíná (True) a vypíná (False).

        ColoredButtons Když kliknete na malé plus vedle nápisu, volíte, zda budou tlačítka pro přehrávání barevná (Fasle znamená, že budou obrázky černé!).

        DeviceType Nastavení, které médium se bude přehrávat (typ média). O tom budu psát níže podrobněji.

        Display Přehráváte-li video, někde se musí objevit obraz. Zde nastavíte, kde (například nějaký panel, nebo samostatné okno...).

        EnabledButtons Zde nastavíte, která tlačítka budou přístupná.

        FileName Toto je jedna z nejdůležitějších položek. Zde nastavíte adresu média (tj. kde je médium (soubor hudby, zvuku nebo videa) umístěné na disku, CD, disketě, DVD, webu nebo v síti ... např.: C:\Windows\Media\Canyon.mid).

        VisibleButtons Zde nastavíte, která tlačítka budou viditelná.
      
    A to je vše! Slíbil jsem, že se trochu rozepíšu o DeviceType. To se však dozvíte v jednotlyvých typech médií:
     
  42. HUDBA
    Tak tu si rozdělíme: Hudba může být dvou typů:
    1.typ: MIDI: hudba je v počítači uložená tak, že jsou zadané noty, hudební nástroje, tempo a spousty dalších věcí, pomocí kterých počítač hraje. Je to velmi úsporné, ale je to pouze melodie. Nejde k tomu zpěv.
    2.typ: WAVE: hudba je zaznamenána stejně, jako třeba na CDčku. Je prostě zaznamenán zvuk a ten se pak přehraje. To ale většinou zabírá příliš místa.
      Já používám pouze MIDI hudbu. Ta má koncovku MID , nebo RMI. Ale to je jedno, co z toho. Když přejmenujete hudbu např. Music.rmi na Music.mid, nic se nestane.
      U WAVE hudby je to jiné. Základní je asi koncovka WAV (zaznamenávají se s ní hlavně zvuky). A potom dnes známější MP3. Ta je trochu úspornější. Ale nejúspornější je samozřejmě MIDI!
    Pokud chcete přehrávat hudbu z CD, nastavte DeviceType na dtCDAudio.
    Pro WAVE hudbu je zde položka dtWaveAudio.
    Pokud jste si ale z nabídky hudebních typů nevybrali, nebo hodláte přehrávat něco, co nevíte, co je to za typ, nastavte dtAutoSelect. To si samo zvolí to nejvhodnější. (Hodí se u MIDI hudby.)

    To základní o hudbě už umíte, takže jdeme dál:
     
  43. ZVUKY
    Zvuky jsou prostě WAVE média. Dají se nahrát pomocí mikrofonu.
    Mívají většinou koncovku WAV.

    A teď pár věcí k MP3:
    MP3 může být hudba i zvuk (stejně jako WAV). Pokud váš WindowsMediaPlayer dokáže přehrát MP3 média, neměl by být problém, ale pokud ne, program bude mít problémy!!!

    Tak to by byly zvuky (nic moc, ale je to tak):

     
  44. VIDEO
    Ha! A je to tu! Zde využijete i položky Display. Když u ní nic nenastavíte, zobrazí se obraz v novém okně.
    Video je buď s koncovkou AVI (u DeviceType nastavte dtAVIVideo), nebo MPG (nebo taky MPEG - to může někdy blbnout ... platí to samé, jako u RMI a MID!).
    A to je asi zase vše.

    To by byly typy! Ale jak je pouštět?

     
  45.   Je to jednoduché. Stačí pár příkazů:
    Open
    Otevře médium (hodí se, když u AutoOpen máte False).

    Play
    Začne přehrávat médium.

    Pause

    Pozastaví přehrávání.

    Stop
    Zastaví přehrávání média (pokud máte u AutoRewind True, přetočí se médium na začátek).

    Rewind
    Přetočí médium na začátek (hodí se, když u AutoRewind máte False).


    Všechny předchozí příkazy se používají takto:
    Jmenoprehravace.Prikaz;
      Pro pochopení příklad:
    MediaPlayer1.Open;

     
      A teď pár věcí, co se určitě budou hodit:
    Adresa := ExtractFileDir(ParamStr(0))+'\';
    Nejlepší věc, co jsem kdy použil. Sám tomu příkazu vpravo nerozumím, ale hlavně že to funguje. Na co? Adresa musí být string(prostě proměnná typu string pojmenovaná Adresa)! No a ten příkaz vpravo vám vypíše adresu složky, ve které máte uložený EXE soubor programu. Hodí se to např. takto:
      Chcete přehrát MIDI soubor Hudba.mid. Máte ho uložený u programu. Kdybyste jako FileName zadali pouze Hudba.mid, mohl by mít program problémy. Když ale zadáte výše uvedený příkaz do procedury OnCreate (když se vytváří okno) a jako FileName zadáte Adresa + 'Hudba.mid', tak už to bude bez problému.
      P.S.: Na konci příkazu je +'\'. Je to tam proto, protože když máte program například uložený na adrese např. C:\Programy\Program1\Project1.exe, část příkazu vpravo vám vypíše adresu C:\Programy\Program1. Když byste neměli na konci příkazu +'\', museli byste psát např. Adresa + '\Hudba.mid'. Ale to teď nemusíte! image
      P.S.2.: String Adresa se může jmenovat klidně jinak. (Já používám Adresar image - to jako Adresář image)


      Řekl jsem pár, takž dvě. A tu je ta druhá:
    if MediaPlayer1.Position = MediaPlayer1.TrackLength[1] then
    Ano, pak musíte napsat jeden příkaz, nebo ho ohraničit BEGINem a ENDem. Tento příkaz říká: Pokud je pozice MediaPlayeru1 (délka přehrané části média) stejná, jako délka média v MediaPlayeru1, potom... ! Takže už určitě víte, na co se to používá. Tento příkaz dáte někam do časovače (Timer) a každou dobu Intervalu v Timeru se bude kontrolovat, zda médium dohrálo. Pokud ano, stane se to, co napíšete dál. Např.:
    if MediaPlayer1.Position = MediaPlayer1.TrackLength[1] then
      MediaPlayer1.Play;


    To se celkem hodí, ne? A můžete přidávat hudbu a zvuky! Ale musíte mít MediaPlayer.
     
  46. A teď si probereme kostru programu! Nechápete? Však pochopíte! Zde je text, který si Delphi samo napíše, když zadáte novou aplikaci a dvakrát kliknete na okno:

    unit Unit1;

    interface

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

    type
    TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    private
    { Private declarations }
    public
    { Public declarations }
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.dfm}

    procedure TForm1.FormCreate(Sender: TObject);
    begin

    end;

    end.


    Proberme si to postupně po odstavcích:

    unit Unit1;
    Unit znamená jednotka. V našem případě část programu. Tímto nápisem musí začínat text každého okna. Je to prostě úvod pro program, který mu říká, že to, co spouští se (v našem případě) jmenuje Unit1. - To je ta pravá část příkazu!
     
    interface

    To je opět pouze pro program, aby věděl, že se mu budou zadávat proměnné a objekty!

    A když už jsme u Realu, ukážeme si jeho úpravy:

     
    uses

    Kvůli této položce rozebírám program! Zde je totiž zadáno, které soubory má program načíst, aby se mohl vytvořit EXE soubor. Všechny tyto soubory (nebo aspoň většinu) byste měli najít u Delphi v podadresáři Lib! Většinou si všechno Delphi vyplní samo, ale někdy musíte doplnit soubor sami!
     
    type

    Zde jsou zapsány typy objektů, nebo proměnných, které nejsou obsaženy v souborech, které jsou zadány za USES! Zde máme:
    TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    private
    { Private declarations }
    public
    { Public declarations }
    end;

    Ano, to vše patří k sobě. TForm1 je název typu objektu a class(TForm) značí, že je to Okno.
    Dále máme předepsané procedury, které jsou níže oknu přiřazeny (viz. níže). Pod private se píší proměnné, které smí použít pouze okno typu a proměnné zapsané pod public, smí použít všechna okna! 


    var
    Tak tohle jestli nevíte, tak jste nečetli předchozí návody a nebo vnímáte jedním okem tam a bůhví kudy ven! Podle toho, že je zde Form1: TForm1;, se tady asi bude určovat název okna! Ano! Vytváří se zde objekt typu TForm1, který se jmenuje Form1. Jasné? Snad ano...

    implementation
    To, stejně jako interface značí část programu. Tentokrát ale už část, která se bude provádět a bude vidět navenek!

    {$R *.dfm}
    Toto značí ještě jeden soubor, ze kterého má program také čerpat důležité věci (viz. jindy).

    procedure
    To už ale znáte. Procedury už jsme probírali a vy jistě víte, kam patří! image 

    end.
    End s tečkou značí konec celého programu. A mám takový pocit, že už jsme vám to někdy říkal (vlastně psal, ale vyjde to na stejno!).
     
  47.   Tak! A teď, když jsem vám konečně vysvětlil, kde co v programu je, se vraťme k WAVE souborům. Speciálně s koncovkou WAV! U uses jsem psal, že někdy se musí soubor zapisovat. A tak si ho zapíšeme, abyste mohli používat následující příkazy. Před středník na konci uses tedy vpište:

    MMSystem
      Tím jsete programu řekli, že budete používat přehrávání wavů bez přehrávače! (můžete i s ním, ale je to zbytečné!) Tady je příkaz, který k tomu slouží:
    PlaySound(Název souboru, 0, typpřehrávání);
    Název souboru je např.: 'Zvuk.wav', 0 je 0 a typy přehrávání vám dva základní napíšu:

    SND_ASYNC - Zvuk se jednou zahraje (to je základní funkce)
    SND_LOOP - Zvuk se hraje neustále dokola (když skončí, spustí se znovu).
    P.S.: Nedají se přehrávat dva zvuky naráz image


     
  48.   Přestaňme už probírat média! Co takhle okno s hláškou? Např.: "Opravdu chceš ukončit hru?"
      Takže do toho: Slouží k tomu jediný příkaz:

    if Application.MessageBox(PChar('hláška'),PChar('názevokna'), MB_tlačítka) = Tlačítko then
      8-O... Šílené, ale lehko vysvětlitelné! image
    Místo hláška doplníte to, co se objeví v okně jako text.
    Místo názevokna napíšete to, co bude napsáno na okraji okna (prostě nadpis)!
    Místo tlačítka doplníte např.: OK - vznikne tedy MB_OK.
    A místo Tlačítko doplníte např.: IdOK.
    A teď si probereme typy názvů za MB_:

    OK - v okně bude pouze tlačítko OK
    OKCANCEL - v okně bude tlačítko OK a Storno
    YESNO - v okně budou tlačítka Ano a Ne
    YESNOCANCEL - v okně budou tlačítka Ano, Ne a Storno
    RETRYCANCEL - v okně budou tlačítka Znovu a Storno
    ABORTRETRYIGNORE  - v okně budou tlačítka Zrušit, Znovu a Ignorovat
      - Můžete si také přidat obrázek. Za např. MB_YESNO napíšete + MB_ a něco z těchto možností:

    ICONEROR - obrázek chyby
    ICONINFORMATION - obrázek informace
    ICONWARNING - obrázek chyby
    ICONQUESTION - obrázek otázky
    MB_... už probrané máme a tak se pusťme do položky uvedené jako Tlačítko:
    Tato část textu totiž určuje, které z nabízených tlačítek bylo zmáčknuto. Možnosti:

    IdOK bylo stisknuto OK
    IdCANCEL bylo stisknuto Storno
    IdYES bylo stisknuto Ano
    IdNO bylo stisknuto Ne
    IdABORT bylo stisknuto Zrušit
    IdRETRY bylo stisknuto Znovu
    IdIGNORE bylo stisknuto Ignorovat

    A nakonec si uveďme příklad:

    if Application.MessageBox(PChar('Pozor! Program má problémy s načtením souboru!'),PChar('Chyba!'), MB_ABORTRETRYIGNORE  + MB_ICONEROR) = IdABORT then
    Close else
    if Application.MessageBox(PChar('Pozor! Program má problémy s načtením souboru!'),PChar('Chyba!'), MB_ABORTRETRYIGNORE  + MB_ICONEROR) = IdRETRY then
    ProceduraNactiSoubor;

    Pokud kliknete na Zrušit, program skončí. Pokud na Znovu, spustí se procedura ProceduraNactiSoubor. Pokud kliknete na Ignorovat, program bude pokračovat v práci.
    P.S.: Pokud máte pouze MB_OK, stačí psát jen

    Application.MessageBox(PChar('hláška'),PChar('názevokna'), MB_OK);
    a dál jen to, co se stane po odkliknutí okna!
     
  49.   A na závěr jeden objekt z položky Standart:
    SCROLLBAR - To je to, co vidíte vpravo na okně! A někdy i dole! Ten posuvník. Funguje podobně jako TrackBar (viz minule - bod 7.) až na pár věcí navíc:

        Kind - Nastavíte, zda je posuvník shora dolů, nebo zleva doprava (vodorovný, nebo svislý)


        LargeChange - Když kliknete někam na lištu posuvníku, ukazatel se pohne o několik míst směrem k místu, kam jste klikli. Zde nastavíte, o kolik míst (o jaký počet) se posune.

        PageSize 
    - Zde nastavíte šířku posuvníku (v pixelech)

        SmallChange - Zde nastavíte, o kolik míst se posune posuvník, když kliknete na šipku na kraji lišty. (většinou to bývá nižší číslo než LargeChange)

      A dochází na to pro vás asi nejsmutnější: KONEC! Už jenom příklad a je po všem!
     
  50.   Co takhle vyrobit si přehrávač Videa, hudby a zvuku? Nic moc, ale co chcete po dnešním Médiovém vydání?
      Nejprve vytvořte MediaPlayer. Jmenuje se Hudba a je neviditelný.
    Potom dvě tlačítka. HudbaStop(tak se bude jedno jmenovat) bude mít nápis Stop a HudbaPlay(to je to druhé) bude mít nápis Play. Klikněte 2x na okno a pište:
    Hudba.FileName := 'Hudba.mid';
    Hudba.Open;

    A nezapomeňte k programu přiložit MIDI hudbu pojmenovanou Hudba.mid!
    Po stisknutí HudbaStop nastavte Hudba.Stop; a po stisknutí HudbaPlay nastavte Hudba.Play;. A máte přehrávač hudby! Teď přidáme video:
      Vytvořte opět MediaPlayer. Jmenuje se Video a je neviditelný.
    Potom dvě tlačítka a panel. VideoStop(tak se bude jmenovat první tlačítko) bude mít nápis Stop a VideoPlay(to je to druhé) bude mít nápis Play. Ať je nepomícháte s tlačítky k Hudbě! Panel pojmenujte panel a smažte Caption. U MediaPlayeru Video nastavte Display na Panel (Delphi by ho mělo nabídnout!). Klikněte 2x na okno a pište:
    Video.FileName := 'Video.avi';
    Video.Open;

    A nezapomeňte k programu přiložit AVI video pojmenované Video.avi!
    Po stisknutí VideoStop nastavte Video.Stop; a po stisknutí VideoPlay nastavte Video.Play;. A máte přehrávač videa!
      A nakonec změna! Nebudeme dávat MediaPlayer! Do položky uses dopište MMSystem.
    Potom vytvořte tlačítko Zvuk s nápisem Zvuk. Po kliknutí u něho nastavte:

    PlaySound('Zvuk.wav', 0, Snd_Async); 
    A opět nesmíte zapomenout vytvořit Zvuk.wav! A je to! Primitivní, ale co jiného se zvukem a videem? Já vím! Rozhodně něco jiného, ale už je pozdě image! Tak ahoj příště!

    A nakonec jsem pro vás připravil balík MIDI hudby (329kB, po rozbalení 1,08MB), který když rozbalíte (je potřeva WinZIP), získáte 60 různých celkem slušných písniček! A pokud se vám nelíbí, hledejte jinde na internetu a jistě nějaké jiné najdete...
  51.   Vítej, programátore! Už toho určitě hodně umíš (z předchozích lekcí na Kukensius pages) a tak se pustíme do hlavní věci v programu! A to je MENU. Nejprve však probereme jednu věcičku, která s tím souvisí! A tak v položce Win32 (třetí odleva) najděte
    IMAGELIST
      Zde si uložíte obrázky, které jdou pak jinde použít. Tak se podívejme do Object Inspectoru na dvě důležité věci:
     
        Height 
    tentokrát neznačí výšku objektu, ale obrázků v seznamu

        Width stejně jako u Height - značí tentokrát šířku obrázků
      

      Pokud chcete přidat obrázek, klikněte dvojitě na ikonku ImageListu a v novém okně můžete přemísťovat obrázky, přidávat nové (Add), přepisovat je jinými (Replace), mazat (Delete), ukládat na disk (Export), všechny smazat (Clear), měnit průhlednou barvu (uprostřed nahoře) a měnit zarovnání obrázku (Crop-obrázek se prostě ořízne do zadaného rozměru; Stretch-obrázek se smrskne, nebo roztáhne, aby byl akorát na zadaný rozměr; Center-vyřízne se střed obrázku v zadaných rozměrech).
      A teď si ukážeme jeden ze způsobů, jak ImageList použít:
     
  52.   Uděláme si slibované menu! V položce Standart hned druhé zleva je
    MAINMENU
      Neboli hlavní menu. Prostě ta lišta nahoře, kde je Soubor (nebo File), Úpravy (nebo Edit) atd. Takže se podívejme do Object Inspectoru na 2 speciality:
     
        Images 
    zde si vyberete ImageList, ze kterého se budou používat obrázky do menu (nejlepší je rozměr 16x16)

        Items a zde si zvolíte položky menu. Vyvolá se také dvojklikem na ikonku menu! Viz. níže:
      

      Po dvojitém kliknutí na Items, nebo na ikonku MainMenu se vám otevřelo okno se jménem menu. Ze začátku by mělo být prázdné! Jen v levém horním rohu by měl být přerušovanou čarou udělaný rámeček! A na něj klikněte!
     
  53. "Fíha, vono se v tom vokně vlevo votevřel nějakej objekt beze jména typu TMenuItem! Tý vole, co s tím?"
      Ano, to je správné! Nejprve pojmenujte položku menu! Můžete sice pouze vyplnit Caption a program si vytvoří název sám, ale ne každému se líbí tlačítko s nápisem Ukončit, které se jmenuje Ukonit1. Vám ano? Potom si ušetřete pojmenovávání položek v menu! Uloitvytvoennpisyaobrzky1 - já vás varoval! (Caption='Uložit vytvořené nápisy a obrázky')  image No, ale pojďme dál! Jaké další zvláštní položky nás čekají?


        AutoCheck Pokud chcete, aby po kliknutí na položku se u ní objevil znak pro označování, zvolte True!
      

        Bitmap - Můžete si načíst z disku obrázek, který bude nalevo od nápisu položky! Nejlépe v rozměrech 16x16!
        

        GroupIndex Zde určíte číslo skupiny zaškrtávacích tlačítek. Pokud ale nemáte RadioItem (viz.níže) jako True, není třeba se o tuto položku starat!
      

        ImageIndex A je to tady! Konečně se bude hodit znát ImageList. Zde totiž zadáte číslo, které je v předem zvoleném ImageListu pod obrázkem, který chcete nalevo od textu položky.
      

        RadioItem Pokud zadáte True, ve skupině tlačítek půjde zaškrtnou pouze jedno (znaménko zaškrtnutí se změní na kolečko!).
       

        ShortCut Vyberete si klávesovou zkratku, která se má přiřadit položce v menu. Stačí tedy stisknout např. pouze Ctrl + A a nemusíte v hledat položku v menu! Navíc se zkratka objeví napravo na položce!
        

        SubMenuImages Pokud znáte položku v menu, která má má vpravo takovou šipečku a když na ní kliknete, objeví se další menu po straně již otevřeného, musím vám říct, že v Delphi to samozřejmě jde udělat také! Klikněte v okně pro editaci menu na vámi určenou položku pravým tlačítkem a vyberte položku Create Submenu! Tím vám vznikne ono vedlejší menu zvané SubMenu... Vraťme se ale k SUBMENUIMAGES! Zde nastavíte, který ImageList bude používat SubMenu navazující na vybranou položku! Stačí? To jsem rád! image
      

    Nakonec vám ještě chci říct, jak vytvořit oddělovací čáru:
      Jednoduše! Místo textu napište do položky Caption jednu pomlčku (neboli minus) a program si oddělovací čáru vyrobí sám! A pokud chcete, aby bylo nějaké písmeno textu podtržené, napište před něj znak END (&). Podtržené písmeno bude funkovat podobně, jako klávesová zkratka. Pokud znáte tuto funkci, hodí se vám to, když ne, tak se někoho zeptejte! Určitě to bude vědět! Mně se to zde nechce psát!image... A teď pojďme dál:

     
  54.   Naučím vás dělat i takovéto menu, které se otevře pravým kliknutím. Hned vedle MainMenu naleznete
    POPUPMENU
      Na co tohle okno je, už víte, tak se pusťme do speciality v Object Inspectoru:
     
        Aligment 
    Kde se má objevit menu, když kliknete? Napravo od místa, kam kliknete (paLeft), pod místo, kam kliknete (paCenter), nebo nalevo (paRight)?

      A ostatní je stejné, jako u MainMenu!
     Ještě by ale chtělo říct, že pokud někde chcete PopupMenu, musíte ho přiřadit nějakému objektu, který má položku PopupMenu. Stejně tak i u Main, menu, ale to si okno přiřadí samo! image A to je z menu vše!

     
  55.   Nezajímá vás ten divný objekt nalevo od MainMenu? Z položky Standart už znáte skoro vše vlevo, akorát tohle vám to ruší! Tak dobře! Povím vám o tom! Ale bude to vyžadovat další znalosti:
    FRAMES
      Napadlo vás někdy vložit okno do okna? Mne ne a jestli to napadlo vás, asi se zcvoknu, protože jsem vám ani neřekl, jak udělat další okno! Nebo ANO? NE! Řeknu vám to za chvíli. Ale ten nápad lze uskutečnit pomocí tohoto objektu! Kliknete někam a z nabídky si vyberete, které okno chcete vložit! Objekt má potom stejné vlastnosti jako ono okno! Kromě pozice a názvu!
     
    Ale teď k tvorbě více oken: 

     
  56.   Takže! Pokud chcete vytvořit nové okno, vyberte položku New v menu (File) a v SubMenu (doufám, že víte, co to je!!!) vyberte položku Form!
      A je to! Teď už postupujte, jako když vytváříte nový Project! Prostě přejmenujte okno atd...
      Ale takhle bych vám nepomohl! Dále potřebujete nějak seřadit okna! A tak probereme důležitou položku v menu! Nejprve vyberte Project a úplně dole naleznete položku Options!
      Zde máte spoustu částí nastavení a tak začněme tou, díky které vám to vysvětluji:
    FORMS
      V této části je důležitá akorát volba okna, které se otevře při spuštění programu (Main form)! A jdeme dál:
    APPLICATION
      Velmi důležité! Omlouvám se, že jsem to neuvedl již dřív! image Dík, že mi to prominete! image
    Takže: Title - zde napíšete název programu (i s háčky a čárkami). Pak už je jen důležitá položka Icon - po kliknutí na ní vyberete, jaká ikona bude u programu! Tato ikona bude u EXE souboru a na hlavním panelu ve windows (když spustíte program) společně s názvem programu!!!
      Ikona? Ptáte se! Ano, odpovídám! ... Dost! Prostě vám chci říct, že ikonky, které máte ve Windows může mít i váš program! K oknu už ikonku dát umíte, ale k EXE souboru? ... Teď už ano! Ale kde je brát?
      No, buď na internetu a nebo si je sami vyrobit! JAK?? V Delphi, přece! JAK? Zajímá vás to? Tak v tom případě si přečtěte ještě bod 7. a dočtete se až k osmému, kde o tom píšu a nebo rovnou přeskočte! image)
     
  57.   Teď si řekneme, jak pracovat s více okny! Sice jen 3 základní příkazy, ale co jiného? image Takže tady jsou:

    Close
    To už určitě znáte (URČITĚ - na 100%, protože jestli ne, tak neprogramujte. To je základní příkaz!). Pokud ale nechcete zavřít okno, do jehož textu příkaz dáváte, musíte napsat příkaz ve tvaru: NazevOkna.Close;
    Nazev okna samozřejmě nahradíte názvem okna, které chcete zavřít!
    Např.: Form2.Close;


    Show
    To je to nejhlavnější! Chcete otevřít nějaké okno? Pak napište: NazevOkna.Show;
    Nazev okna samozřejmě nahradíte názvem okna, které chcete otevřít!
    Např.: Form2.Show;
    A Form2 se objeví. Kdykoli můžete překliknout na jiné okno v programu, nebo nějaké zavřít! POZOR!!! Pokud zavřete HLAVNÍ OKNO, zavřete celý program!!!


    ShowModal
    Skoro to samé, jako Show: NazevOkna.ShowModal;
    Takže např.: Form2.ShowModal;
    A Form2 se objeví, ale dokud ho nezavřete, nesmíte k ostatním oknům programu! Tak např. fungují okna s chybovými hláškami! Dokud nekliknete třeba na OK, nemůžete dál pracovat!

    A to je vše! Teď si řekneme, jak vyrábět OBRÁZKY!

     
  58. V menu Delphi najděte položku Tools. Když jí rozbalíte, úplně dole je položka
    IMAGE EDITOR
    Nástrojová lišta Image Editoru s popiskyKdo umí anglicky, už zjistil, že Image Editor znamená Obrázkový Editor, a že se tam asi budou vytvářet nějaké obrázky. A uhádl! Image Editor je podprogram Delphi. Nemusíte ho spouštět přímo z Delphi, ale klidně i z Windows (stačí ho nalézt ve složce s Delphi). Když ho tedy spustíte, otevře se okno velmi podobné Malování ve Windows. Akorát je vše anglicky a lze zde vytvářet víc věcí pro Delphi. V položce Files a v Submenu z New se vám zatím bude hodit akorát Bitmap, Icon a Cursor File. Chcete-li vytvořit jakýkoli obrázek, klikněte na Bitmap File. Otevře se vám okno. Zde si zvolíte šířku (width), výšku a počet použitelných barev (vpravo). Po stisknutí OK můžete vesele začít vytvářet. Pokud ale chcete vyrobit ikonu například pro svůj program, klikněte na Icon File! Také se vám otevře okno! Tentokrát si vlevo vyberete, zda chcete vytvářet malou (small icon), nebo velkou ikonu (standart icon) a vpravo opět počet barev.image Po stisknutí OK už nebude editor stejný! Ve výběru barev budou navíc dvě barvy (viz. obr. vpravo)! Když někam umístíte horní barvu, na onom místě bude vždy opačná barva, než je pozadí. Dolní barva je naopak průhledná! A to se u ikon hodí!
    Dále je zde také navíc tlačítko New... a výběr mezi dalšími typy ikony. Když kliknete na New, do souboru ikony se přidá ještě jedna ikona, který si zvolíte v otevřeném okně. Můžete tedy mít třeba soubor Ikona.ico, v němž budou třeba 4 obrázky... A ještě byla řeč o Cursor File! Tentokrát se vám okno neotevře! Akorát si prostě můžete nakreslit svůj soubor kurzoru myši. Barvy jsou jen čtyři: bílá, černá, průhledná a neprůhledná (viz. Icon File). Takže hybaj do kreslení ikonek pro svou hru (nebo samozřejmě program)!

     
  59.   Ano, máte pravdu! Prve jsem říkal, že odleva máme skoro celou položku Standart, ale chybí ještě:
    MEMO - Ten rámeček s linkami (jakoby textem)! Zde prostě editujete text s více řádky! Určitě vám to chybělo, že? Tak, jaké máme speciality?:

        Color - Opakuji se, ale musím (nebo spíš mi to připadá vhodné) uvést, že to znamená barvu pozadí...


        Lines - Klikněte 2x na tuto položku a otevře se vám okno, kde editujete text, který bude v Memu!

        Text 
    - Tato položka sice není v Object Inspectoru, ale je důležitá! Je to totiž nápis, který je v Memu. Narozdíl od Lines je Text proměnná string!

        ReadOnly - Pokud zadáte True, nepůjde do Mema zapisovat! Pouze číst a kopírovat!

        ScrollBar - Zde si určíte posuvníky:
              -ssBoth-Memo bude mít posuvník vpravo i dole
              -ssHorizontal-Memo bude mít posuvník jenom dole (řádky se nebudou automaticky zalamovat!)
              -ssNone-Memo nebude mít žádné posuvníky
              -ssVertical-Memo bude mít posuvník jenom vpravo


        WantReturns - Pokud zadáte False, bude Memo ignorovat stisknutí klávesy Enter

        WatnTabs - Pokud zadáte False, bude Memo ignorovat stisknutí klávesy Tab

        WordWrap - Zadáte-li False, řádky se nebudou automaticky zalamovat

      Stačí? To jsem rád..........
     
  60.   A nakonec už jenom uvedu nějaký program na zopakování! TAKŽE:
    Je to skoro až nesmysl, ale po dnešním specializovaném díle nic jiného ani sesmolit nejde!
      Nejprve si vytvoříme tři okna (včetně původního). Okno1, Okno2 a Okno3! Do Okna1 vložíme MainMenu. Na něj dvakrát klikneme a uděláme dvě hlavní položky (buňky): Program (bude vlevo) a Okna (bude vpravo). Pod Program vložíme položky Editovat a Konec. Pod Okna vložíme položky Normální a Chybové.
      Do Okna2 vložíme PopupMenu s položkami Zavřít okno a Zavřít program. Nezapomeňte Oknu2 přiřadit to PopupMenu! A do Okna3 vložte FRAMES. Jako okno vyberteOkno2!
      A teď se pusťme do psaní! Nejprve ale do Okna1 vložte Memo (název Zapisnik a ReadOnly je True) a u položky Editovat nastavte AutoCheck na True! Posléze na ní klikněte a pište:
    if ReadOnly then
      Zapisnik.ReadOnly := False else
      Zapisnik.ReadOnly := True;

    A je to! Teď položku Konec. To snad víte! Ano: Close;
    Následuje položka Normální:
      Okno2.Show;
    Dále máme už jenom položku Chybové:
      Okno3.ShowModal;
    A můžeme postoupit do položek v PopupMenu v Okně2! Takže: Zavřít okno:
      Close;
    A pak už jenom Zavřít program:
      Okno1.Close;
    Vidíte, a program je hotov! image Pokud jste nepochopili, jak program funguje, buď si to zjistěte z horního textu, nebo mi někam napište! A pokud jste to pochopili, jsem rád, že už se v Delphi tak vyznáte...
  61. Jsem rád, že už jste pokročili až k sedmé části! Tentokrát se zaměřím na práci se soubory! Začněme okny pro výběr souboru. Nejprve pro otevírání! V položce Dialogs najděte úplně vlevo
    OPENDIALOG
      To je jakoby takovéto okno, které se otevře, když chcete něco načíst (otevřít). Tak se podívejme do Object Inspectoru na dvě důležité věci:
      
        DefaultExt - 
    zde je uložena koncovka souboru, která se k němu má automaticky přidávat. Např.: htm

        FileName - zde je uložena adresa souboru

        Filter klikněte 2x na položku a v otevřeném okně editujte typy souborů, které se smí otevírat. Vlevo typ souboru popište a vpravo napište jeho koncovku ve tvaru např.: *.htm
     
     
        FilterIndex 
    zde si vyberete pořadové číslo položky výběru typu souboru, který má být aktivní.
     
        Options - 
    zde je spoustu dalších nastavení, jaký má soubor být (viz. 2.bod-SaveDialog)
     
        Title - 
    text, který bude nahoře na okně (titulek)

      Tak to by byl OpenDialog. Probereme ještě SaveDialog a pak podrobnější práci se soubory.
     
  62.   Napravo od OpenDialogu by měl být
    SAVEDIALOG
      Má naprosto stejné položky, jako OpenDialog a tak si pouze probereme pár položek Options. Popis odpovídá tomu, když zadáte určité položce True:

     
        ofReadOnly - 
    kolonka otevřít jen pro čtení je zaškrtnuta
     
        ofHideReadOnly 
    soubory pouze pro čtení a kolonka otevřít pouze pro čtení se nezobrazí
     
        ofPathMustExist 
    adresa souboru musí existovat, aby se dalo stisknout Otevřít
     
        ofFileMustExist 
    soubor musí existovat, aby se dalo stisknout Otevřít

    A to je z těch důležitějších vše! Nyní postupme k používání základních funkcí Open/SaveDialogu:
      Hlavní asi je zjistit, který soubor si uživatel vybral! K tomu slouží již zmíněná položka FileName. Ta se ale změní i když při výběru souboru kliknete na Storno!
      Okno (dialogové) pro hledání souboru k načtení  otevřete příkazem EXECUTE!
    Např.: OpenDialog1.Execute;
    Tím ale nezjistíme, zda uživatel stiskl Storno či OK. K tomu slouží tento příkaz, ale jinak napsaný. Tak, aby byl zároveň Boolean:
    if OpenDialog1.Execute = True then
    begin
    end;

    Nebo také zkráceně:
    if OpenDialog1.Execute then
      Mezi begin a end v těchto dvou případech napíšete, co se má stát po stisknutí OK. Zeptáte-li se programu na False, splní se příkazy mezi begin a end pokud bude stisknuto Storno.
     
  63.   Tak! Dialogová okna už obsluhovat umíte! Teď postupme k samotné práci s externími soubory (s těmi, které prostě nejsou součástí EXE souboru (kromě multimédií). Např. textové soubory, nebo i s vaší vlastní koncovkou). Začněme otevřením souboru:
    Nejprve vám uvedu příklad a potom popíšu jeho části:

    procedure TOkno.TlacitkoClick(Sender: TObject);
    var
      Soubor: file of Integer;
    begin
      AssignFile(Soubor, 'Číslo.int');
      Reset(Soubor);
      Read(Soubor, Cislo);
      CloseFile(Soubor);
    end;


    Mno, tak, máme tu nějakou proceduru. Přesněji proceduru, která se spouští po kliknutí na tlačítko Tlacitko, ale to je teď jedno. Nás zajímá její obsah! Za var máme Soubor: file of Integer; To znamená, že proměnná Soubor bude nějaký externí soubor, se kterým budeme pracovat. Nikde jinde ho ale používat nebudeme a tak ho můžeme vytvořit pouze pro tuto proceduru. file of Ineteger; samozřejmě nenapíšeme u každého souboru! Pouze u toho, který má obsahovat jedno číslo! Chceme-li třeba, aby obsahoval True, nebo False, zapíšeme file of Boolean; OK? Tak to by bylo! Teď ale dál: AssignFile(Soubor, 'Číslo.int'); To je příkaz pro otevření souboru, který bude stejného typu jako Soubor a bude mít adresu (resp. jméno) Číslo.int! Chcete-li nahradit Soubor, můžete, ale jiná proměnná musí existovat a musí to být proměnná externího souboru! Stejně tak ani proměnná po var se vůbec nemusí jmenovat Soubor! Adresa externího souboru nemusí být Číslo.int, ale musí být mezi apostrofy( ' ). Koncovku (to je to za tečkou) můžete napsat jakoukoli. Třeba prd image. Takže budete mít třeba Kukensiův.prd image). Tak jsme se zasmáli, že? imageimage A teď dál: Reset(Soubor); slouží k samotnému prohlédnutí souboru Soubor (pokud neexistuje, jste v pr... program nahlásí chybu!!!).
    A dostáváme se k nejhlavnější části: Read(Soubor, Cislo); Tím načteme obsah externího souboru Soubor do proměnné Cislo! Samozřejmě pokud máte Soubor: file of Integer;, musí být Cislo: Integer; Po tomto příkazu už máte obsah Souboru v Cislu a můžete pracovat pouze s Cislem! Nezapomeňte však soubor zavřít! Příliš by to nevadilo, ale proč dělat počítači problémy se zbytečně otevřenými soubory v paměti! K tomu slouží poslední příkazCloseFile(Soubor); A to je z otevírání asi vše!

     
  64.   Asi vás nepřekvapí, že pro ukládání do souboru jsou skoro jiné příkazy. Budu postupovat stejně jako u předchozího bodu:

    procedure TOkno.TlacitkoClick(Sender: TObject);
    var
      Soubor: file of Integer;
    begin

      AssignFile(Soubor, 'Číslo.int');
      ReWrite(Soubor);
      Write(Soubor, Cislo);
      CloseFile(Soubor);
    end;


    Některé příkazy už znáte, že? První 4 řádky tedy přeskočím. A co ten pátý? Ten už taky znáte, že? K němu ale musím připsat poznámku: při otevírání Soubor musel existovat! Zde samozřejmě nemusí. Zde tento příkaz externí soubor Číslo.int vytvoří a pokud už existuje, pouze ho nalezne!
    ReWrite(Soubor); Tak na tohle si dejte pozor! Po tomto příkazu už ze souboru nic nezjistíte! On totiž smaže veškerý obsah souboru a následující příkaz Write(Soubor, Cislo); do Souboru napíše obsah Cisla. Zde opět musí být Cislo stejného typu jako Soubor (ale bez file of!). No, a zbytek už zase znáte! Takže pokročme k souboru s nápisem (textem)...
     
  65.   Radujete se, že jste to pochopili? Tak honem přestaňte, protože ještě nevíte vše u všech typů proměnných to takhle funguje, ale u stringu byste narazili! Jen si zkuste napsat:
    Soubor: file of string;  Delphi vypíše chybu:

     [Error] Project1.pas(411): Type 'String' needs finalization - not allowed in file type 
    Neboli v překladu:
    [Chyba] Project1.pas(411): Typ 'String' potřebuje zakončení - nedovoleno u typu souboru
    Nevíte, jaké zakončení? Tím je myšlen maximální počet znaků! Takže když napíšte:
    Soubor: file of string[50];, program už chybu nenapíše. Číslo v hranaté závorce samozřejmě můžete změnit podle vlastní potřeby délky stringu. Ale POZOR! Soubory ve Windows s koncovkou txt NEJSOU soubory stringu!!!!! Další zrada, co? Neplačte, jsem tady, abych vám pomohl! image Takže TEXTOVÉ SOUBORY:
    Soubor: TextFile;
    A je to!? NE!!! TextFile může být více řádkový! Pokud zapisujete, vše je normální! Pokud ale chcete číst, narazíte! Napíšete-li totiž Read(Soubor, Memo.Text);, v Memu (viz. 6.část) se vám objeví pouze první řádek! A je tu problém!!!!! A proto vám zde napíšu vzor, podle kterého se můžete řídit, abyste neměli problémy:


    procedure TOkno.TlacitkoClick(Sender: TObject);
    var
      Soubor: TextFile;
      Radek: string;
    begin

      AssignFile(Soubor, 'Kniha.txt'
    );
      Reset(Soubor);
      while not Eof(Soubor) do
      begin
        ReadLn(Soubor, Radek);
        Memo.Lines.Add(Radek);
      end;

      CloseFile(Soubor);
    end;


    A jdeme pitvat! To, co je jiné, jsem pro přehlednost zklopil (použil kurzívu, OK? image). První změna je proměnná Radek! To není jako jméno, ale jako řádek (klidně si to pojmenujte Mumuland, nebo jak chcete! Já zde mám proste Radek... NE Radka! image). Tento string je důležitý! Budeme do něj postupně ukládat jednotlivé řádky (nebo pokud se vám líbí, tak Radky image). Dále je změna pětiřádková:
    while not Eof(Soubor) do
    begin
      ReadLn(Soubor, Radek);
      Memo.Lines.Add(Radek);
    end;

    A tu si teď pořádně probereme! while not Eof(Soubor) do znamená, že dokud při načítání nenarazíme na konec externího souboru Soubor, program bude neustále opakovat příkazy mezi begin a end! Tím jsme se dostali kReadLn(Soubor, Radek); Zde si všimněte, že příkaz Read se změnil na ReadLn, což značí, že se má číst a poté přeskočit na další řádek! Zde jsme si tedy uložili jeden řádek do stringu Radek. A v příkazu Memo.Lines.Add(Radek);přidáme Radek na konec obsahu Mema! To se opakuje do té doby, dokud soubor neskončí! Chápete? Pokud ne, prostě to nějak opište a nebo mi napište, co nechápete image. A tím máme probranou práci se soubory.

     
  66.   "To je sice hezký, ale co když chci uložit třeba víc čísel do souboru?" Jo, tak to teda opravdu se svými znalostmi (z mého návodu neumíte), ale nebojte se, hned vám to řeknu. Hlavní věcí, kterou budete muset znát je novou variantu proměnné. Před chvílí jsem vám ukázal FILE OF a teď nás čeká:
    ARRAY [] OF
    Nebo-li POLE! Pole nějaký prostor pro ukládání. Dejme tomu, že si pro názornou ukázku budeme ukládat třeba Boolean do našeho okolí. To je nejjednodušší proměnná. Buď ano, nebo ne, že? Budeme uvažovat, že 1 Boolean se vejde na 1mm. Takových Booleanů může být spousta a tak si musíme určit limit. Minimální pořadové číslo může být třeba 0. Ale musíme zadat ještě maximální. Takže třeba 9 mm! Tudíž budeme mít 10 čísel (0, 1, 2, 3, 4, 5, 6, 7, 8 a desáté: 9) To, co jsem vám teď napsal, zapíšeme: NejakePole: array [0..9] of  . Takže na úsečku 1cm se vejde 10Booleanů. Ale co když přejdeme z úsečky do obdélníku? Pak na 1 centimetr čtvereční vyjde 100 Booleanů! Pole ale musíme zapsat jinak: NejakePole: array [0..9, 0..9] of  . Zde už totiž máme dva rozměry. A co když se přemístíme do prostoru? Budeme mít 3 rozměry. Takže krychli 10x10x10mm zapíšeme: NejakePole: array [0..9, 0..9, 0..9] of  . Tak můžeme pokračovat dál. Třeba až k 1000 rozměrům! Ale v běžném programování asi použijeme jen tyto tři varianty.
      Předepsat proměnnou tedy už umíme, ale jak ji použít? Jednoduše:
    NejakeCislo := NejakePole[PoradoveCislo];
    NejakeCislo je Integer, NejakePole array of Integer a PoradoveCislo je pořadové číslo určitého Integeru v poli NejakePole. Takže v našem případě 0, 1, 2, 3, 4, 5, 6, 7, 8, nebo 9. Opačně to funguje stejně:
    NejakePole[PoradoveCislo] := NejakeCislo;
    Normální pole už použít umíme. Takže už jen stačí říci, jak ho zapsat do Souboru:
    Soubor:file of array [1..24] of Integer;
    nebo třeba:
    Soubor:file of array [0..99] of string[20];
    A máme probráno POLE!

     
  67.   "Dobře, ale co když chci do souboru uložit třeba skóre ze hry a u každého skóre jméno výherce?" No problem! Další (poslední) úskalí! Soubor musí být prostě jedna proměnná. A tak vám řeknu, jak vyrobit vlastní proměnnou! Takže:
      Nejprve si najděte začátek textu programu a tam
    type
      
    TForm1 = class(TForm)
      private
        { Private declarations }
      public
        { Public declarations }
      
    end;
    (takhle vypadá většinou pouze nový program, ale i tak věřím, že tuto část najdete! Vždyť sem už jste psali proměnné!) Zde budeme psát mezi type a
     TForm1 = class(TForm).
    Nejprve musíme typ proměnné nějak pojmenovat většinou se typy proměnných pojmenovávají na začátku s T (třeba TMaPromenna), ale není to třeba. Spíš to slouží k přehlednosti a že třeba můžeme mít proměnnou MaPromenna : TMaPromenna; A vidíte, zapisuje se stejně, jako všechny normální proměnné. Ale vraťme se zpět pod type. Opět zde ukážu příklad (Použil jsem dokonce typ proměnné ze záchodníčka ... Ale trochu upravené, abyste nemohli vyrobit program na úpravu skóre image):


    type
      TSoubor = record
        Prvni: Integer;
        Vitez: string[20];
        Druhy: Integer;
        Skoro: string[20];
        Treti: Integer;
        NicMoc: string[20];
      end;


      TForm1 = class(TForm)
      private
        { Private declarations }
      public
        { Public declarations }
      
    end;

    Tak takhle by měl vypadat začátek nově vytvořeného programu pouze s typem proměnné TSoubor. TSoubor můžete nahradit svým vlastním názvem, ale = record musí zůstat!
    Dále už píšete podproměnné. Až po end; A je to!
    Můžete třeba zapsat tohle:


    type
      TNeco = record
        Cislo: Integer;
        DvacetZnaku: string[20];
      end;

      TCosi = record
        Cislo: Integer;
        DvacetZnaku: string[20];
        Neco: TNeco;
      end;


      TForm1 = class(TForm)
      private
        { Private declarations }
      public
        { Public declarations }
      
    end;

    A jak budeme s naší proměnnou pracovat? Ukažme si práci s naší ukázkovou proměnnou typu TCosi. Nejprve si vytvoříme proměnnou: Cosi: TCosi;
    A teď už k samotnému zápisu:
    Cosi.Cislo := 12;
    Cosi.DvacetZnaku := 'Ahoj ňoumo!';
    Cosi.Neco.Cislo := 15;
    Cosi.Neco.DvacetZnaku := 'Jsi truhlík!';

    Pochopili jste způsob zápisu? Stejně jako u objektů ve vlastní proměnné oddělujete různé položky tečkou. Pokud jste to nepochopili, opět vám zde neporadím, ale můžete napsat! image

     
  68.   Tak jsem konečně probral většinu proměnných, takže ještě probereme 2 objekty. Konečně navštívíme položku Samples. A úplně vlevo máme
    GAUGE - Instalovali jste někdy nějaký program? Tak to určitě znáte takový ten rámeček s počtem procent a měnícím se proužkem barvy, která se pohybuje doprava. A to je právě GAUGE. Tak honem k položkám v Object Inspectoru:

        BackColor - To bude asi nějaká barva! Ano. Barva pozadí. Tedy té části, která se ještě neprovedla image

        BorderStyle - Opakování matka moudrosti. Zadáte-li bsSingle, bude okolo Gauge rámeček, pokud bsNone, nic okolo nebude.

        Font 
    - Zde nastavíte font, který se použije pro počet procent

        ForColor To bude asi taky nějaká barva! Ano. Barva části, která se už provedla image

        Kind - Zde si určíte typ zobrazení:
              -gkHorizontalBar-normální pruh zleva přibývající
              -gkNeedle-něco jako ukazatel rychlosti v autě (ručička zleva přes vršek doprava)
              -gkPie-něco jako ukazatel populace (ovál, v němž je vyplněn úsek ve stylu krájení dortu)
              -gkText-pouze pozadí a počet procent
              -gkVerticalBar-pruh nepřibývá zleva, ale odspodu


        MaxValue - Maximální hodnota (ne počet procent, ale počet jakýchsi bodů)

        MinValue - Minimální hodnota (ne počet procent, ale počet jakýchsi bodů)

        Progress - A zde je konečně počet bodů (ne procent), které budou splněny

        ShowText - Zadáte, zda se má zobrazovat počet procent

      Víc vám asi neřeknu. Jen že to hodně používám. Ale pojďme dál. Ke druhému objektu!
     
  69.  Blížíme se ke konci 7.dílu návodu. Asi šestý odleva by měl být obrázek kalendáře:
    CALENDAR - Ve Windows v nastavení data máme také takový kalendář. V Object Inspectoru máme:

        Day - číslo dne v měsíci, který bude zatrhnutý


        GridLineWidth - šířka čar tabulky, oddělující od sebe dny

        Month 
    - číslo měsíce, podle kterého budou v kalendáři seřazeny dny (po, út, st...)

        StartOfWeek - čím bude začínat týden (1=pondění, 2=úterý...6=sobota, ale neděle je 0!)

        UseCurrentDate - nastavíte-li True, Day, Month a Year se nastaví na datum, které právě je. A každý den se datum změní na to, které je v počítači nastavené!

        Year - nastavíte rok, podle kterého budou seřazeny dny

      Je sice pravda, že jsem to trochu ošidil, ale i kalendář se vám může hodit!
     
  70.  A je tu konec návodu. Takže by to chtělo skrnutí:
    Začněme jenom takovým zpestřením programu: Vložíme Gauge, pojmenujeme ho Ukazatel, šířku (Width) nastavíme dvakrát větší než výšku (Height), Progress na 0, MaxValue na 100, MinValue na 0 a Kind na gkNeedle. Vytvořte Boolean Doprava. Klikněte davkrát na okno a pište: 
    Doprava := True; 
    Teď vložíme Timer (se jménem Cas) a Interval nastavíme na 20. Klikněte na něj 2x a pište:
    if Doprava then
    begin
      if Ukazatel.Progress < 100 then
        Ukazatel.Progress := Ukazatel.Progress + 1 else
        Doprava := False;
    end else
    begin
      if Ukazatel.Progress > 0 then
        Ukazatel.Progress := Ukazatel.Progress - 1 else
        Doprava := True;
    end;

    A máme vytvořen zajímavý efekt. Stačí? Co? Že jsme si procvičili pouze jeden objekt? Tak jo, jedeme dál:
    Vytvořte CheckBox, pojmenujte ho Obsahuje a Checked nastavte na False. Dále si vytvořte Edit se jménem Napis, žádným Textem a s MaxLength 20! A můžeme pokročit k editaci vlastní proměnné: Nyní byste na začátku programu měli mít přibližně toto:
    type
      TForm1 = class(TForm)
        Ukazatel: TGauge;
        Cas: TTimer;
        Obsahuje: TCheckBox;
        Napis: TEdit;
        procedure FormCreate(Sender: TObject);
        procedure CasTimer(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        Doprava : Boolean;
      end;

    Pokud jste postupovali přesně podle návodu, mělo by to být takovéhle! Jak si můžu být jistý? Pod TForm1 = class(TForm) se totiž postupně připisují objekty, které vytvoříte. A pod objekty se píší stejným způsobem procedury (to už jistě víte image). A pod public byste měli psát své proměnné! Ale k věci: Mezi type a TForm1 = class(TForm) pište:
    TMujSoubor = record
      Obsahuje: Boolean;
      Napis: string[20];
    end;

    Typ proměnné už tedy nadefinován máme, teď už jen vytvořit samotnou proměnnou! Nebudu vám radit jak, jen zde vypíšu, jak má vypadat výše vypsaný začátek po úpravách:
    type
      TMujSoubor = record
        Obsahuje: Boolean;
        Napis: string[20];
      end;

      TForm1 = class(TForm)
        Ukazatel: TGauge;
        Cas: TTimer;
        Obsahuje: TCheckBox;
        Napis: TEdit;
        procedure FormCreate(Sender: TObject);
        procedure CasTimer(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        Doprava : Boolean;
        MujSoubor : TMujSoubor;
      end;

    Jistě jste poznali, že nová proměnná typu TMujSoubor se bude jmenovat MujSoubor. Teď se ale přemístíme zpět do grafické editace programu a vložíme další objekty: Tlačítko Otevrit (Caption bude Otevřít) a tlačítko Ulozit (Caption Uložit). Co teď? OpenDialog jménem Open a SaveDialog jménem Save. Nastavení budou mít oba dialogy stejné:
    DefaultExt bude kpf  a
    v tabulce Filter do Filter Name napište Kukensius Pages File a pod Filter *.kpf
    A to je z důležitého (a stejného) nastavení vše.
    Konečně můžeme psát program (to vás baví, že? image)!
    Klikněte 2x na okno a do procedury připište:
    MujSoubor.Obsahuje := False;
    MujSoubor.Napis := '';

    Klikněte dvakrát na CheckBox Obsahuje a napište:
    MujSoubor.Obsahuje := Obsahuje.Checked;
    Teď zase dvojitě klikněte na Edit Napis a pište:
    MujSoubor.Napis := Napis.Text;
    Tím bychom měli tu nudnější část odbytou a popojdeme k závěrečné: Klikněte (2x) na Ulozit a před begin připište: var Soubor: file of TMujSoubor; a za begin:
    if Save.Execute then
    begin
      AssignFile(Soubor, Save.FileName);
      ReWrite(Soubor);
      Write(Soubor, MujSoubor);
      CloseFile(Soubor);
    end;

    A u Otevrit podobně. Před begin napište to samé a za (pod) něj tohle:
    if Open.Execute then
    begin
      AssignFile(Soubor, Open.FileName);
      Reset(Soubor);
      Read(Soubor, MujSoubor);
      CloseFile(Soubor);
    end;

    A program je hotov! Teď si můžete napsat něco do Editu a zaškrtnou CheckBox a uložit. Až vypnete program a znovu ho spustíte, můžete si jakýkoli soubor typu TMujSoubor s koncovkou kpf otevřít a zjistit, co jste před uložením měli napsáno v Editu a zda byl CheckBox zaškrtnutý. Doufám, že pokud jste to předtím nechápali, tak teď jste to pochopili. A pokud vám nestačí takhle dlouhý konečný příklad, tak se můžete jít vys...pat image...
  71.   Nejprve mi dovolte, abych doplnil jeden nedostatek k věci, o které jsem se zmínil ve čtvrtém díle, a to o poznámkách. Sám jsem to nevěděl, ale Frenky mi řekl, že {poznámka} se dá nahradit (*poznámka*). Hodí se to, když neumíte (nebo třeba nemůžete) naťukat na klávesnici {} a nebo když { či } chcete použít v poznámkách. Tak, to by bylo (díky, Franky) a teď postupme dál:
      Se soubory a se zvuky už celkem pracovat umíte (aspoň doufám), takže pokročme k grafice. Obrázky už dávat umíte, obrazce (Shape) už také umíte vkládat, ale co taková grafika, které se mění? A bez hloupého blikání (zkuste si neustále měnit dva obrázky v Imageu! Budou blikat!). Důležité je ale mít kam kreslit. K tomu slouží Canvas, neboli plátno. A co se dělá normálně s plátnem? Kreslí se na něj, že? Zde je tomu také tak. Ale ne každý objekt plátno má! Zde napíšu pár hlavních objektů, které mají Canvas (a které znáte!image):

         IMAGE
         FORM
    A to je vše! Možná vás to překvapí, ale víc by bylo vlastně zbytečné! Buď kreslíte přímo na okno a nebo, pokud chcete kreslit na panel, vložíte Image, který vám pouze umožní vytvořit obrázek. Budu sice pro ukázku používat Canvas Formu, ale Image má úplně stejnou!
    POZOR: Důležité je, kdy Canvas editujete. Předem vám říká, že psát to do procedury OnCreate nemá cenu! Form má pro tyto příkazy položku v Events (resp. proceduru) OnPaint. Image má tu výhodu, že zde si Canvas pamatuje to, co má na sobě a to si zachová. Zato Canvas Formu (okna) se po každém překrytí jiným oknem smaže (v přikrytých místech). Proceduru OnPaint kdykoli vyvoláme příkazem Invalidate.
    Př.: Form1.Invalidate;
     
  72.   Začněme nejprve tím, co už jakž takž umíme obrazce:
    OBDÉLNÍK (ČTVEREC):
    Rectangle(XBodu1, YBodu1, XBodu2, YBodu2);
    V závorce zadáte souřadnice bodů, mezi kterými se obdélník nakreslí. Samozřejmě toto muíte napsat až za Canvas. Např.:
    Form1.Canvas.Rectangle(10, 20, 160, 100);
    Pokud tedy tohle napíšete do procedury OnPaint, objeví se obdélník stejně, jako byste vložili Shape (stRectangle), Left nastavili na 10, Top na 20, Height na 80 a Width na 150. Co dál už umíme?

    ELIPSA (KRUH)
    Ellipse(XBodu1, YBodu1, XBodu2, YBodu2);
    Stejně jako u obdélníku zde nastavíte rozměry bodů, mezi kterými se nakreslí elipsa. Př.:
    Form1.Canvas.Ellipse(10, 20, 160, 100);
    Opět je to stejné jako Shape(stEllipse) s výše uvedenými rozměry. Ale ještě něco umíme. Ale to už si teď ukážeme vylepšené:

    OBDÉLNÍK (ČTVEREC) se zaoblenými rohy:
    RoundRect(XBodu1, YBodu1, XBodu2, YBodu2, Xroh, Yroh);
    První čtyři Integery jsou opět souřadnice dvou bodů Xroh je délka, kde se má v šířce začít zaoblení (od pravého rohu) a Yroh je to samé, akorát ve výšce. Např.:
    Form1.Canvas.RoundRect(10, 20, 160, 100, 20, 15);
    Pokud tedy tohle napíšete do procedury OnPaint, objeví se obdélník stejně, jako byste vložili Shape (stRoundRect), Left nastavili na 10, Top na 20, Height na 80 a Width na 150. A dokonce zde (jak jste si mohli všimnout) můžete nastavit navíc rozměry zaoblení, což u Shapeu nejde!
    Díky nim vám můžu říct zajímavost. Pokud zadáte Xroh a Yroh jako nulu, bude RoundRect vypadat jako Rectangle a pokud bude platit, že XBodu2-XBodu1=Xroh a YBodu2-YBodu1=Yroh, bude RoundRect vypadat jako Ellipse. A to je z věcí, které jsme už jiným (jednodušším, ale s blikáním) způsobem uměli, vše.
     
  73.   Jdeme ale dál! Teď vám řeknu, jak můžete změnit styl kreslení (barvu, tloušťku pera atd.). JE to vlastně stejné jako u Shapeu. Např.: Barvu výplně změníte takto:
    Form1.Canvas.Brush.Color := clBlack;
    A barvu a tloušťku pera takto:
    Form1.Canvas.Pen.Color := clBlue;
    Form1.Canvas.Pen.Width := 5;

    Pokud jste to zapomněli, najdete to ve 3. části!
      Když už jsme u barev: Asi už vám dlouho vrtá, jak si určit jiné barvy, než ty pojmenované, že? Zde je řešení:
    Slouží k tomu příkaz RGB(Red, Green, Blue);
    Princip je velmi jednoduchý: Barvy na obrazovce vznikají tak, že jakoby tříbarevné lampičky mísí své světlo. Jedna má světlo červené, druhá zelené a třetí modré. U každé lampičky můžete nastavit sílu světla, které vydává a podle toho nám vznikne barva. Pokud zadáte u všeho sílu nula, vznikne černá (když není světlo, je tma a ta je černá, ne?image). Místo Red tedy doplníte číslo od 0 do 255, které bude říkat, jak má svítit červená lampička. Green (také 0 až 255) bude zelené a Blue nám označuje sílu záře modrého světla (a samozřejmě také Integer od 0 do 255). Napíšete tedy třeba Form1.Color := RGB(150,150,0); a okno bude mít tmavě žluté pozadí. Pokud chcete zjistit, jaké barvy mají jaké souřadnice, klikněte dvakrát na položku Color v Object Inspectoru, v okénku klikněte na definovat vlastní barvy, kliknete někam do barevné palety a vpravo dole máte napsány čísla síly barevných světel (RGB souřadnice barvy). 

     
  74.   Vraťme se zpět k plátnu... Jediný základní geometrický útvar, který lze na počítači zakreslit a který nám chybí je úsečka. S ní je ale problém. Má totiž pouze cílový bod. Na plátně někde počítač skončí a z té pozice kreslí dál, pokud mu nezadáme jinou souřadnici, kde má začít. Obdélník už ji obsahuje, ale LINE (úsečka - v překladu čára nebo přímka, ale přímku zde prostě nenakreslíte!) ne! A proto je zde příkaz MoveTo(X, Y);, který se samozřejmě používá v Canvas: Form1.Canvas.MoveTo(118, 253);
    Pokud jste byli netrpěliví a už jste zkusili nakreslit Line, zjistili jste, že to nefunguje. Příkaz totiž nezní Line(=čára), ale LineTo(=čára k...). Tedy LineTo(X,Y);. Chceme-li tedy nakreslit čáru třeba z bodu zleva 20 a shora 15 do místa se souřadnicemi X=100 Y=5, napíšeme:
    MoveTo(20,15);
    LineTo(100,5);

    A je to! Máme krásnou čáru. Jestli jí chcete udělat širší, stačí změnit Pen.Width na vyšší a je to! A je to! A je to! A ještě jednou... Aj, nechal jsem se unést! image
    Ještě vám chci říct, že se budou geometrické útvary překrývat, takže třeba u terče musíte začít největším kruhem, pak kreslit menší a ještě menší až k nejmenšímu!

     
  75.   To je ze základů grafiky asi tak vše, takže přistupme k  textům!
    Je to klasické ve Windows, ale vy to ani neumíte v Delphi. A to je chyba, kterou musím napravit.
    KOPÍROVÁNÍ!
    Copy(Napis, OdZnaku, PocetZanku);
    Napis je název proměnné typu string, OdZnaku je pořadové číslo znaku, který má být první kopírován a PocetZnaku je počet znaků, které se okopírují. Takže pokud zadáte:
    Napis1 := 'A je to!';
    Napis2 := Copy(Napis1, 4, 5);

    Bude Napis2 "e to!".
    A je to to samé jako:

    Napis2 := Copy('A je to!', 4, 5);
    OK? Snad ano! Jdeme totiž dál:
    DÉLKA NÁPISU
    To už mezi standartní funkce Windows nepočítám, ale prostě to lze. Stačí pouze:
    Length(Napis);
    Místo Napis doplníte jakýkoli string. Např.:
    Cislo := Length('Kukensius je trouba a mamlas!');
    A Cislo (Integer) bude 29.
     
  76.   Dále také lze zjistit, kde je v textu nějaké písmeno (nebo i sovo):
    Pos(Slovo, VNapisu);
    Místo Slovo doplníme string, o němž zjišťujeme, na jaké pozici se nachází ve stringu VNapisu. Př.:
    Napis := 'Ty jsi ale prase, kamaráde!';
    Cislo := Pos('prase', Napis);

    AInteger Cislo tentokrát vyjde 12.
    Pokud zjištujeme pozici písmena, lze to udělat opačně. Zjistit, jaké písmeno je v textu třeba dvanácté. Pro to slouží hranatá závorka za nápisem. Př.:
    Napis1 := 'Ty jsi ale čuně, kamaráde!';
    Napis2 := Napis1[12];

    String Napis2 tedy bude "č". Na dvanáctém místě ve stringu Napis1 je totiž "č"!

     
  77.   Možná se vám nebude líbit, že skáču od jednoho ke druhému, ale teď přestupujeme k objektům a já vám ukážu jeden, který je určený k tomu, aby se na něj kreslilo! Je stejný, jako image, akorát do něj můžeme jedině kreslit. Ale kresba nevydrží! Zde opět musíme používat proceduru OnPaint. Tento objekt naleznete v položce System, vedle Timeru.
    Je to
     PAINTBOXNemá žádné speciality a tak jsem se jejím popisem vyčerpal!image
     
     Již jsme probírali RGB barvy a tak vám musím říct o objektu z položky Dialogs:
    COLORDIALOG - Je šestý zleva a v Object Inspectoru naleznete hlavně:

        Color - barva, kterou si v dialogovém okně někdo vybral


    Používá se stejně, jako ostatní dialogy. Napíšte ColorDialog1.Execute; a máte ho otevřený!image 
     
  78.   Dále bych vám měl říct o objektu ze Samples:
    COLORGRID - Je druhý zleva a slouží k vybrání barev, kterými se bude kreslit. Stejný objekt je použit určitě v Image editoru. Vyberete si levým talčítkem barvu pera a pravým barvu pozadí. V Object Inspectoru u ColorGridu naleznete:

        BackgroundEnabled - Boolean. Nastavíte, zda lze měnit barva pozadí


        BackgroundIndex - Cislo barvy, která bude vybrána jako pozadí

        ForegroundEnabled - Boolean. Nastavíte, zda lze měnit barva pera

        ForegroundIndex - Cislo barvy, která bude vybrána jako barva pera

        GridOrdering - Rozměry tabulky s barvami.

    A jak zjistíme, která barva je vybraná? Buď podle čísla barvy a nebo podle:
    BackgroundColor a ForgroundColor. Takže např.:
    Form1.Color := ColorGrid1.BackgroundColor;
    Ještě chi upozornit na položku Ctl3D. Byla už u více objektů a já ji ignoroval, Teď mi došlo, že by se vám třeba hodila. Nastavíte pomocí ní, jestli se má objekt kreslit plasticky, nebo jen jako placka! U něčeho to totiž moc dobře nefungovalo!

     
  79. Ještě jednou se vrátíme do Dialogs, kde je pátý zleva:
    FONTDIALOG - Zde si uživatel vybere vlastní font. V Object Inspectoru naleznete jedinou specialitu, která vás asi nepřekvapí:

        Font - prostě font, který si uživatel zvolil, ne?


    Používá se také stejně, jako ostatní dialogy. Napíšte FontDialog1.Execute; a je to.
    Dále zase skočíme do výběru barev a řekneme si o objektu z Additional:

    COLORBOX - Jakoby takový Edit s šipečkou vpravo, kde si vyberete jinou barvu. Jedine na co si v Object Inspectoru musíte dát pozor je:

        Color - Není vybraná barva, ale barva POZADÍ ColorBoxu!!!!!


        Selected - To je to, co chceme! Barva, která je zvolená!

    A tím tato část návodu končí. Už jenom vámi snad toužený a mnou obávaný příklad:
     
  80.  A je tu konec návodu. Takže by to chtělo skrnutí:
    Tentokrát to bude trochu jiné. Umíme už vkládat poznámky do programu a tak vám ukážu obsah jediné procedury (OnPaint Okna), kde jsou  průběžné poznámky, jak se program zachová:
    procedure TOkno.FormPaint(Sender: TObject);
    begin

      //nejprve změním barvu pozadí
      Canvas.Brush.Color := RGB(250,230,190);
      //nakreslím levé ucho
      Canvas.Ellipse(20, 130, 100, 230);
      //teď pravé ucho
      Canvas.Ellipse(250, 130, 330, 230);
      {zbytky uší musím překrýt obrysem hlavy (sice plešaté, ale to vám zatím musí stačit)}
      Canvas.Ellipse(50, 50, 300, 320);
      {teď budu kreslit oči
      proto musím nejprve změnit barvu pozadí (bělma)}

      Canvas.Brush.Color := clWhite;
      {nyní nakreslím bělma očí (levé a pak pravé)}
      Canvas.Ellipse(90,130,145,165);
      Canvas.Ellipse(205,130,260,165);

      {uděláme třeba modrookého - to je jedno stačí změnit barvu!}
      Canvas.Brush.Color := clBlue;
      {a teď po změně barvy můřu začít kreslit duhovky (zas levou a pak pravou)}
      Canvas.Ellipse(104,134,131,161);
      Canvas.Ellipse(219,134,246,161);

      {pořád ale vypadá slepě! Co takhle mu udělit také panenky?
      nejprve změním barvu! Duhovky bývají černé}

      Canvas.Brush.Color := clBlack;
      {opět udělám nejdřív levou a pak pravou}
      Canvas.Ellipse(112,142,123,153);
      Canvas.Ellipse(227,142,238,153);

      {teď by se hodilo udělat třeba nos. Já si to ale zjednodušším a udělám z panáka klauna
      klaunský nos je rudý - ne od krve!}

      Canvas.Brush.Color := clRed;
      {tentokrát vás však zklamu. Nos je jenom jeden!}
      Canvas.Ellipse(145, 165, 205, 225);
      {a teď postupme dál: uděláme pusu. Když už je to klaun, nakreslíme mu okolo takovéto bílé kolečko}
      Canvas.Brush.Color := clWhite;
      {líčení by ale černý obrys mít nemělo! Stříbrný bude lepší!}
      Canvas.Pen.Color := clSilver;
      //a teď už můžeme líčit:
      Canvas.Ellipse(100, 230, 250, 300);
      {sice je nalíčený, ale nemá pusu.
      Budeme experimentovat a uděláme jí pomocí tlusté, červené čáry}

      Canvas.Pen.Width := 11;
      Canvas.Pen.Color := clRed;

      {A teď uděláme čáru z 120,265 do 230,265}
      Canvas.MoveTo(120, 265);
      Canvas.LineTo(230, 265);

      {ještě jsem vám neukázal příklad čtverce.
      vlasy by byly příliš složité a tak dáme klaunovi klobouk!
      Skoro černý (spíš k modré)!}

      Canvas.Brush.Color := RGB(10, 10, 60);
      {před nakreslením klobouku dáme nastavení pera do pořádku}
      Canvas.Pen.Width := 1;
      Canvas.Pen.Color := clBlack;

      {Teď můžeme nakresli hlavní část klobouku}
      Canvas.RoundRect(70, 10, 280, 115, 25, 25);
      {a z klauna je nádražák! My jsme ale řekli klobouk!
      Musím udělat ještě ten obrouček}

      Canvas.Rectangle(50, 105, 300, 115);
      {Klaun je hotov!}
    end;
    A program je hotov také! Klauna máte nakresleného a příště se můžete těšit na pokračování práce s grafikou...
  81. Vítejte u další části návodu. Budeme pokračovat v kreslení. Začněme ulehčením, které jistě při kreslení využijete:WITH!
    with Canvas do
    begin
    end;

    Způsobí to, že můžete psát položky plátna jako např. Canvas.Pen ale jako pouhé Pen. Stejně jako u okna. Nepíšete Form1.Width, ale stačí Width. Stejně tak můžete využít with. Ještě jeden příklad:
    with PaintBox1.Canvas do
    begin
      Rectangle(0, 0, 150, 200);
      Pen.Color := Panel1.Color;
      Ellipse(1,1,149,199);
    end;

    Ale pozor! Ve starších verzích Delphi by mohl příkaz Pen.Color := Panel1.Color; dělat problémy. Je lepší napsat úplnou cestu, aby program nehledal Panel1 v Canvasu PaintBoxu1!  
      Na úvod si ještě řekněme, jak můžeme napsat text bez pomoci Labelu. Samozřejmě pouze na Canvas. Použijeme příkaz:
    TextOut(X, Y, Napis);
    kde X bude umístění zleva a Y odshora. Napis bude jakýkoli string, který chceme vypsat. Př.:
    Canvas.TextOut(100, 150, '<- Zde je přibližně pozice 100x150!');
    A bude! OK, postupme dál!

     
  82.   Chci vás naučit kreslit na Canvas bitmapy (soubory s koncovkou BMP) a k tomu potřebujete znát nový typ proměnné:
    TBitmap
    Co umí?: Skoro nic, ale je potřeba. Umí hlavně vytvořit v paměti místo na obrázek a to místo nějakým obrázkem z disku zaplnit. K vytvoření místa slouží tento příkaz:
    Obrazek := TBitmap.Create;
    Obrazek je proměnná typu TBitmap. A teď potřebujeme do místa pro bitmapu nazvaného Obrazek nějakou tu BMP načíst! Jak? Klasicky:
    Obrazek.LoadFromFile(Adresa);
    A za Adresa dosadíte adresu nějakého souboru s koncovkou BMP. Př.:
    Obrazek := TBotmap.Create;
    Obrazek.LoadFromFile('C:\Obrázky\KukíkPoNičení.bmp');

    A je to! Poté, co TBitmap použijete a víte, že už ji používat nebudete, měli byste uvolnit místo v operační paměti tím, že TBitmap proměnnou zrušíte:
    Obrazek.Destroy;
    Nakonec ještě dvě zajímavosti. TBitmap má Canvas (stejnou jako Picture - nelze ji překreslit tak, že by se smazal její obsah), takže si na ní můžete klidně kreslit!
    A za druhé: Můžete si zvolit průhlednou barvu (stejně jako u okna).
    Položkou Transparent nastavíte, zda TBitmap bude, či nebude moct mít průhlednou část a položkou TransparentColor nastavíte, která barva bude průhledná. Př.:
    Obrazek.Transparent := True;
    Obrazek.TransparentColor := clWhite;

    A to je k proměnné TBitmap asi vše! Nebo ne? 


    POZOR! ZAJÍMAVOST!
      Chcete si vytvořit soubor BMP? Jde to! Nastavíte velikost Obrazku (typu TBitmap) a kreslíte si na něj. Jak určit velikost? Pomocí položek Width a Height. A jak potom uložit do souboru? Pomocí příkazu SaveToFile(Adresa); Př.:
    Obrazek.Width := 100;
    Obrazek.Height := 150;
    Obrazek.SaveToFile('C:\Obrázky\HokusPokus.bmp');

    A obsah Obrazku se vám uloží na disk C, do složky Obrázky pod jménem HokusPokus.bmp!
     
  83.   K načítání obrázků se může hodit okno k otevírání obrázků. To naleznete v části horního menu nazvané Dialogs. Třetí zleva.:
    OPENPICTUREDIALOG - Zklamu vás, ale vše je stejné, jako u OpenDialogu. Jediný rozdíl je ten, že u dialogu obrázků máte nastavené Filtry pro obrázky, které Delphi zvládá. Ty si samozřejmě ale můžete upravit. A pro ukládání slouží dialogové okno napravo od OpenPictureDialogu nazvané:
    SAVEPICTUREDIALOG - Stejně jako u OpenPictureDialogu je i zde změna pouze v náhledu na obrázek a Filtrů pro obrázky. Když už jsme u objektů, povězme si o jednom, který vám určitě vylepší program (můžete si třeba ozvučit různé akce). Zajeďte do Additional a tam 14. zleva (4.zpravaimage) naleznete:
    APPLICATIONEVENT - Prostě skvělá věcička! Co když se maximalizuje okno? To byste chtěli třeba změnit rozměry nějakých objektů, ne? Ano, jde použít procedura OnResize, kterou má samotné okno, ale to je jen jedna z výhod, které vám dovoluje ApplicationEvent. No, posuďte sami, při jakých akcích s oknem můžete naprogramovat, co se má stát:
    OnActivate - POZOR! Není to to samé, co má okno tohle se spustí VŽDY, když se okno zaktivuje (má modrý vršek-je aktivní), zatímco u okna pouze poprvé!
    OnDeactivate - Když ze okno deaktivuje (má šedý vršek-je neaktivní)
    OnException - Při výjimce (Co se například stane, když dělíte nulou)
    OnHelp - Při požádání o Help (tj. pomoc... s tím moc neumím imageimage)
    OnHint - Jakmile ukážete myší na objekt, který má nadefinovanou položku Hint
    OnIdle - Když je program nečinný (zrovna nic nevypisuje, nebo nepočítá)
    OnMessage - Při vypsání nějaké zprávy (výstražné, informační atd.)
    OnMinimize - Jakmile se minimalizuje okno
    OnRestore - Když se okno vrátí z minimalizace
    OnShowHint - Jakmile se zobrazí pomocný text (Hint)
    P.S.k OnShowHint - uvnitř procedury můžete využít místní proměnnou HintStr, která obsahuje text, který se zobrazuje.

     
  84.   Vraťme se zpět k plátnu... Minule jsme probírali čáru. Ale jak udělat bod nebo křivku? Také z čáry! Vše se musí rozpočítat na spousty malých čáreček (třeba jednopixelových (pixel je jeden bod na obrazovce, ale to už snad víteimage)). Abyste viděli, že to tak opravdu funguje, uvedu příklad křivek (a bude záležet jenom na vás, jak budou křivky křivé), kde není potřeba nic počítat:
      Takže nejprve pojmenujte okno! Bude to tak lepší! Třeba Okno! Teď najděte proceduru OnMouseDown, do níž pište:
    Canvas.LineTo(X, Y);
    if ssRight in Shift then
      Invalidate;

    Zde vidíte krásný příklad využití proměnných procedury OnMouseDown! Nejprve se nakreslí čára na místo, kde stisknete tlačítko myši a pokud stisknete pravé, vše se následně překreslí (a protože není nic v proceduře OnPaint, vše se smaže). Teď vám program dělá čáry mezi bodem, kde jste klikli naposledy a kam jste kliknuli nyní! Tím vám ale kreslení křivek nepředvedu. Názornější bude použít navíc proceduru OnMouseMove, kde napíšete:
    if ssLeft in Shift then
      Canvas.LineTo(X, Y);

    A teď můžete trénovat kreslení obrázků jednou čarou. A co když chcete zvedat pero? V proceduře OnMouseDown změňte LineTo na MoveTo a to je celá změna! Ale co když chcete udělat jen tečku? OK, napište do procedury OnMouseDown ještě:
    Canvas.MoveTo(X, Y+1);
    Ale mezi první dva řádky! NE NA KONEC! A pokud nenapíšete + nebo -1 za X nebo Y, nic se nenakreslí!
    A ještě: Pokud se vám nelíbí tenoučká čára, kterou píšete, do procedury OnCreate vložte:
    Canvas.Pen.Width := 5;
    A nebo ještě lépe: Vložte ScrollBox a pojmenujte ho Sire. Najděte v něm proceduru OnChange a pište:

    Canvas.Pen.Width := Sire.Position;
    Nyní si už můžete nastavovat šířku podle rozsahu ScrollBoxu!
     
  85.   A konečně můžeme kreslit bitmapy na plátno. Je na to příkaz:
    DRAW
    Napíšete Canvas.Draw(Zleva, shora, bitmapa);
    Zleva bude rozměr X, kam se nakreslí obrázek (jakýkoli Integer), shora je rozměr Y (také Integer) a bitmapa je obrázek, který se bude kreslit (TBitmap).
    Můžete však také zakreslovat nejdřív na nějakou TBitmap a jí potom vložit na plátno. A jako vždy vám teď ukážu příklad:
      Nejprve vytvoříme proměnné:
    Obr : TBitmap;
    Ykz, Ypz : Integer;

    Přejmenujeme Form1 na Okno, barvu pozadí (Color) na clWhite a následně pouze vyplníme procedury. Nejprve OnCreate:
    Obr := TBitmap.Create;
    Obr.Width := Okno.Width;
    Obr.Height := Okno.Height;

    Vytvořili jsme tedy Obr typu Tbitmap, který má rozměry Okna. Nyní proceduru OnMouseDown:
    Ykz := X;
    Ypz := Y;

    Tím určíme rozměry pro začátek kreslení. A nyní OnMouseMove:
    if ssLeft in Shift then
    begin
      Canvas.Draw(0,0,Obr);
      Canvas.Ellipse(Ykz,Ypz,X,Y);
    end;

    Neboli pokud je při pohybu stisknuté levé tlačítko myši, nakresli nejprve pozadí (TBitmap Obr, která obsahuje předchozí pozadí) a poté přes pozadí nakresli od Ykz,Ypz po pozici myši elipsu. A teď závěrečnou (důležitou) proceduru OnMouseUp:
    Obr.Canvas.Ellipse(Ykz, Ypz, X, Y);
    Jakmile pustíte myš, nakreslí se elipsa do TBitmap (prostě pomyslný obrázek) a tím se vlastně uloží to operační paměti. A vy můžete kreslit další přes tuhle. Tím máme základ a zbývá jen dodělat dvě drobnůstky. Co když změníme rozměr okna? Vyplníme proto proceduru OnResize:
    if Obr.Width < Okno.Width then
      Obr.Width := Okno.Width;
    if Obr.Height < Okno.Height then
      Obr.Height := Okno.Height;

    Pokud okno zvětšujeme přes rozměry TBitmap Obr, změní se i její rozměry. Pokud, ne, tak se nezmění (a to chceme! - kdybyste okno zvětšili, kreslili na něj, zmenšili a následně zase zvětšili, ořízly by se okraje původního obrázku!). A ještě musíme počítat s tím, že se okno někdy překresluje. A k tomu máme proceduru OnPaint, do které dáme akorát:
    Canvas.Draw(0,0,Obr);
    A máme program, kde se kreslí bílé elipsy na bílé pozadí! Doufám, že vám takový příklad stačí!
     
  86.   Uznávám, že tento návod je celkem nacpaný příklady, ale je to nejlepší způsob, jak něco vysvětlit! K dalším pracím potřebujete ale znát další typ proměnné a to:
    TRect
    Klasicky se zeptám co umí? A opět standartně odpovím nic, ale hodí se. K čemu? Rect je zkratka pro Rectangle a pokud se učíte angličtinu, nebo máte dobrou paměť, tak Rectangle je anglicky obdélník. A co je tohle za obdélník? Opět pomyslný (neviditelný). Udává nám pouze rozměry jakéhosi trojúhelníku na ploše. Proměnné typu TRect mají tyto podproměnné (Integery):
      Left - souřadnice X (počet pixelů zleva) počátečního bodu
      Right - souřadnice X cílového bodu
      Top - souřadnice Y (počet pixelů odshora) počátečního bodu
      Bottom - souřadnice Y cílového bodu
    A nebo můžete použít zbylé dvě proměnné typu TPoint
      TopLeft - souřadnice počátečního bodu
      BottomRight - souřadnice cílového bodu
    Vy aleneznáte typ proměnné:

    TPoint
    Ten už je vůbec jadnoduchý. Má pouze dvě souřadnice nějakého místa:
      X - zleva (Integer)
      Y - shora (Integer)
    A to je protentokrát z typů proměnných vše! Teď vám řeknu další příkaz Canvasu, který se hodí. A to:

    PIXELS
    Určí vám barvu, která je na Canvasu v určitém místě. Užití:
    Pixels[Zleva, Shora];
    Místo Zleva zadáte rozměr X a místo Shora rozměr Y. Př.:
    Panel1.Color := Canvas.Pixels[150, 486];
    Ale teď se vraťme k TRect! Proč jsem vám o něm vůbec říkal, že?
     
  87.   Z jednoho důležitého důvodu! V Canvasu je totiž potřeba neustále! Tvůrci Delphi si tím snížili počet údajů v závorkách (no uznejte! Např RoundRect má 6 údajů. To je o nervy!image) a tak pro někoho programování prodloužili, ale pro nějaké případy zase zkrátili! Mno, prostě vám teď můžu říct dalěí příkazy, kde je použit TRect:
    Ellipse
      
    Ano, možná se divíte, ale Ellipse má 2 alternativy. Jednu se čtyřmi rozměry v závorce a druhou s TRectem v závorce. Př.: Canvas.Ellipse(Ctverec);
    Rectangle
      
    Ano, stejně tak i Rextangle má 2 alternativy. Př.druhé: Canvas.Rectangle(Ctverec);
    Příkazů s TRect je spoustu a tak vám tentokrát napíšu tři. A ten poslední je nový:

    CopyRect
      
    Zkopíruje obdélníkovou část z nějakého Canvasu a vloží do toho, ve kterém příkaz vyvoláme. Vzor psaní:
    CilovaCanvas.CopyRect(CilovyTRect, ZdrojovaCanvas, ZdrojovyTRect);
    CilovyTRect bude TRect, podle kterého se určí místo, kam se do CilovaCanvas nakreslí to, co se v místech, která určuje ZdrojovyTRect(také typu TRect), ze ZdrojovaCanvas vyřízne. Př.:
    Bitmapa.Canvas.CopyRect(Ctverec1, Canvas, Ctverec2);
    A pokud chcete využít TPoint, můžete místo MoveTo(X,Y); používat PenPos(Misto);, kde Misto bude TPoint!

     
  88. A teď si dovolím něco, co jsem ještě nikdy v těchto návodech neudělal a to že s vámi vyrobím kvalitní program. Ale nedoděláme ho dnes, ale až jindy. Dneska na to totiž máme pouhé 3 body a to bude zatím stačit... Důležité pro vás asi bude, jaké jsou objekty a jaké procedury. Pro jistotu si můžete zdrojový kód programu stáhnout (3,75kB). Když už jsme u přenášení zdrojových kódů Delphi, měl bych vám říct, jaké soubory musíte zkopírovat: Dva se jménem Projektu a dva se jménem každého okna. Ty se jménem projektu musí mít příponu DPR a RES. A soubory oken musí mít PAS a DFM. Co které obsahují? DPR obsahuje postup otevírání oken apod. V RES jsou uložené např. ikony. PAS obsahuje ten text, co vidíte v okně na psaní programu a DFM informace o objektech (obsah Object Inspectoru). A teď pokročme. Nejprve vám řeknu nadřazenost objektů (vždy napíšu nejprve název typu objektu a do závorky jeho jméno):
      Do okna (pojmenujte ho Okno!) vložte kamkoli:
    OpenPicturDialog(Open), SavePictureDialog(Save), ColorDialog(VyberBarvu), PaintBox(Plocha) a dva Panely(VyberBarvyAStylu a VyberNastroje). Začněme vkládáním věcí do panelu VyberBarvyAStylu (opět vložte kamkoli-později pozice nastavíte!):
    Panel(BgBarva), 2xCheckBox(Obrys a Vypln), TrackBar(Sirka) a 3xLabel(Pozice, SirVys, Velikost). Do panelu BgBarva ještě vložte Panel, pojmenujte FwBarva a můžeme postoupit k vkládání objektů do panelu VyberNastroje:
    2x Button(Otevrit, Ulozit) a 5xRadioButton(Cary, Elipsy, Linie, Obdelniky, Rozmer). A teď se připravte na šílenou tabulku:
  89. Name Caption Left Top Align Width Height Checked Color BevelOuter
    Okno Kreslení ??? ??? alNone ??? ??? ----- clGray -----
    Plocha ----- 66 10 alNone 320 240 ----- clWhite -----
    VyberBarvu ----- ----- ----- ----- ----- ----- ----- clBlack -----
    VyberBarvyAStylu   0 267 alBottom !!! 50 ----- clBtnFace bvRaised
    BgBarva   8 5 alNone 40 40 ----- clBlack bvLowered
    FwBarva   8 8 alNone 24 24 ----- clWhite bvNone
    Obrys Obrys 136 8 ----- 49 17 True clBtnFace -----
    Pozice X, Y 255 24 alNone 20 13 ----- clBtnFace -----
    Sirka ----- 64 8 alNone 73 33 ----- ----- -----
    SirVys š., v. 255 8 alNone 23 13 ----- clBtnFace -----
    Velikost 320x240 327 16 alNone 47 13 ----- clBtnFace -----
    Vypln Výplň 136 24 ----- 49 17 True clBtnFace -----
    VyberNastroje   0 0 alLeft 56 !!! ----- clBtnFace bvRaised
    Cary Tužka 3 51 ----- 49 17 False clBtnFace -----
    Elipsy Elipsy 3 3 ----- 49 17 False clBtnFace -----
    Linie Linky 3 35 ----- 49 17 False clBtnFace -----
    Obdelniky Obdél. 3 19 ----- 49 17 False clBtnFace -----
    Otevrit Otevřít 4 96 ----- 48 20 ----- ----- -----
    Rozmer X, Y 6 165 ----- 46 17 True clBtnFace -----
    Ulozit Uložit 4 120 ----- 48 20 ----- ----- -----
    Vysvětlivky:
      ----- = neobsahuje tuto položku
      ??? = zadejte si, co chcete
      !!! = vypočítá se samo ze zadaných hodnot

    To bohužel není vše. Ještě nastavte u fontu Rozmeru tučné písmo (Bold), u FwBarva a BgBarva nastavte ShowHint na True a Hint na Obrys(BgBarva) a Výplň(FwBarva).
    Ještě jsem vám neříkal o položce (proměnné) okna, která je:
      
    ActiveControl
    Zvolíte objekt, který bude po spuštění aktivní (bude mít okolo sebe rámeček, jako kdyby to bylo poslední, na co jste kliknuli!).
      A my si jako ActiveControl zvolíme Rozmer! A teď k samotnému textu programu (co co dělá budete muset vyčíst z poznámek v {}:

     

  90.   public
        { Public declarations }
        Obraz : TBitmap;
        Iks, Yps : Integer;
      end;

    var
      Okno: TOkno;

    implementation


    {$R *.dfm}

    procedure TOkno.PlochaMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    begin

     {Zazanamenání pozice kurzoru:}
      Pozice.Caption := IntToStr(X) + ', ' + IntToStr(Y);
     {Šířka obrázku:}
      if ssLeft in Shift then
        SirVys.Caption := IntToStr(X - Iks) + ', ' + IntToStr(Y - Yps); 

     {Kreslení elipsy:}
      if (Elipsy.Checked) and (ssLeft in Shift) then
      begin
        Plocha.Canvas.Draw(0,0,Obraz);
        Plocha.Canvas.Ellipse(Iks, Yps, X, Y);
      end;

     {Kreslení obdélníku:}
      if (Obdelniky.Checked) and (ssLeft in Shift) then
      begin
        Plocha.Canvas.Draw(0,0,Obraz);
        Plocha.Canvas.Rectangle(Iks, Yps, X, Y);
      end;

     {Kreslení linie:}
      if (Linie.Checked) and (ssLeft in Shift) then
      begin
        Plocha.Canvas.Draw(0,0,Obraz);
        Plocha.Canvas.MoveTo(Iks, Yps);
        Plocha.Canvas.LineTo(X, Y);
      end;

     {Kreslení čar:}
      if (Cary.Checked) and (ssLeft in Shift) then
        Plocha.Canvas.LineTo(X, Y);
    end;

    procedure TOkno.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    begin

     {Zazanamenání pozice kurzoru:}
      Pozice.Caption := '(' + IntToStr(X - 66) + ', ' + IntToStr(Y - 10) + ')';
    end;

    procedure TOkno.FormCreate(Sender: TObject);
    begin

     {Nastavení TBitmap Obraz:}
      Obraz := TBitmap.Create;
      Obraz.Width := 320;
      Obraz.Height := 240;
    end;

    procedure TOkno.PlochaPaint(Sender: TObject);
    begin

     {Nakreslení při překreslení :-)}
      Plocha.Canvas.Draw(0,0,Obraz);
    end;

    procedure TOkno.PlochaMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    begin

     {Zapamatování souřadnic:}
      Iks := X;
      Yps := Y;
      Plocha.Canvas.MoveTo(X,Y);

     {Šířka a výška je 0:}
      SirVys.Caption := '0, 0';
     {Změna rozměru papíru:}
      if (Rozmer.Checked) and (ssDouble in Shift) and (X*Y > 0) then
      begin
        Plocha.Width := X;
        Plocha.Height := Y;
        Obraz.Width := X;
        Obraz.Height := Y;
        Velikost.Caption := IntToStr(X) + ' x ' + IntToStr(Y);
      end;
    end;

    procedure TOkno.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    begin

     {Změna rozměru papíru:}
      if (Rozmer.Checked) and (ssDouble in Shift) and (X > 66) and (Y > 10) then
      begin
        Plocha.Width := X-66;
        Plocha.Height := Y-10;
        Obraz.Width := X-66;
        Obraz.Height := Y-10;
        Velikost.Caption := IntToStr(X-66) + ' x ' + IntToStr(Y-10);
      end;
    end;

    procedure TOkno.OtevritClick(Sender: TObject);
    begin

     {Otevření obrázku}
      if Open.Execute then
        Obraz.LoadFromFile(Open.FileName);
      Plocha.Width := Obraz.Width;
      Plocha.Height := Obraz.Height;
      Plocha.Canvas.Draw(0,0,Obraz);
      Velikost.Caption := IntToStr(Obraz.Width) + ' x ' + IntToStr(Obraz.Height);
    end;

    procedure TOkno.PlochaMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    var
      Celek : TRect;
    begin

     {Zrušení šířky a výšky:}
      SirVys.Caption := 'š., v.';
     {Nakreslení ťupky:}
      if (X = Iks) and (Y = Yps) and (Rozmer.Checked = False) and (Obrys.Checked = False) then
        Plocha.Canvas.LineTo(X + 1,Y);

     {Nakreslení elipsy:}
      if Elipsy.Checked then
        Obraz.Canvas.Ellipse(Iks, Yps, X, Y);

     {Nakreslení obdélníku:}
      if Obdelniky.Checked then
        Obraz.Canvas.Rectangle(Iks, Yps, X, Y);

     {Nakreslení linie:}
      if Linie.Checked then
      begin
        Obraz.Canvas.MoveTo(Iks, Yps);
        Obraz.Canvas.LineTo(X, Y);
      end;

     {Nakreslení čar:}
      Celek.Left := 0;
      Celek.Top := 0;
      Celek.Right := Plocha.Width;
      Celek.Bottom := Plocha.Height;
      if Cary.Checked then
        Obraz.Canvas.CopyRect(Celek, Plocha.Canvas, Celek);
    end;

    procedure TOkno.UlozitClick(Sender: TObject);
    begin

     {Uložení obrázku}
      if Save.Execute then
        Obraz.SaveToFile(Save.FileName);
    end;

    procedure TOkno.FwBarvaDblClick(Sender: TObject);
    begin

     {Výběr barvy výplně:}
      if VyberBarvu.Execute then
      begin
        FwBarva.Color := VyberBarvu.Color;
        Plocha.Canvas.Brush.Color := FwBarva.Color;
        Obraz.Canvas.Brush.Color := FwBarva.Color;
      end;
    end;

    procedure TOkno.BgBarvaDblClick(Sender: TObject);
    begin

     {Výběr barvy obrysu:}
      if VyberBarvu.Execute then
      begin
        BgBarva.Color := VyberBarvu.Color;
        Plocha.Canvas.Pen.Color := BgBarva.Color;
        Obraz.Canvas.Pen.Color := BgBarva.Color;
      end;
    end;

    procedure TOkno.SirkaChange(Sender: TObject);
    begin

     {Nastavení šířky pera:}
      Plocha.Canvas.Pen.Width := Sirka.Position;
      Obraz.Canvas.Pen.Width := Sirka.Position;
    end;

    procedure TOkno.ObrysClick(Sender: TObject);
    begin

     {Nastavení viditelnosti obrysu:}
      if Obrys.Checked then
      begin
        Plocha.Canvas.Pen.Style := psSolid;
        Obraz.Canvas.Pen.Style := psSolid;
      end else
      begin
        Plocha.Canvas.Pen.Style := psClear;
        Obraz.Canvas.Pen.Style := psClear;
      end;
    end;

    procedure TOkno.VyplnClick(Sender: TObject);
    begin

     {Nastavení viditelnosti výplně:}
      if Vypln.Checked then
      begin
        Plocha.Canvas.Brush.Style := bsSolid;
        Obraz.Canvas.Brush.Style := bsSolid;
      end else
      begin
        Plocha.Canvas.Brush.Style := bsClear;
        Obraz.Canvas.Brush.Style := bsClear;
      end;
    end;

    end.


      A můžete kreslit elipsy, obdélníky, úsečky a čáry. Také můžete měnit barvu výplně a obrysu, šířku a viditelnost obrysu, průhlednost výplně a velikost kreslicí plochy. Příště ten program ještě zdokonalíme...
  91. A je to tu! Desátá část návodu. To znamená, že by měl být nějaký zajímavý... A taky bude! Chcete si vyrobit vlastního XXProfesora? Čtěte dál a dočkáte se! image Začnu ale doplněním ještě jednoho objektu. Přesněji ze Smaples. A je to:
    SPINEDIT
      Je to Edit, ve kterém se speciálně vyplňují pouze čísla. Navíc obsahuje také 2 šipečky, které číslo zvyšují nebo snižují o 1. A co důležitého nám nabízí Properties v Object Inspectoru?:
      
        MaxValue - 
    nejvyšší hodnota Integeru zapsaná do SpinEditu

        MinValue - nejnižší hodnota Integeru zapsaná do SpinEditu

        Value číslo napsané ve SpinEditu
     
      
      Pozor ale na to, kdybyste chtěli reagovat na změnu obsahu pomocí procedury OnChange. Když totiž smaže uživatel obsah a chce napsat své číslo, program nahlásí chybu, že (NIC) není Integer. A to teda opravdu není! image Ještě mi dovolte doplnit 3.díl 6.část. Mluvil jsem o
    MASKEDITu
      Psal jsem, že se liší od Editu akorát položkou PasswordChar, ale to není pravda. Edit má tuto položku také. V čem se teda liší?:
      
        EditMask - 
    klikněte na položku dvakrát a zvolte číselný tvar, jaký má mít vyplnění text
     -Character for Blanks - zde si nastavíte znak, který se zobrazí, když uživatel smaže nutné číslo
     -Svae Literal Characters - zda se mají v Textu zobrazovat také tečky, čárky a ostatní věci, které uživatel nezapíše

    To by bylo a teď pojďme k XXProfesorovi: 

     
  92.   Hlavní, co k tomu budete potřebovat, je umět kreslit na PC a programovat v Delphi. A program neobsahuje nic složitého, co byste neuměli! Takže jak na programování? Začněte nastavením okna:
    Name - Laborator, BorderStyle - bsSingle, Caption - (Jak chcete aby se to jmenovalo!), Height - 480, Width - 640 a Position - poScreenCenter.
      Vložte panel a u něj nastavte:
    Name - HlPanel, Align - alClient, BevelInner i BevelOuter - bvLowered a BevelWidth - 2.
      A teď už můřeme u Laboratore nastavit ActiveControl. Jakou? HlPanel!
    Nyní budeme vkládat zbylé objekty (všechny do HlPanelu):
      1hlavní obrázek (Image- Name=Walls), 4x SpeedButton (ET1, ET2, ET3 a ET4 - to jsou jejich jména (Name)), 6x Image (pojmenujte, jak chcete), 2x Label (Vysledky, Nastroje), 24x Image (to jsou ty nejhlavnější - Pojmenujete je vždy ET1A, ET1B, ET1C, ET1D, ET1E a ET1F. Další zase ET2A, ET2B ... ET2F a tak až k ET4F a u všech nastavte Visible na False.) a ještě 6x RadioButton (Sekera, Mec, Elektro, Voda, Ohen a Skripec). Tím máme vložené objekty, které jsou nutné pro chod a pěkný vzhled programu (jediné, co chybí je vlastně jen 1 Label obsahující datum výroby!).
        A teď tu nejdůležitější část! Vyrobte si obrázky čtyř tvorů na výzkum (bmp přibližně 95x105 pixelů). To je ještě ta jednodušší část. Měli byste je sladit s obrázkem na pozadí! A potom vyrobit ke každému výsledek poté, co na ně použijete mučicí nástroje a vložte do Image (podle toho, jakého tvora a jaký nástroj použijete. Nástroje: Sekera=A, Meč=B, Elektrický proud=C, Voda=D, Oheň=E a Skřipec je F. A čísla tvorů zvolte podle toho, do jakého obrázku jste umístili tvora v kleci - jestli do ET1, ET2, ET3 nebo ET4).
      RadioButtonům nastavte položku Checked na False (kromě Sekera), a Caption na: Sekera=Sekera, Mec=Meč, Elektro=E.Proud, Voda=Voda, Ohen=Oheň a Skripec=Skřipec. A teď už jen napsat velice jednoduchý program a umístit věci na správné místo (např. těch 6 Image volného jména, do kterých pro lepší vzhled umístěte ilustrace k mučícím nástrojům a umístěte je poblíž RadioButtonů)...
     
  93.   Nebudeme to protahovat a skočíme do toho rovnou po hlavě image. Začněme přiřazením obrázků mučicích nástrojů k RadioButtonům. Po kliknutí na nějaký z obrázků nastavte např.:
    Mec.Checked := True;
    Ostatní RadioButtony automaticky nebudou zaškrtnuté. Takže po kliknutí na obrázek meče se zaškrtne RadioButton s nápisem Meč. To samé udělejte i u ostatních obrázků!
      A teď vám zde napíšu hlavní zdrojový kód, který použijete pro každý SpeedButton pro OnClick:
    ET§A.Visible := False;
    ET§B.Visible := False;
    ET§C.Visible := False;
    ET§D.Visible := False;
    ET§E.Visible := False;
    ET§F.Visible := False;
    if Sekera.Checked then
      ET§A.Visible := True else
    if Mec.Checked then
      ET§B.Visible := True else
    if Elektro.Checked then
      ET§C.Visible := True else
    if Voda.Checked then
      ET§D.Visible := True else
    if Ohen.Checked then
      ET§E.Visible := True else
    if Skripec.Checked then
      ET§F.Visible := True;

    § vždy nahraďte číslem za ET v názvu SpeedButtonu (takže u ET1 bude místo § jednička (1)). Potom už jenom zkontrolovat, zda se výsledky pokusů zobrazují pod správným tvorem a pod Labelem Vysledky (má Caption "Výsledky jednotlivých pokusů:") a zda jsou u sebe spráné obrázky nástrojů u správných RadioButtonů a ty všechny pod Labelem Nastroje (Caption= Nástroje:) (ta dvojtečka tam patří- není to smajlík! Ty jsou grafické image). No a XXProfesor je hotov. Můžete si ho i stáhnout (8kB zaZIPované ... ale obrázky si musíte nakreslit sami!). A vaše výrobky mi, prosím posílejte na mail (umístím je na KP!!!!!).
     
  94.   Koukněte na to! Jsme teprve u čtvrtého bodu a už jsem vám řekl taj jednoho svého programu. Tak jdeme dál! A máme tu hned jednu zajímavou věcičku (abyste si uvědomili, že i celkem zábavná věc může být lehko naprogramovatelná- stačí jen nápad). A to:
    LOSOVÁNÍimage
     To je hra, která (jak jste se mohli dočíst v TVORBĚ sklidila největší úspěch, když jsem chodil na ZŠ. A teď se s vámi podělím o 1. verzi (stejně jako u XXProfesora - vždyť i ZOOProfesor byl tvořen z 1. verze):
      Nejprve vložte panel (tentokrát zhezčuje vzhled okna), pojmenujete ho opět HlPanel (ano, hodně používám panely - je to lepší než program ze sto šedesáti sedmi okny ne? image), Align nastavte na alClient, BevelInner na bvLowered a Color na clGray. Rozměry okna nastavte na: Width=162 a Height=214. Do HlPanelu vložte Button (ano, prostý Button) s Captionem X a Namem Exit. Do procedury OnClick napište pouhé Close;.
      Teď už můžeme nastavit zbytek věcí okna. Já jsem ho pojmenoval Project, ale to je úplně jedno. Hlavní jsou ostatní parametry: ActiveControl je HlPanel, BorderStyle nastavte na bsNone a Position bude poScreenCenter. To by bylo. Teď, když program spustíte, půjde okno zavřít pouze tlačítkem Exit (s nápisem X - to má vypadat jako křížek na zavření okna!).
      Teď vložte Timer a pojmenujte ho Zmena. Jeho Interval bude 200. Předepište si proměnné:
    Playing : Boolean;
    Jmeni, Odmena, pf : Integer;

    A u okna do procedury OnCreate napište:
    Playing := True;
    Jmeni := 10;

    A teď vložíme zbývající objekty...
     
  95.   Nejprve vložte 3 panely (Obr1, Obr2 a Obr3). U všech nastavte Height i Width na 41. Obr1 (Left=8, Top=24) bude obsahovat Shape pojmenovaný Shp1 (Left i Top=1, Pen.Style=psClear, Height i Width = 39), Obr2 (Left=56, Top=24) bude obsahovat Shape Shp2 (se stejnými vlastnostmi, jako Shp1) a v Obr3 (Left=104, Top=24) opět Shape a tentokrát s Name Shp3 (vlastnosti jako u Shp1 a Shp2). To bysme měli 3 hlavní losovací obrázky.
      Teď umístíme tlačítko (Button), které pojmenujeme Los. Caption bude Zastavit, Height 17, Left=2, Top také 2 a Width bude 55. Vložte (do HlPanelu) 7 Labelů (Kc, Korun, Korunek, Kredit, Vsadit, Vyhra, Vyrobeno), 2 Panely (PanelJmeni, PanelVyhry), nastavte u nich BevelOuter na bvNone, Color na clGray a do každého jeden Label (do PanelJmeni Prachu a do PanelVyhry Vydelek). Ještě vložte SpinEdit (já vám říkal, že ho hodně používám (nebo neříkal?image) a pojmenujte ho Castka.
      A teď doplňte parametry podle tabulky:
    Name Caption Left Top Height Width Font
    Kc 131 160 !!! !!! Tučný 10
    Korun 130 75 !!! !!! Tučná kurzíva 10
    Korunek 131 120 !!! !!! Tučný 10
    Kredit Vaše aktuální jmění: 7 144 !!! !!! Tučný 10
    Vsadit Vsadit: 5 76 !!! !!! neměnit
    Vyhra Poslední výhra: 7 104 !!! !!! Tučný 10
    Vyrobeno (datum výroby) 58 5 !!! !!! MS Serif 7 stříb.
    Prachu 10 !!! !!! !!! !!! Tučný 10
    Vydelek 0 !!! !!! !!! !!! Tučný 10
    Castka ----- 40 72 26 89 Tučná kurzíva 10
    Vysvětlivky:
      ----- = neobsahuje tuto položku
      !!! = vypočítá se samo ze zadaných hodnot

    U Prachu a Vydelek nastavte Align na alRight a u Castka nastavte MaxValue na 10, MinValue na 0 a Value na 1. A teď už jenom vlastní program:
     

  96.   A teď si vám dovolím napsat procedury a ke každé popsat, co se děje:
    Nejprve procedura, která se zavolá (spustí, provede, nebo jak chcete...) poté, co kliknete na tlačítko Los:
    procedure TProject.LosClick(Sender: TObject);
    begin
      if Playing then
      begin
        Los.Caption := 'Losovat';
        Playing := False;
        Zmena.Enabled := False;
        Vyhrat;
      end else
      begin
        Los.Caption := 'Zastavit';
        Los.Enabled := False;
        Playing := True;
        Zmena.Enabled := True;
      end;
    end;


      Playing je proměnná, která nám určuje, zda se mění symboly losování. Pokud se tedy losuje a vy kliknete na tlačítko, změní se nápis na tlačítku na "Losovat", Playing se změní na False (to znamená, že se už nemění tvary), příkaz Zmena.Enabled := False; se zastaví časovač Zmena a Vyhrat; spustí proceduru Vyhrat (tu jsme zatím nenadefinovali).
      A pokud nebu Playing True, nápis se změní na "Zastavit", znepřístupní se tlačítko Los (nedá se na něj kliknout (ale to se v časovači změní. Je to kvůli neustálému zastavování a spouštění stejné sestavy tvarů za účelem výhry velké částky!)- dosáhne se toho příkazem Los.Enabled := False;), Playing se změní na True a spustí se časovač.
      A teď probereme, co se stane každou pětinu sekundy (neboli co napíšeme do procedur OnTimer:

    procedure TProject.ZmenaTimer(Sender: TObject);
    var x : Integer;
    begin
      Los.Enabled := True;
      Randomize;
      x := Random(2);
      if x = 0 then Shp1.Shape := StCircle else
        Shp1.Shape := StRectangle;
      x := Random(2);
      if x = 0 then Shp2.Shape := StCircle else
        Shp2.Shape := StRectangle;
      x := Random(2);
      if x = 0 then Shp3.Shape := StCircle else
        Shp3.Shape := StRectangle;

    Nejprve jsme zpřístupnili tlačítko Los (viz. výše), poté jsme spustili generování náhodných čísel a potom jsme do místní proměnné x (Integer) dosadili náhodné číslo. Pokud je číslo x 0, Shp1 se změní na kruh, jinak na obdélník. To samé se opakuje pro všechny tři tvary. Ale pojďme dále:
      x := Random(6);
      if x = 0 then
        Shp1.Brush.Color := clBlack else
      if x = 1 then
        Shp1.Brush.Color := clWhite else
      if x = 2 then
        Shp1.Brush.Color := clRed else
      if x = 3 then
        Shp1.Brush.Color := clBlue else
      if x = 4 then
        Shp1.Brush.Color := clGreen else
        Shp1.Brush.Color := clYellow;

    Opět dosadíme za x náhodné číslo do 6 (včetně nuly a vyjma 6 = šestka tam není!). Pokud je číslo 0, Shp1 jedna bude černý, pokud 1, je bílý, 2=červený, 3=modrý, pokud je x 4, bude Shp1 zelený a pokud něco jiného (=5), bude žlutý. To se opakuje pro všechny tři Shpey (to je níže:)
      x := Random(6);
      if x = 0 then
        Shp2.Brush.Color := clBlack else
      if x = 1 then
        Shp2.Brush.Color := clWhite else
      if x = 2 then
        Shp2.Brush.Color := clRed else
      if x = 3 then
        Shp2.Brush.Color := clBlue else
      if x = 4 then
        Shp2.Brush.Color := clGreen else
        Shp2.Brush.Color := clYellow;
      x := Random(6);
      if x = 0 then
        Shp3.Brush.Color := clBlack else
      if x = 1 then
        Shp3.Brush.Color := clWhite else
      if x = 2 then
        Shp3.Brush.Color := clRed else
      if x = 3 then
        Shp3.Brush.Color := clBlue else
      if x = 4 then
        Shp3.Brush.Color := clGreen else
        Shp3.Brush.Color := clYellow;
    end;

    A to jsou celé dvě procedury, které jsou automaticky vytvořitelné, ale chybí nám ještě jedna...
     
  97.   A to je procedura Vyhrat, kterou musíte předdefinovat nahoře (před private a public za ostatní předepsání procedur). Dále už prostě pište:
    procedure TProject.Vyhrat;
    var odme : Boolean;
    begin
      Odmena := Castka.Value;
      odme := False;
      if (Shp1.Shape = Shp2.Shape) and (Shp3.Shape = Shp2.Shape) then
      begin
        Odmena := Odmena * 5;
        odme := True;
      end;

    Nejprve uložíme do proměnné Odmena hodnotu, jakou jste vsadili (kterou jste zadali do Castka). Dále se místní proměnná odme nastaví na Fasle (to znamená, že hráč nemá zatím žádnou výhru). A teď začíná nejdůležitější část programu: BODOVÁNÍ! Pokud bude mít Shp1 a Shp2 stejný tvar a zároveň je tvar Shp3 stejný jako tvar Shp2 (to znamená, že mají všechny Shpy stejný tvar - níže to budu psát takto (zkráceně)), Odmena se vynásobí pětkrát a odme se změní na True (hráč už něco vyhrál).
      if (Shp1.Brush.Color = Shp2.Brush.Color) and (Shp3.Brush.Color = Shp2.Brush.Color) then
      begin
        Odmena := Odmena * 5;
        odme := True;
      end else

    Pokud mají všechny Shpy stejnou barvu, vynásobí se Odmena také 5x (a odme se změní na True (to už psát nebudu)). Pokud však všechny barvy nejsou stejné, pokračuje program dále:
      if Shp1.Brush.Color = Shp2.Brush.Color then
      begin
        odme := True;
        if Shp1.Shape = Shp2.Shape then
          Odmena := Odmena * 2 else
          Odmena := Odmena * 1;
      end else

    Pokud mají Shp1 a Shp2 stejnou barvu, vynásobí se Odmena 2x, pokud mají i stejný tvar a 1x, pokud ne. A jestli to neplatí, program pokračuje ve zjišťování podobnosti barev dál:
      if Shp2.Brush.Color = Shp3.Brush.Color then
      begin
        odme := True;
        if Shp2.Shape = Shp3.Shape then
          Odmena := Odmena * 2 else
          Odmena := Odmena * 1;
      end else

    Jestli mají Shp2 a Shp3 stejnou barvu, stane se to samé, jako u předchozí části.
      if Shp1.Brush.Color = Shp3.Brush.Color then
      begin
        odme := True;
        if Shp1.Shape = Shp3.Shape then
          Odmena := Odmena * 2 else
          Odmena := Odmena * 1;
      end;

    A nakonec se ještě zjistí barevná a tvarová podobnost Shp1 se Shp3. A tím končí skupina IFů spojených ELSE. Tím ale procedura nekončí!
      if odme = False then
        Odmena := 0;
      Vydelek.Caption := IntToStr(Odmena - Castka.Value);
      Jmeni := Jmeni + Odmena - Castka.Value;
      Prachu.Caption := IntToStr(Jmeni);
      Castka.MaxValue := Jmeni;

    Pokud jste se netrefili do žáné výherní varianty (odme je False), Odmena je nula. Do nápisu Vysledek se dosadí Odmena bez vsazené částky, převedená na string. Ke Jmeni (tj. kolik vlastníte peněz) se přičte Odmena a odečte vsazená částka (Castka.Value). Vysledek se převede na string a zapíše do Prachu (nápis, který informuje hráče o jeho jmění) a maximální hodnota vsazených peněz se přeřídí na hodnotu peněz na kontě hráče.
      if Jmeni < 1 then
      begin
        Castka.Enabled := False;
        Los.Enabled := False;
        Castka.Value := 0;
      end;
    end;

    A nakonec, pokud je Jmeni menší, než 1, nemůžete (logicky) nic vsadit (Castka se znepřístupní), Nemůžete kliknout na tlačítko Los a vsázená částka se nastaví na 0. A tím máte Losování hotové. Navíc si můžete opět stáhnout zdrojové soubory (2,9 kB)...
     
  98. Tak co? Her už máte dost, tak na závěr jeden program. A stejně jako XXProfesor se bude jednat o program, který můžete vylepšit (tentokrát ne změnou vzhledu, ale rozšířením funkce. Jaké funkce? Dělení. Ano, teď vám řeknu (napíšu), jak vyrobit Dělení (a to 2.verzi!):
      Začněme nastavením okna: Width=340, Height=290, v položce BorderIcons nastavte vše (kromě biSystemMenu) na False, BorderStyle=bsDialog, Caption=Program na písemné dělení pro kontrolu a podvodníky, Color si nastavte, jak chcete a Position=poScreenCenter.
      A teď si vložíme objekty: 3x Label (Deleno, RovnaSe a Zbyde), 1 Button (Vypocet), 2x SpinEdit (Delenec, Delitel) a 11x Panel (p1, p2 až p9, Podil a Zbytek).
      A co do nich dosadíte? Tohle:

    Name
    Caption Left Top Height Width Font
    p1 100 24 33 23 33 XXX
    p2   31 58 23 33 XXX
    p3   38 83 23 33 XXX
    p4   45 108 23 33 XXX
    p5   52 133 23 33 XXX
    p6   59 158 23 33 XXX
    p7   66 183 23 33 XXX
    p8   73 208 23 33 XXX
    p9   80 233 23 33 XXX
    Delenec **500 24 8 23 89 XXX
    Delitel **200 120 8 23 49 XXX
    Podil 2 185 8 23 73 XXX
    Zbytek 100 280 8 23 27 XXX
    Vypocet Vypočítat příklad 185 40 17 122 Tučné 8
    Deleno : 112 5 !!! !!! Tučné 14
    RovnaSe = 170 7 !!! !!! Tučné 14
    Zbyde Zb. 260 13 !!! !!! Tučné 8
    Vysvětlivky:
    **= položka Value (ne Caption)
    XXX=Courier New, Tučné 8
     !!! = vypočítá se samo ze zadaných hodnot

    U panelů a SpinEditů nastavte Color na clWhite, Delenec bude mít MaxLength 9, MaxValue 999999999, MinValue 1 a Delitel MaxLength=3, MaxValue 999 a MinValue také 1. A u všech panelů nastavte BevelInner i BevelOuter na bvLowered. A můžeme se pustit do programování...
     

  99. Je tu jen jedna procedura. Když kliknete na Vypocet.
    procedure TCentrOkno.VypocetClick(Sender: TObject);
    var Dlnc, Dltl, Zbtk, Pos, Delka : Integer;
        Vysledek : string;
        Cha : Boolean;
    begin
      Cha := True;
      p1.Caption := '';
      p2.Caption := '';
      p3.Caption := '';
      p4.Caption := '';
      p5.Caption := '';
      p6.Caption := '';
      p7.Caption := '';
      p8.Caption := '';
      p9.Caption := '';
      p1.Left := 24-8;
      p2.Left := 31-8;
      p3.Left := 38-8;
      p4.Left := 45-8;
      p5.Left := 52-8;
      p6.Left := 59-8;
      p7.Left := 66-8;
      p8.Left := 73-8;
      p9.Left := 80-8;
      Vysledek := '';
      Dltl := Delitel.Value;
      Delka := Length(Delenec.Text) + 1;

    Takže, teď už máme nastavené nápisy v p1 až p9 na nic a umístěné v základní pozici. Vysledek je také prozatím prázdný, proměnná Dlt má hodnotu Delitel.Value a proměnná Delka má hodnotu o jedna větší, než je počet písmen v Delenec.
    // Výsledek :
      Podil.Caption := IntToStr(Delenec.Value div Delitel.Value);
      Zbytek.Caption := IntToStr(Delenec.Value mod Delitel.Value);

    Na tom nebylo co vysvětlovat. Prostě jsem vydělelil Delenec Delitelem a vyšel mi nápis do Podilu. A zbytek jsem udělal stejným způsobem.
    // Příprava :
      if StrToInt(Delenec.Text[1]) >= Delitel.Value then
      begin
        p1.Left := p1.Left - 8;
        p2.Left := p2.Left - 8;
        p3.Left := p3.Left - 8;
        p4.Left := p4.Left - 8;
        p5.Left := p5.Left - 8;
        p6.Left := p6.Left - 8;
        p7.Left := p7.Left - 8;
        p8.Left := p8.Left - 8;
        p9.Left := p9.Left - 8;
        Pos := 2;
        Dlnc := StrToInt(Delenec.Text[1])
      end else

    Pokud je v Delnci první písmeno (převedené na Integer) větší, nebo rovno Deliteli, posunou se všechny pčka o 8 pixelů doleva od základní pozice, Pos bude mít hodnotu 2 a Dlnc bude mít hodnotu prvního písmene v Delenec (samozřejmě převedeného na Integer). Pokud však ne, pokračuje program zde:
      if StrToInt(Copy(Delenec.Text, 1, 2)) >= Delitel.Value then
      begin
        Pos := 3;
        Dlnc := StrToInt(Copy(Delenec.Text, 1, 2))
      end else
      if StrToInt(Copy(Delenec.Text, 1, 3)) >= Delitel.Value then
      begin
        p1.Left := p1.Left + 8;
        p2.Left := p2.Left + 8;
        p3.Left := p3.Left + 8;
        p4.Left := p4.Left + 8;
        p5.Left := p5.Left + 8;
        p6.Left := p6.Left + 8;
        p7.Left := p7.Left + 8;
        p8.Left := p8.Left + 8;
        p9.Left := p9.Left + 8;
        Pos := 4;
        Dlnc := StrToInt(Copy(Delenec.Text, 1, 3));
      end else

    To byly opět dvě na sebe navazující IFové části spojené ELSE. 1.: Pokud je nápis v Delenci na prvním až druhém místě větší nebo roven Deliteli, Pos bude 3 a Dlnc ona 2 písmena na začátku. A pozice pček zůstane základní. 2.: Když bude 1. až třetí písmeno Delence větší nebo rovno Deliteli, bude Pos 4 pčka se posunou o 8 pixelů doprava a Dlnc bude opět mít hodnotu oněch zjišťovaných písmen.
      begin
        p1.Left := p1.Left + 16;
        p2.Left := p2.Left + 16;
        p3.Left := p3.Left + 16;
        p4.Left := p4.Left + 16;
        p5.Left := p5.Left + 16;
        p6.Left := p6.Left + 16;
        p7.Left := p7.Left + 16;
        p8.Left := p8.Left + 16;
        p9.Left := p9.Left + 16;
        Pos := 5;
        Dlnc := StrToInt(Copy(Delenec.Text, 1, 4));
      end;

    A nakonec, pokud nesedělo ani jedno z předchozích zjištění, posunou se pčka o 16p doprava Pos bude 5 a Dlnc budou první 4 písmena.
      if Delenec.Value < Delitel.Value then
      begin
        p1.Left := 24;
        p2.Left := 31;
        p3.Left := 38;
        p4.Left := 45;
        p5.Left := 52;
        p6.Left := 59;
        p7.Left := 66;
        p8.Left := 73;
        p9.Left := 80;
        Pos := 4;
        Dlnc := StrToInt(Copy(Delenec.Text, 1, 3));
      end;

    Na závěr //Přípravy jsme ještě doplnili, že pokud je Dlenec menší než Dělitel, budou mít pčka pozici, kterou jsme jim zadali v Object Inspectoru, Pos bude 4 a Dlnc první 3 písmena. A teď se pustíme do vypsání výsledků:

     
  100. // Zápis :1.
      if Pos < Delka then
      begin
        try
          Vysledek := Vysledek + IntToStr(Dlnc div Dltl);
          p1.Caption := IntToStr(Dlnc mod Dltl) + Delenec.Text[Pos];
          Dlnc := StrToInt(p1.Caption);
          Pos := Pos + 1;
        except
          Vysledek := '0';
          p1.Caption := '';
        end;
      end else

    Pokud bude Pos menší než Delka, potom se zkusí (to je to try - neprobírali jsme to, ale třeba to pochopíte) vydělit Dlnc Dltlem a připsat k Vysledek. Nápis p1 bude zbytek po vydělení Dlnce Dltlem a číslo Delence na "Postém" místě. Dlnc se nastaví na obsah p1 a k Posu se přidá jednička. Pokud to nepůjde (Pokud se třeba bude dělit nulou), proběhne část programu od EXCEPT do END;, tedy Vysledek bude 0 a p1 bude prázdné.
      begin
        if Cha = True then
        begin
          p1.Caption := Zbytek.Caption + ' ';
          Cha := False;
        end;
      end;

    Pokud nebude Pos menší než Delka a Cha bude True, nápis v p1 se nastaví na mezeru a Cha na False. Tyto 2 části programu napište celkem devětkrát (pro každý mezipočet (mezizbytek)). Jediné, co změníte, je, že místo p1 napíšete p2, p3 atd. Až skončíte u p9 (nic si z toho nedělejte- je to to samé!):
    // Zápis :9.
      if Pos < Delka then
      begin
        try
          Vysledek := Vysledek + IntToStr(Dlnc div Dltl);
          p9.Caption := IntToStr(Dlnc mod Dltl) + Delenec.Text[Pos];
          Dlnc := StrToInt(p9.Caption);
          Pos := Pos + 1;
        except
          Vysledek := Vysledek;
          p9.Caption := '';
        end;
      end else
      begin
        if Cha = True then
        begin
          p9.Caption := Zbytek.Caption + ' ';
          Cha := False;
        end;
      end;
    end;

    A je to! Pokud si to chcete stáhnout, tak můžete ZDE (2.9kB)! Programy jsou hotové, návod je dopsaný a já si konečně dám šlofíkaimage...

  101.  

TOPlist