IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

4. diel - Udalosti, vlastné procedúry a typy, prevody textu a čísel

A je to tu! Čo? Budeme si rozprávať (vlastne budem písať) o položke EVENTS v OBJECT Inspector:

Začnime pri hlavnom objekte tj. Okna:

Form

Je tu veľa položiek a tak je preberieme podrobnejšie:

  • OnActivate - Po dvojitom kliknutí na položku vás program odkáže do okna na editáciu textu (tak tomu je u všetkých (čierno písaných) položiek v Events). Je tu približne toto:
procedure TForm1.FormActivate(Sender: TObject);
begin
end;

Možno ste to už v minulej časti pochopili, ale dnes to rozviniem: Tento úsek programu sa nazýva procedúra. Je to samostatná časť programu, ktorá sa spustí pri určitej akcii. A druh akcie značí práve názov položky v Events. Najprv je v procedúre nápis procedure, aby program vedel, o čo sa jedná. Potom nasleduje typ okna (Nájdete ho vpravo hore v Object Inspector. Dá sa tiež vytvoriť tak, že pred názov okna pridáte veľké T.), bodka a názov procedúry. V zátvorke sú premenné, ktoré sa nastavia pri spúšťaní procedúry. Medzi begin (začiatok) a end; (koniec) sa píše to, čo sa má vykonať.

Táto položka sa spustí, keď sa otvorí okno (presnejšie, keď sa aktivuje). Celkom užitočné!

  • OnClick - nebudem písať všetky položky - len tie najdôležitejšie) To je jedna z najzákladnejších položiek. Spustí sa, keď na okno kliknete. Výborné!
  • OnClose - Spustí sa, keď zatvárate okno. Hodí sa až pre program s viacerými oknami!
  • OnCreate - Najdôležitejšie !!! Jednoduchšie sa do okna pre editáciu dostanete dvojitým kliknutím na okno s ukážkou programu! Aktivuje sa pri spustení programu (ešte pred otvorením okna). Bez chyby!
  • OnDblClick - Skratka OnDoubleClick. To je ďalší z najzákladnejších položiek. Spustí sa, keď na okno dvojito kliknete (dvakrát rýchlo za sebou). Bezva!
  • OnKeyDown - Spustí sa, keď budete držať stlačené tlačidlo klávesnice. Sú tu dôležité premenné v zátvorke: Key - tlačidlo, ktoré je stlačené (získate kód tlačidla - napr .: Enter je 13, Esc je 27 ...)

    Shift - zistí, či je tlačidlo stlačené špeciálne. typy: ssShift - je stlačený Shift

    ssAlt - je stlačený Alt

    ssCtrl - je stlačený Ctrl

    ssLeft - je stlačené ľavé tlačidlo myši

    ssRight - je stlačené pravé tlačidlo myši

    ssMiddle - je stlačené stredné tlačidlo myši

    ssDouble - bolo dvakrát kliknuté myšou

  • Key - tlačidlo, ktoré je stlačené (získate kód tlačidla - napr .: Enter je 13, Esc je 27 ...)
  • Shift - zistí, či je tlačidlo stlačené špeciálne. typy: ssShift - je stlačený Shift

    ssAlt - je stlačený Alt

    ssCtrl - je stlačený Ctrl

    ssLeft - je stlačené ľavé tlačidlo myši

    ssRight - je stlačené pravé tlačidlo myši

    ssMiddle - je stlačené stredné tlačidlo myši

    ssDouble - bolo dvakrát kliknuté myšou

  • ssShift - je stlačený Shift
  • ssAlt - je stlačený Alt
  • ssCtrl - je stlačený Ctrl
  • ssLeft - je stlačené ľavé tlačidlo myši
  • ssRight - je stlačené pravé tlačidlo myši
  • ssMiddle - je stlačené stredné tlačidlo myši
  • ssDouble - bolo dvakrát kliknuté myšou

Pozor! U Shiftu zo zisťuje typ iným spôsobom ako inde:

