Návody
Návod na delphi by ...Kukensius
-
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.
-
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").
-
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; ")
-
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á)
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)!
-
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.
-
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.
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ý.
-
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é.
-
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é.
-
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!) -
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". -
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čí.
-
Tak jsem vám ukázal věc ze složky Additional, ale teď se zase vrátíme do standartní položky "Standard"
:
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! -
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.
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í!
-
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...
-
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...
-
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
-
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!
-
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!!!!!)
-
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í...
-
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). 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!
-
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ů:
-
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:
-
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ř.: 5 / 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!
-
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ěti 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).
-
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ů:
-
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:
-
"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í v 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! Jdeme dál:
-
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.
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:
-
Tvary? Všechny ne, jenom elipsu, obdélník a zaoblený obdélník. Objekt je v Additional (kde jinde v této části?
) 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).
-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)...
-
"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! 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í
. Ž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í
. Ahoj a programujte (už můžete dělat spousty věcí)...
-
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?
-
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. 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...
-
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é!
-
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!!!!!
-
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!
-
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!
-
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:
-
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?No nic! Vynahradili jsme si to výše, ne?
-
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...
-
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!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? -
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í:
-
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:
-
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):
-
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?
-
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!
P.S.2.: String Adresa se může jmenovat klidně jinak. (Já používám Adresar- to jako Adresář
)
Ř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.
-
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ří!
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!).
-
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
-
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é!
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!
-
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!
-
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ě! 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... -
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:
-
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!
-
"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')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!
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!... A teď pojďme dál:
-
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!A to je z menu vše!
-
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:
-
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!Dík, že mi to prominete!
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!)
-
Teď si řekneme, jak pracovat s více okny! Sice jen 3 základní příkazy, ale co jiného?
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!
-
V menu Delphi najděte položku Tools. Když jí rozbalíte, úplně dole je položka
IMAGE EDITOR
Kdo 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.
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)!
-
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..........
-
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!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...
-
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.
-
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.
-
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. Takže budete mít třeba Kukensiův.prd
). Tak jsme se zasmáli, že?
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!
-
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)...
-
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!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?). 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!
). Tento string je důležitý! Budeme do něj postupně ukládat jednotlivé řádky (nebo pokud se vám líbí, tak Radky
). 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. A tím máme probranou práci se soubory.
-
"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!
-
"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):
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!
-
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
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
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!
-
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!
-
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). 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?)!
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...
-
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
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;
-
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.
-
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?). 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).
-
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!
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!
-
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.
-
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ž "č"!
-
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 PAINTBOX. Nemá žádné speciality a tak jsem se jejím popisem vyčerpal!
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ý!
-
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!
-
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:
-
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... -
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!
-
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!
-
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.zprava) 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)
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.
-
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íte
)). 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!
-
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čí!
-
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?
-
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!
) 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!
-
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: -
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 hodnotTo 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 {}:
-
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... -
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!
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í!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:
-
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ů)...
-
Nebudeme to protahovat a skočíme do toho rovnou po hlavě
. 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é). 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!!!!!).
-
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Í
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?), 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...
-
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?) a pojmenujte ho Castka.
A teď doplňte parametry podle tabulky:Name Caption Left Top Height Width Font Kc Kč 131 160 !!! !!! Tučný 10 Korun Kč 130 75 !!! !!! Tučná kurzíva 10 Korunek Kč 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 hodnotU 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:
-
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...
-
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)...
-
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:
NameCaption 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 hodnotU 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í...
-
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ů:
-
// 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íka...
-