4. díl - Události, vlastní procedury a typy, převody textu a čísel

Ostatní jazyky Delphi Události, vlastní procedury a typy, převody textu a čísel

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 (přesněji, když se aktivuje). 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 - 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 kód 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 myší

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ě (pokud ho budete držet déle, spustí se několikrát, to je rozdíl oproti pouhému kliknutí, které spustí proceduru jen jednou). 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). Uvědomte si, že např. notebooky kolečko většinou nemají, nedělejte tedy svou aplikaci závislou jen na této události.
  • 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!

Vlastní procedury

První bod byl šíleně dlouhý! Teď si řekneme pár dalších věcí! Začněme vytvářením vlastních procedur, jsou to bloky kódu, které provádí nějaké akce a které můžeme v programu potom volat, aniž bychom akce museli psát stále znovu. Napíšeme je jednou do procedury a potom je jen voláme kolikrát chceme.

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
 ...
end;

Místo ... pište, co se má stát, když napíšete někam jinam do programu Názevvašíprocedury; V našem případě tedy Procedurka; Udělali jsme si vlastně vlastní příkaz.

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:

// a {}

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 znaky //, vynechá text za nimi 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! Mám na mysli typ proměnné, jako byl třeba integer nebo string. Ano, také to jde a někdo se to přímo hodí.

Vlastní typ proměnné

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 jmenuje Vokno! My budeme psát mezi tyto dva řádky!

set of ()

Tvoříme tak něco jako 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 proměnné (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ů:

Char

Na počítači můžeme psát spousty různých znaků, písmen, číslic atd. Char je jeden znak. 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 (funguje stejně jako #: #13=Chr(13)=Enter).

Další funkce pro převod textu a čísla

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 ZkusStringdoIn­tegeru! 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:

Převod real a 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!

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

Real se prostě zaokrouhlí a vznikne zaokrouhlený real (tedy ne integer, jako u round). 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.

Převody real a string

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).

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:

Trackbar

Přibližně páte od leva je okénko s tečkami, lištou a posuvníčkem (opět záleží na vaší verzi Delphi). 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.
  • SelStart - 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:

Progressbar

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!

Hotkey

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...

Program

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? Tak ať se vám nové znalosti hodí...

...Kukensius


 

Stáhnout

Staženo 456x (227.92 kB)
Aplikace je včetně zdrojových kódů v jazyce Delphi

 

  Aktivity (1)

Článek pro vás napsal Kukensius
Avatar
Jméno: Lukáš Kučera alias Kukensius<br/> Narození: říjen 1987 (ve znamení vah)<br/> Bydliště: Jihlava, Česká Republika<br/> Studium: 1. ročník magisterského studia<br/> Škola: Vysoké učení technické v Brně<br/> Fakulta: Fakulta elektrotechniky ...

Jak se ti líbí článek?
Celkem (1 hlasů) :
55555


 


Miniatura
Všechny články v sekci
Delphi

 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!