if ssShift in Shift then

alebo

if not(ssAlt in Shift) then

Ak je ssShift v Shift (môže toho totiž byť stlačené viac), alebo to druhé: Pokiaľ nie je ssAlt v Shift!

  • OnKeyPress - Aktivuje sa, keď kliknete na tlačidlo na klávesnici. Procedúry sú rovnaké, ako u OnKeyDown, akurát !!!: Key nie je Integer, ale Char (#s číslom)! Ak chcete previesť char na integer, slúži na to príkaz v bode číslo 5!
  • OnKeyUp - Aktivuje sa, keď pustíte tlačidlo na klávesnici. Procedúry sú rovnaké, ako u OnKeyDown.
  • OnMouseDown - Spustí sa, keď budete držať stlačené tlačidlo myši na okne (ak ho budete držať dlhšie, spustí sa niekoľkokrát, to je rozdiel oproti obyčajnému kliknutie, ktoré sa procedúra len raz). Premenné v zátvorke: Button - rovná sa buď mbLeft (je stlačené ľavé tlačidlo), mbRight (pravé hr.), Alebo mbMiddle (je držané stredné tlačidlo)

    Shift - viď shift u OnKeyDown

    X, Y - pozícia kurzora v okne (X je stĺpec a Y riadok / X je vodorovný rozmer, Y zvislý)

  • Button - rovná sa buď mbLeft (je stlačené ľavé tlačidlo), mbRight (pravé hr.), Alebo mbMiddle (je držané stredné tlačidlo)
  • Shift - viď shift u OnKeyDown
  • X, Y - pozícia kurzora v okne (X je stĺpec a Y riadok / X je vodorovný rozmer, Y zvislý)
  • OnMouseMove - Spustí sa, keď pohnete myšou nad oknom. Premenné sú skoro rovnaké (nie je tu Button) ako u OnMouseDown. To sa celkom hodí !!!
  • OnMouseUp - Spustí sa, keď pustíte stlačené tlačidlo myši na okne. Premenné sú rovnaké ako u OnMouseDown.
  • OnMouseWheel - Spustí Sepro otáčania kolieskom myši. Najdôležitejšie z premenných je WheelDelta, ktorá určuje hodnotu posunutia kolieskom (je Integer). Uvedomte si, že napr. Notebooky koliesko väčšinou nemajú, nerobte teda svoju aplikáciu závislú len na tejto udalosti.
  • OnResize - Spustí sa, keď meníte rozmery okna (rozťahujete, zmršťuje ...). Hodí sa!
  • OnShow - Spustí sa pri zviditeľnenie okna (funguje skoro rovnako ako OnActivated).

A to je všetko!

Vlastné procedúry

Prvý bod bol šialene dlhý! Teraz si povieme pár ďalších vecí! Začnime vytváraním vlastných procedúr, sú to bloky kódu, ktoré vykonáva nejaké akcie a ktoré môžeme v programe potom volať, bez toho aby sme akcie museli písať stále znovu. Napíšeme je jednou do procedúry a potom je len voláme koľkokrát chceme.

Najprv nájdite časť programu, kde je napísané

private
    { Private declarations }
public
    { Public declarations }
end;

Teraz budeme písať nad tento text. Pokiaľ už nejaké procedúry máte, budete písať pod posledný. Ak nie, jednoducho píšte nad private :-) . Píšte v tvare: procedure názov; Namiesto "názov" napíšte meno vašej procedúry (nesmie sa tak menovať nič iné!). Teraz už ste program pripravili na to, že bude mať o procedúru NÁZOV viac. Pre lepšie vysvetlenie pomenujte procedúru treba Procedurka (procedure Procedurka;). Keď sme už program pripravili, zájdeme až na koniec celého textu. Nájdeme tu: end. To nám hovorí, že program končí (za endom musí byť bodka). Za neho sa už nič nepíše. Musíme teda pred neho! Napíšte najprv:

procedure typokna.název;
begin

Typokna je (viz. V bode 1.) akoby názov okna, pred ktorý sa pridá veľké T. V našom prípade teda (okno pomenujeme Okno:

procedure Okno.Procedurka;
begin
 ...
end;

Miesto ... píšte, čo sa má stať, keď napíšete niekam inam do programu Názevvašíprocedury; V našom prípade teda Procedurka; Urobili sme si vlastne vlastný príkaz.

A k čomu je to dobré? Veď to už môžete napísať obsah procedúry rovno na miesto, kam dáte v našom prípade Procedurka ;!

To je pravda, ALE: ak chcete jednu vec robiť v programe viackrát, ušetríte na celkovej veľkosti výsledného EXE súboru. A navyše: Keď program rozdelíte do procedúr, bude prehľadnejšie!

Keď už sme pri prehľadnosti ...

Chcete mať program prehľadný? Áno? Potom vás iste poteší, že si môžete robiť poznámky:

// a {}

Delphi podľa týchto dvoch znakov spozná, že ide o poznámku a nečíta jej, pri vytváraní vášho programu. Vy sa však vďaka poznámkam môžete lepšie orientovať! Pokiaľ Delphi narazí na znaky //, vynechá text za nimi Pr .:

Label1.Caption := 'Ahoj!'; //Na Label1 je Ahoj!
Label2.Caption := 'Sbohem'; //Na Label2 je Sbohem!

Takto si urobíte poznámky na jeden riadok! Že je text samotná poznámka spoznáte tak, že sa nápis sklopí doprava. A ako urobiť na viac riadkov? Keď Delphi narazí na {, vynecháva text, kým nenarazí na}. Takže poznámku si môžete dať tiež medzi {}. Pr .:

Label1.Caption := 'Ahoj!'; {Na Label1 je Ahoj!
    Teď je už další řádek! Ale poznámka ještě
    neskončila!}

Tak a ďalší bod je za nami! Že bol krátky? Tak sa pozrite na prvý! Keď urobíte priemer, nie sú nejaké krátke!

Ako posledný zo zložitosťou si dnes povieme, ako robiť vlastné premennú! Mám na mysli typ premennej, ako bol napríklad integer alebo string. Áno, tiež to ide a niekto sa to priamo hodí.

Vlastný typ premennej

Najprv nájdite na začiatku programu

type
  TForm1 = class(TForm)

Časť textu "Form1" sa mení podľa toho, ako máte pomenované svoje Okno. napr .:

type
  TVokno = class(TForm)

Okno sa volá Vokno! My budeme písať medzi tieto dva riadky!

set of ()

Tvoríme tak niečo ako zoznam názvov. Prvá premenná, ktorú musíte nadefinovať sami! Pod type teda píšte:

TNeco = set of (prvnínazev, druhynazev, tretinazev);

Namiesto TNeco napiste svoj názov typu premennej (T musí zostať !!!!!). Do zátvorky potom píšte názvy, u ktorých sa bude zisťovať, či v premennej sú! Môžete ich napští koľko chcete a oddeľte ich čiarkami. Pr .:

TKamaradi = set of (Pepa, Lojza, Franta, Ruda, Ada);

Teraz máme určený typ premennej TKamaradi. Teraz si ju vytvoríme: K ostatným premenným píšte treba: Kámoš: TKamaradi; Jenoduché, nie? A teraz práca s našou premennou:
Vynulovanie zoznamu: Kámoš: = [];
Určenie presného obsahu: Kámoš: = [Lojzo, Ruda, Ada];
Pridanie názvu: Kámoš: = Kámoš + [Pepa];
Odstránenie názvu: Kámoš: = Kámoš - [Pepa];
Pridanie názvu: Kámoš: = Kámoš + [Pepa];
Zistenie, či je určitý názov v zozname: if Franta in kámoš then
A zistenie, či určitý názov nie je v zozname: if not (Franta in kamoši) then

Vidíte a viete ďalšiu užitočnú vec !!!!!

A teraz si ukážeme, ako prevádzať rôzne premenné a uvedieme si pár nových typov:

Char

Na počítači môžeme písať spústy rôznych znakov, písmen, číslic atď. Char je jeden znak. Ale ako si to ten chudák zapamätá? Prevedie si znaky na čísla! Napr .: A má číslo 97, B 98, C 99, D 100, E 101 atď. A čo znak pre ďalší riadok? Enter má číslo 13! A char práve udáva miesto znakov čísla. A ako ho odlíšiť od Integer? Jednoducho, pred číslom v charu je znak # (krížik). Takže F bude v charu # 102, A bude # 97, Enter bude # 13, Esc # 27 atď. Že je to prevod znakov? Tak si skúste vložiť Label a napísať:

Label1.Caption := #97 + 'hoj' + #13 + 'člověče';

Čo sa objaví? Toto:
ahoj
človeče

A teraz pár vychytávok:

Ord & Chr

Prevádza char na integer a naopak! Ord prevedie char na integer a chr prevedie integer na char (funguje rovnako ako #: # 13 = Chr (13) = Enter).

Ďalšie funkcie pre prevod textu a čísla

StrToIntDef

Poznáte StrToInt? A stalo sa vám niekedy, že program hlásil chybu, pretože sa na číslo odvádzal napr. 458f26? Niet divu! "F" nie je číslica! Od toho je príkaz StrToIntDef. Tu zadáte číslo, ktoré sa má doplniť a je to! Píše sa v tvare:

Cislo := StrToIntDef(Napis, Nahrada);

Napis je string, ktorý chceme previesť na integer Cislo. Nahrada je číslo, ktorým bude nahradený string, pokiaľ z neho nepôjde utvoriť číslo!

TryStrToInt

To jest ZkusStringdoIn­tegeru! TryStrToInt je ďalší prešibanosť proti zlému zapísanie čísla vo stringu. Píše sa v tvare:

JdeTo := TryStrToInt(Napis, Cislo);

Ak je string Napis prevoditeľný na integer, boolean choďte bude True a integer Cislo bude číslo, ktoré bolo napísané v nápismi. Keď ale previesť nejde, Cislo sa nezmení a choďte bude False. Jednoduché, nie?

To sa celkom hodí, nie? Trebárs to vyrieši vaše problémy!

Tak to bolo prevádzanie Integer na String. A teraz si ukážeme, ako prevádzať Real na Integer:

Prevod real a integer

Najprv však musím povedať, že ak chcete previesť Integer na Real, použite obyčajné: =! Na prevod Realu na Integer sú dva spôsoby:

Round

To znamená zaokrúhliť! Dúfam, že viete, čo znamená zaokrúhliť! Ak nie, tak v Delphi radšej s číslami nepracujte! Píše sa v tvare:

IntegerCislo := Round(RealCislo);

Na ukážku napíšem príklad:

Cislo := Round(15.55);

Pozor na písanie desatinnej čiarky! Je tu namiesto nej bodka !!! Koľko bude Cislo? 16!

TRUNC

A druhým spôsobom číslo proste orežeme! Píše sa v tvare:

IntegerCislo := Trunc(RealCislo);

Na ukážku napíšem príklad:

Cislo := Trunc(15.55);

Koľko bude Cislo? 15! .55 sa proste zruší a ostane 15!

A keď už sme pri Realu, ukážeme si jeho úpravy:

Int

Real sa proste zaokrúhli a vznikne zaokrúhlený real (teda nie integer, ako u round). Píše sa v tvare:

RealCislo1 := Int(RealCislo2);

Na ukážku napíšem príklad:

Cislo := Int(15.55);

Koľko bude Cislo? 16! Päťka zaokrúhľuje nahor! Vyjde real 16.0!

Frac

Šialené, ale treba sa vám to bude hodiť! Čo to urobí? Odreže číslo pred desatinnou čiarkou. Ako to potom dopadne? Napr. zo 156.487 vznikne 0.487! Chápete? Píše sa v tvare:

RealCislo1 := Frac(RealCislo2);

Na ukážku napíšem príklad:

Cislo := Frac(15.55);

Koľko bude Cislo? 0.55! 15 sa proste zruší a ostane 0.55!

Celkom dobrá blbostky nie? Snáď nejakú z nich využijete!

A ako posledný som si nechal ešte dva prevody.

Prevody real a string

FloatToStr

Prevod reálu na string! Veľmi, veľmi užitočné! Užíva sa:

Napis := FloatToStr(RealCislo);

Na ukážku napíšem príklad:

Label1.Caption := FloatToStr(15.55);

Aký nápis bude na mieste Labelu1? Záleží na vašom nastavení! Proste pätnásť celých päť. Buď 15,55, alebo 15.55. Záleží na nastavení vo Windows (ako máte nastavené oddeľovanie celých a desatinných čísel).

StrToFloat

Prevod stringu na real! Používa sa rovnako, ako FloatToStr!

Ideme ďalej! Prejdeme k poznávaniu objektov v tabuľke v hlavnom okne. Navštívime položku Win32:

Trackbar

Približne piate od ľava je okienko s bodkami, lištou a posuvníčkem (opäť záleží na vašej verzii Delphi). Je to: TRACKBAR - Tu si rovno bez pomoci klávesnice určíte hodnotu nejakého Integer. Urobíte tak pomocou posuvníka. Určíte si pár vecí a TrackBar vám potom vráti číslo. A čo máme v Object Inspector:

  • Frequency - To je akoby stupnice. Určíte, po koľkých jednotkách sa budú zobrazovať čiarky. Keď dáte napr. 2, každý druhý bod posuvníka bude označený čiarkou.
  • Max - Zadáte číslo, ktoré bude ako najvyššia možná určená hodnota.
  • Min - Zadáte číslo, ktoré bude ako najnižšia možná určená hodnota.
  • Orientation - Nastavíte buď trVertical, aby bola lišta zvisle, alebo trHorizontal a bude vodorovne.
  • Position - Pozícia. Proste hodnota, ktorú ste posuvníkom zvolili. Integer!
  • SelEnd - Koniec označenej časti lišty TrackBaru.
  • SelStart - Začiatok označenej časti lišty.
  • SliderVisible - Visible určite viete čo je. Ale Slider? To je to, čo som nazval posuvníkom. Ten ukazovateľ na lište. Takže ak nechcete, aby nebola vidieť hodnota, nastavte False a posuvník zmizne!
  • TickMarks - Nastavíte, kde budú značky (čiarky u lišty). typy: - tmBoth-označenia sú okolo lišty (vpravo a vľavo, alebo hore a dole)
    • tmBottomRight-označenia sú na jednej strane lišty (vpravo, alebo dole)
    • tmTopLeft-označenia sú na jednej strane lišty (vľavo, alebo hore)
  • TickStyle - Nastavíte typ zobrazenia značiek: - tsAuto-značky sú tam, kam ich nastavíte inde (napr. vo Frequency)
    • tsManual-označenia sú iba na kraji (maximálna a minimálna hodnota)
    • tsNone-u lišty nie sú žiadne označenie

    A to je všetko. Na to, že sme už prebrali toľko objektov, je toho veľa!

    A v EVENTS? Je tu:

  • OnChange - Spustí sa, keď sa zmení hodnota Position! Bezva !!!
A to je všetko! Ale len o TrackBaru, teraz ideme ďalej:

Progressbar

A čo opačne? Správne! Ide to. Inak by som sa nepýtal! Zobraziť hodnotu? Inštalovali ste niekedy niečo? Spomínate na ukazovateľ percent? Pribúdali jedna farba na prúžku a druhá sa strácala. O toho je objekt na lište hneď napravo od TrackBaru:

Progressbar - Myslím, že už som ho pred chvíľou dostatočne opísal, takže sa převalíme k Object Inspector:

  • Smooth - buď bude na lište čiara, alebo niekoľko obdĺžnikov. Ak nastavíte True, bude to čiara, zadáte ak False, budú to obdĺžničky!

Hotkey

A posledná objekt, čo tentoraz preberieme je okienko na výber klávesových skratiek. Je asi ôsmy od ľava v oddieli Win32 a je to obrázok rámčeka a v ňom je Alt:

  • Hotkey - Čo to je, som opísal vyššie, a tak sa pusťme do vlastností v tabuľke Properties v Object Inspector:
  • HotKey - To je klávesová skratka, ktorá je napísaná v rámčeku
  • InvalidKeys - Tu si vyberiete, s akými tlačidlami sa nesmú vytvárať kombinácie. Ak nastavíte true napr. U hcShift, nemôže užívateľ programu zadať skratku obsahujúce kláves Shift. Ak nastavíte false u hcNone (je tam štandardne), nesmiete mať ako skratku jednu samotnú kláves (napr. Len A).
  • Modifiers - A čo keď máme v InvalidKeys nastavené hcShift na true? A ja zadám treba skratku Shift + K? Shift sa nahradí klávesom, ktorú tu nastavíte. Ak zadáte teda v modifiers true u hkCtrl, miesto Shift + K sa objaví skratka Ctrl + K!

Síce zatiaľ neviete skratky použiť, ale dôjde na to. A prečo skákať z jednej položky výberu objektov do druhej. Tak som to prebral vopred a až budeme brať menu, budeme mať náskok ...

Program

Na koniec som sa rozhodol, že vám popíšem výrobu programu na vypočítanie priemeru! Začnime zložitejším spôsobom, ktorý som používal, pretože som vtedy ešte nevedel prevádzať Real na String! Z pôvodného programu ešte nepoznáte jeden objekt a tak ho nahradíme Edit (síce sa nám program ešte sťaží, ale to nevadí!). Takže: do okna vložíme 3 tlačidlá, jeden Edit a štyri Label! Názvy (nápisy):

okno: Okno (Priemer (r)) tlačidlá: OK (OK), Koniec (Koniec), Maz (Znova) edit: Edit (0) labely: Napis (r =), R (0), Napis2 (,), Des (0) Label poskladajte vedľa seba tak, aby tvorili nápis: "r = 0, 0"

Zvyšok si poskladajte, ako chcete. Teraz si vytvorte premenné: Vys, Pocet, Súčet, Zz, hodnota: Integer;

A ideme ďalej! Pri kliknutí na tlačidlo Koniec nastavte púhe Close;

U Editu nastavte k procedúre OnChange:

Hodnota := StrToInt(Edit.Text);

A teraz tá hlavná časť môjho 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 priemer už to robí! Neviete ako?

Pocet určuje počet čísel.
Sucet je súčet všetkých čísel.
Vys je výsledok delenie súčtu čísel ich počtom a
Zb je zvyšok. Ten sa potom násobí desaťkrát, aby sa zistilo desatinné číslo!
Vynuluje sa nápis v Editu, do R sa napíše Vys (výsledok) a do Des sa napíše Zz vydelený počtom. Ak ste to nepochopili, už nič nenarobím!

A teraz ešte vynulovanie: Pri 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 ešte som sľúbil druhú metódu! Tu trochu skrátim:

Premenné máte: Pocet, medzičísl, Cislo: real;

A ako na to? Objekty necháme rovnaké, akurát zmaž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 ... vynulovať to snáď dokážete sami, nie? Tak nech sa vám nové znalosti hodí ...

... Kukensius

Delphi

 

Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 491x (227.92 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Delphi

 

Predchádzajúci článok
Text a reálne čísla, náhodnosť, tvoríme stopky
Všetky články v sekcii
Delphi
Preskočiť článok
(neodporúčame)
Hudba, zvuk a video, hlášky a vlastné mediaplyer
Článok pre vás napísal Kukensius
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
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 ...
Aktivity