Objektov programovn v TURBO PASCALu a TURBO VISION Zkladn principy OOP(objektov orientovan programovn) OBJEKT je jakmsi rozenm datovho typuu zznam. K popisu vlastnost slou ostatn datov typy, konstanty... a METODY-podprogramy. Deklarovnm typu jako OBJEKTU zavademe TDU (class) objekt pod jednm jmnem. Zaveden promnn typu OBJEKT se nazv INSTANCE. P.: pes=object barva:(ern,bl); dlka_srsti:real; procedure stekot; procedure hldej; end; tmto je zavedena tda objekt nazvanou PES. Konkrtn realizace objektu tdy- promnn se zve instanc. OOP umonuje logocky sdruovat souvisejc data a kd (zapouzden(encapsulation)) DDINOST VLASTNOST (INHERITANCE) Pokud mme nadefinovn njakakou tdu a chceme vytvoit novou tdu, kter m stejn vlastnosti jako pvodn a navc sv zvltn vlastnosti, lze vyut ddinosti. Vytvome novou tdu nap. CHRT jako potomka (decendant) tdy PES (viz. ve). CHRT=object(pes) procedure zavod END Tmto jsme vytvoily tdu CHRT, kter m vechny vlasntosti jako pes, ale navc obdahuje metodu zavod. Tda PES je pedchdcem (ancestor) tdy CHRT POLYMORFISMUS OOP Metody lze definovat jako statick = peklada zn vechny okolnosti v dob pekladu a vygeneruje kd. Pokud poadujeme rzn kd metody v zvislosti na zvolen td potomk, pak u vech (i pedka) mus bt metoda definovna jako virtuln - pouitm VIRTUAL. P.: Nadefinujeme si novou tdu PES pes=object barva:(ern,bl); dlka_srsti:real; procedure kresli_figuru; procedure stekot; procedure hldej; end; Metoda kresli_figuru slou k vykreslen figury psa. Metoda hldej simuluje pohyb psa kolem domu pekreslovnm, tud obsahuje voln metody kresli_figuru. procedure hlidej begin ... kresli_figuru; ... end; Pokud nyn vyvolme metodu hldej z tdy CHRT (potomek PES) pak bude vykreslen obecn pes a nikoliv chrt, protoe je to statick definice a dolo k ASN VAZB (EARLY BINDING). Pomoc virtuln metody: pes=object barva:(ern,bl); dlka_srsti:real; procedure kresli_figuru;virtual; procedure stekot; procedure hldej; end; pak u potomk musme uvst t tuto metodu jako virtuln: CHRT=object(pes) ... procedure kresli_figuru;virtual; ... END; Peklada vytvo tabulku virtulnch metod. V kdu metody hldej nen pm skok na kd mnetody kresli_figuru, ale voln je uskuten odkazem do tabulky virtulnch metod. A pi bhu programu se pozn, do tabulky kter tdy se m shnout pro adresu metody kresli_figuru = POZDN VAZBA (LATE BINDING) OOP V TURBO PASCALU Definice tdy, vytvoen instance objektu tdy Tda objekt je novm datovm typem: type pes=object barva:tbarva; dlka:integer; constructor init(abarva:tbarva;delka:integer); procedure kresli_figuru;virtual; procedure stekej; procedure hldej; end; tmto je definovna tda objekt pes, majc 2 datov vlastnosti a 4 metody. Definice tdy jako potomka: chrt=object(pes) procedure kresli_figuru;virtual; end; Pi zpisu metod se ped jmno procedury/funkce pe jmno tdy oddlen tekou. procedure pes.stekej; begin ... end; Vytvoen instance tdy=deklarace prommnn typu tdy: var pes1:pes; Promnn pes1 je instanc promnn tdy pes KONSTRUKTORY Pokud tda obsahuje aspo jednu vyrtuln metodu, mus tak existovat metoda zanajc klovm slovem CONSTRUKTOR !! V opanm ppad dojde k syntaktick chyb pi pekladu. Jde o zvltn metodu, pi jejm vyvoln je vytvoeno spojen mezi tabulkou virtulnch metod tdy objekt a aktuln instanc. Z toho vyplv, e KONSTRUKTOR MUS BT VYVOLN DV NE JIN VIRTULN METODA, jinak dojde k chyb. Tedy konstruktor by ml obsahovat vechny akce souvisejc s inicializac objektu, tj. nastaven potench hodnot... pro sprvnou funkci programu. PSTUP K VLASTNOSTEM OBJJEKTU, ROZSAHY PLATNOSTI Pstup pomoc tekov notace: pes1.stekej; a:=pes1.delka; Uvnit metody kadho objektu jsou vechny jeho vlastnosti (datov i dal metody) pstupn pmo - bez tekov notace. procedure pes.hldej begin ... stekej; a:=delka; ... end; Pro statick metody plat, e lze pedefinovat metodu na vy rovni=me se liit potem parametr. NELZE U VIRTULNCH METOD!-zde nelze mnit parametry, hlavika mus bt pod stejn!! IMPLICITN IDENTIFIKTOR SELF SELF je automaticky deklarovan ukazatel, kter v kadm okamiku obsahuje asresu aktulnho umstn objektu. Pstup k vlastnostem objektu uvnit tohoto objektu lze uskutenit bez tekov notace - SELF automaticky dopln nzev tdy. Pouv se zejmna v ppadech koliz identifiktor, kter nelze odstranit jinm zpsobem. P.: TYPE popis=record barva:tbarva; delka:integer; end; pes1=object(pes) {...viz ve} procedure nastav(co:popis); end; procedure pes1.nastav(co:popis); begin with co do begin self.barva:=barva; {jinak barva=barva ?? } self.delka:=delka; end; end; DYNAMICK ALOKACE OBJEKT, DESTRUKTORY Dynamick alokace: NEW(UKAZATEL,[,KONSTRUKTOR]); tedy: ukate=new(typUkazatele [,konstruktor]); konstruktor se po proveden alokace automaticky provede, uvd se jen pokud objekt obsahuje virtuln metody. Uvolnn dynamicky alokovanho objektu DISPOSE(UKAZATEL[,DESTRUKTOR]); Prvn paramettr je odkaz na ruen objekt, druh parametr je tzv. destruktor. Destruktor je zvltn metoda, kter se definuje pomoc klovho slova DESTRUCTOR p.: type ovcak=object(pes); ... destructor done; ... end; Destruktor uvoluje dynamicky alokovan objekt. Nejdve se provede kd destruktoru a pak se dealokuje objekt. Pokud tedy v kdu destruktoru neprovedeme uvolnn dynamicky alokovanch dat, zstanou nepstupn ale pod v pamti(heapu)! VZJEMN PIADIDELNOST OBJEKT pedek:=pedek potomek:=potomek edek:=potomek PKLAD PROGRAMU S PEJSKY :) {program simuluje hlidani psa-pes beha kolem domu a po stisknuti klavesy po dokonceni objehu zasteka a simulace je ukoncena...probiha pro 3 druhy psu} program Priklad_objektoveho_programovani; uses crt,graph; type tbarva=(BILA,CERNA,JINA); pes=object barva:tbarva; delka:integer; constructor init(abarva:tbarva;adelka:integer); procedure stekej; procedure kresli_figuru(x,y:integer);virtual; procedure hlidej; end; chrt=object(pes) procedure kresli_figuru(x,y:integer);virtual; end; ovcak=object(pes) procedure kresli_figuru(x,y:integer);virtual; destructor done; end; povcak=^ovcak; constructor pes.init(abarva:tbarva;adelka:integer); begin barva:=abarva; delka:=adelka; end; procedure pes.stekej; begin write(#7); delay(50); write(#7); end; procedure pes.kresli_figuru(x,y:integer); begin outtextxy(x,y,'PES'); end; procedure pes.hlidej; var pom:integer; zn:char; procedure kresli(x,y:integer); begin setColor(white); kresli_figuru(x,y); delay(2); setcolor(black); kresli_figuru(x,y); end; begin bar(100,100,200,200); repeat for pom:=50 to 210 do kresli(pom,80); for pom:=80 to 210 do kresli(210,pom); for pom:=210 downto 50 do kresli(pom,210); for pom:=210 downto 80 do kresli(50,pom); until keyPressed; zn:=readKey; stekej; end; procedure chrt.kresli_figuru(x,y:integer); begin outtextXY(x,y,'CHRT'); end; procedure ovcak.kresli_figuru(x,y:integer); begin outtextXY(x,y,'OVCAK'); end; destructor ovcak.done; begin end; var driver,mode:integer; pes1:pes; pes2:chrt; pes3:povcak; BEGIN pes1.init(CERNA,1); pes2.init(BILA,1); pes3:=NEW(povcak, init(JINA, 2)); driver:=detect; initGraph(driver, mode,'../BGI'); pes1.hlidej; pes2.hlidej; pes3^.hlidej; dispose(pes3,done); closeGraph; end. VOD DO TURBO VISION CO JSOU TURBO VISION Programov jednotka Turbo Vision je nstrojem pro usnadnn vvoje uivatelsky pjemnch program. Tato knihovna je psna s vyuitm princip OOP! Turbo Vision pracuj v textovm reimu ale vsledn programy se vzhledov podobaj grafickm systmm - obsahuj stejn prvky jako dialog-box, radio-button a dal. Vzhled programu napsanho v Turbo Vision je podobn jako prosted nap. Turbo Pascalu. PRINCIP PRCE Vechny objekty lze rozdlit na dv skupiny: OBJEKTY PROVDJC VSTUP NA OBRAZOVKU - VIEWS "NM OBJEKTY" PROVDJC OSTATN INNOST JAKO VPOTY... Mezi tmito skupinami by mla bt zachovna psn dlba prce-tj. aby se nm objekty nijak nesnaili komunikovat a naopak, aby views jen komunikovala, ale prci penechala nmm objektm. Uivatel psob na program pomoc klvesnice a myi. Jejich pouit v urit oblasti je akc, na kterou program reaguje. Kad akce zpsob vznik udlosti! Udlost je datov struktura rozliujc akci uivatele=bylo-li stisknuto tlatko myi, nebo klvesa... =>EVENT DRIVENT PROGRAMING=udlostmi zen programovn Turbo Visions poskytuj objekty, v metodch tchto objekt je ureno jejich chovn. Uivatel si pizpsobuje jejich chovn vytvenm potomk peddefinovanch td. Vlastn aplikan program je tak objekt! Je pro nj peddefinovna tda TAPPLICATION Jmna vech peddefinovanch td v Turbo Vision zanaj psmenem T, vechny ukazatele zanaj P. PRVN PROGRAM V TURBO VISION USES APP; type tMyApp=object(Tapplication) end; var myapp:tmyapp; begin myapp.init; myapp.run; myapp.done; end. Tento program pouze vykresl pracovn plochu a jedin udlost na kterou reaguje je kliknut na npis ALT-X Exit ve status line (stavov dek), nebo stisk ALT+X, co provede ukonen programu. VYTVOEN MENU A STAVOVHO DKU APLIKACE (TV2.PAS) Vytvome program databze PC komponent. Zatm jen ukeme tvorbu rznch menu a stavovho dku, jedinou opravdovou funkc je ukonen programu. USES app, views, objects, menus, drivers, dialogs; const cmSesNab=100; cmUkNab=101; cmZrnab=102; cmIMonitory=103; cmIDisky=104; cmIKlavesnice=105; cmOMonitory=106; cmOdisky=107; cmOKlavesnice=108; cmMore=109; type pDealer=^Tdealer; tdealer=object(Tapplication) procedure initMenuBar;virtual; procedure initStatusLine;virtual; end; procedure tDealer.initMenuBar; var r:tRect; begin getExtent(r); r.b.y:=r.a.y+1; menubar:=new(pMENUbar, init(r, newmenu( NEWSUBmenu('~N~abidka',hcNOcontext,NEWMENU( newItem('~S~estav','',0,cmsesnab, hcNocontext, newItem('~U~kaz','',0,cmuknab, hcNocontext, newItem('~Z~rus','',0,cmzrnab, hcNocontext, newLine( newItem('~K~onec','ALT-X',kbALTX,cmQuit, hcNocontext, nil))))) ), newSubMenu('Vstupy',hcNOcontext,newMenu( newItem('Monitory','',0,cmImonitory, hcNocontext, newItem('Disky','',0,cmIdisky, hcNocontext, newItem('Klavesnice','',0,cmIklavesnice, hcNocontext, nil)))), newSubMenu('Vystupy',hcNOcontext, newMenu( newItem('Monitory','',0,cmOmonitory, hcNocontext, newItem('Disky','',0,cmOdisky, hcNocontext, newItem('Klavesnice','',0,cmOklavesnice, hcNocontext, nil)))), NIL)))) )); end; Procedure tDealer.initStatusLine; var r:trect; begin getExtent(r); r.a.y:=r.b.y-1; statusLine:=new(pStatusLine, Init(r, newStatusDef(0,$FFFF, newStatusKey('~ALT-X~ Exit',kbAltX,cmQuit, newStatusKey('~F1~ Help',kbF1,cmHelp, newStatusKey('~F2~ Nabidka',kbF2,cmSEsNab, newStatusKey('~F10~ Menu',kbF10,cmMenu, nil)))), nil) )); end; VAR a:tdealer; BEGIN a.init; a.run; a.done; END. Vzhled menu a stavov dky lze ovlivnit pedefinovnm metody InitMenuBar a InitStatusLine standartnho objektu TApplication. Tyto metody jsou pedefinovvy v potomkovy TDealer. PKAZOV KONSTANTY cmXXXX Kad akce zpsob vznik udlosti. Udlost je datov struktura typu RECORD se jmnem typu TEVENT, kter obsahuje informace o dn a je pedvna jestnotlivm view. Vybere-li uivatel njakou poloku v menu, znamen to t vznik udlosti. Informace o tom, jak pkaz byl vybrn a jak akce se m provst je reprezentovn hodnotou typu word, kter je jednoznan svzna s kadou polokou menu. Programtor je ve svm programu definuje jako konstanty, zanajc CM (od COMMAND). V Turbo Vision jsou defonovny konstanty pro standartn akce jako cmQuit atd. Jsou tedy rezervovny hodnoty 0..99 a 256..999. Ostatn hodnoty m programtor k dispozici. (tedy 100..255 a 1000..65535) HLAVN MENU PROGRAMU - METODA INITMENUBAR Hlavn menu vytvome pedefinovnm metody initMenuBar tdy TApplication, to jest vytvoenm potomka. Tato metoda je peddefinovna jako virtuln, tud potomek mus bt t virtuln!! -OBJEKT TRECT TRect je jednoduch objekt, jeho datovmi polokami jsou dva objekty typu TPoint, kde TPoint je objekt obsahujc dv datov poloky typu X,Y. TPoint pedstavuje souadnice njakho bodu na obrazovce. TRect je zdednoduen definovn: Type TRect=Object A,B:TPoint; procedure Assign(XA,YA, XB,YB:integer); procedure Move(ADX,ADY:integer); Procedure Grow(ADX,ADY:integer); ... END; TRect se pouv k uren polohy a velikosti najkho view na obrazovce. A - souadnice levho hornho rohu, B - souadnice pravho dolnho rohu Metoda Assign - umouje zadn vech souadnic Metoda Move - zvt X-ov polokz A a B o hodnotu ADX a Y-ov o hotnotu ADY->posune view v urenm smru Metoda Grow - zvt pouze poloku B - zmn se velikost view -ZJITN VELIKOSTI VIEW Metoda GetExtent - vrac velikost view do parametru typu TRect tak, e A je nulovno a B je nastaveno na velikost v jednotlivch smrech. V programu jsme nejdve zjistili velikost cel plochy obrazovky a pot rozsah Y zmnili na jedin dek->menu je na nejvrchnjm dku obrazovky. -PROMNN MENUBAR Ukazatel na hlavn menu aplikace je uloen v globln promnn MenuBar typu PMenuView (ukazatel na TmenuView co je pedek typ menu TMenuBar a TMenuBox) Pokud je hodnota tto promnn NIL, neobsahuje dn menu. Musme tedy jej hodnotu definovat a to pomoc procedur a funkc: -PROCEDURY A FUNKCE PRO VYTVEN MENU Turbo Vision poskytuje prostedky pro vytven dvou typ menu: horizontln menu - objekty tdy TMenuBar vertikln menu - objekty tdy TMenuBox Tyto objekty se zpravidla vytvej dynamicky, proto je tvome volnm NEW, kde druhm parametrem je konstruktor pro pslun typ menu. --TVAR KONSTRUKTOR constructor TMenuBar.INIT(var Bounds:TRect;AMenu:Pmenu); constructor TMenuBox.INIT(var Bounds:TRect;Amenu:PMenu;AParentMenu:PMenuView); - Bounds vymezuje oblast ve kter bude menu vykresleno - AMenu je seznam poloek menu (typu TMenuItem) - AParentMenu je ukazatel na menu vlastnc definovan menu a umouje vytvet hiearchickou strukturu pull-down menu. Pokud jde o samostatn menu, bude tento parametr NIL Setznam poloek menu, pedvan jako pako parametr AMenu vytvome pomoc funkc: Function NewMenu(Items:PMenuItem):Pmenu; Fuction NewItem(Name,Param:TmenuStr;KeyCode:word;Command:word;AHELPCtx:word;next:pMenuItem):pMenuItem; Function NewLine(Next:pMenuItem):PmenuItem; Function NewSubMenu(Name:TmenuSTR;AHelpCtx:word;SubMenu:Pmenu;Next:PmenuItem):pMenuItem; Parametrem funkce NewMenu je seznam poloek typu TMenuItem, kter se vytvo libovolnm zetzenm funkc newLine, newItem a NewSubMenu. Toto zetzen je mon pomoc parametru NEXT. Pro ukonen menu, vlome NEXT=NIL a doplnme prav zvorky. Parametr NAME - etzec, pedstavuje jmno poloky v menu. Pomoc tildy (~) lze oznait znak pro zkrcen vybrn. Parametr AHelpCTX souvis s vytvenm kontextov zvisl npovdy. Pokud nen poadovna, uvede se na tomto mst konstatna hcNoContext, kter m hodnotu 0 Parametr Param - etzec, kter se objev v menu vedle jmna (NAME). Pouv se pro vypsn jmna klvesy jejm stisem lze provst alternativn vbr akce. Klvesa je urena parametrem KeyCode, na jeho msto se dosad peddefinovan konstanta, jej jmno zan KB (kbF1)... Parametr SubMenu - odkaz na seznam poloek. Vytvo se opakovnm ve popsanch postup. NEZVISL MENU, PROMNN DESKTOP A METODA EXECVIEW Pokud nechceme vytvet hlavn menu pomoc MenuBar a chceme vytvoit menu jin rovn, vytvome menu stejnm postupem (viz.ve) a ulome jej do vlastn promnn. Toto menu pak v programu spustme volnm metody: DeskTop^.ExecView(p:Pview):word; p - parametr, za nj dosadme odkaz na vytvoen menu Menu se objev na obrazovce a bude tam tak dlouho, dokud nevybereme nkterou z jeho poloek. Pak zmiz a funkce ExecView vrt hodnotu Command pslunou vybran poloce. DeskTop - globln promnn, obsahuje ukazatel na desktop aplikace. Je potomkem tdy TGroup - obsahuje jednotliv view, kter jsou do n vkldny pomoc metody Insert a odebrny pomoc metody Delete. DeskTop je tedy Group, do nho vloen view se automaticky vykresl na obrazovce. Metoda ExecView - obdova metod Insert a Delete, provede vloen view urenho parametrem P do TGroup a pevede jej do modlnho stavu - ek se a se view provede. Proveden je vybrn poloky a je realizovno metodou Execute STAVOV DKA APLIKACE - METODA INITSTATUSLINE Pouv se k vpisu krtkch informac, lze zde zobrazit poloky, kter lze vyvolat stiskem hork klvesy nebo kliknutm my... Definice stavov dky se provd pepsnm metody InitStatusLine objekty TApplication -PROMNN STATUSLINE Obsahuje odkaz na hlavn stavovou dku programu. Je typu PStatusLine a pokud je jej hodnota NIL pak program nem stavovou dku. Vytvoen stavov dky tedy znamen nadefinovn hodnot tto promnn. -PROCEDURY A FUNKCE PRO VYTVEN STAVOV DKY Stavov dka se tvo dynamicky. Pouv se tedy konstruktor: constructor Init(var Bounds:TRect;ADefs:PstatusDef); Bounds - umstn stavovho dku na obrazovce ADefs - odkaz na seznam poloek typy TStatausDef Typ TStatusDef je definovn: Type TStatusDef=record next:PstatusDef; min,max:word; Items:PStatusItem; end; Next - ukazatel na dalho lena v seznamu Min, Max - uruj rozsah help kontext pro nا je tato poloka platn Items - seznam poloek typu TStatusItem, definuje aktuln obsah stavov dky Typ TStatusItem je definovn: Type TStatusItem = record next:PstatusItem; text:Pstring; KeyCode:word; Commnand:word; End; Next - ukazatel na dal prvek seznamu Text - text poloky KeyCode - kombinace klves pro vyvoln akce pslun poloky, existuj peddefinovan konstanty kb... (kbAltX) Command - pkaz kter se m vygenerovat, je-li poloka vybrna, pkazy jsou konstanty cmXXXX Seznam, jeho odkaz se pedv do konstruktoru jako parametr ADefs se vytvo zetzenm volnm funkc: Function NewStatusDef(AMin,AMax:word;AItems:PstatusItem;ANext:PsatusDef):PstatusDEf; Function NewStatusKey(AText:String;AKeyCode:word;Acommand:word;ANext:PsatusItem):PstatusItem; Zetzen umouj parametry ANext! UDLOSTMI ZEN PROGRAMOVN DATOV TYP TEVENT Typ TEvent obsahuje informace o tom, o jak typ udlosti se jedn a nkter dal doplkov informace, kter jsou pro jednotliv udlosti odlin. Je definovn takto: Type TEvent=record what:word; case word of evNothong:(); evMouse:( Buttons:Byte; Double:Boolean; Where:TPoint; ) evKeyDown:( case Integer of 0:(KeyCode:Word); 1:(CharCode:Char; ScanCode:Byte)); evMessage:( Command:word; Case word of 0:(InfoPtr:Pointer); 1:(InfoLong:LongInt); 2:(InfoWord:Word); 3:(InfoInt:Integer); 4:(InfoByte:Byte); 5:(InfoChar:Char)); End; Udlosti jsou peddefinovny pomoc konstant evXXXX. Turbo Vision rozliuj tyi typy udlost. Konstanto evMessage oznauje udlost, kter je vyvolna njakm objektem aplikace. PRZDN UDLOST EVNOTHING Pud poloka what datov struktury TEvent obsahuje konstantu evNothing, znamen to, e ostatn poloky neobsahuj dnou informaci. Przdn udlost vznikne z neprzdn tak, e nkter objekt zpracuje udlost a nastav poloku what na evNothing, aby u na ni nemohl reagovat dn dal objekt. UDLOSTI OD MYI EVMOUSE Lze rozdlit na tyi podtypy oznaen konstantou evMouseDown - stisknut tlatka evMouseUp - uvolnn tlatka evMouseMove - zmna pozice evMouseAuto - periodicky generovan udlost pi dren stisknutho tlatka evMouse je tedy maskou pro vechny tyto udlosti a dovoluje nm zjistit jestli lo o akci od myi, nezvisle na jejm konkrtnm charakteru: if Event.What and evMouse <>0 then ... UDLOST KLVESNICE EVKEYDOWN Vznik po stisku njak klvesy, doplujc informac je kd stisknut klvesy. (KeyCode nebo CharCode, ScanCode) UDLOST GENEROVAN OBJEKTEM EVMESSAGE M podtypy: evCommand - udlost spojen s vybrnm poloky v menu nebo stavovm dku evBroadcast - udlost c se zvltnm zpsobem Uivatelsky definovan udlosti EN UDLOST V APLIKACI -KDE UDLOSTI VZNIKAJ Pro zjiovn udlosti by mla existovat njak smyka, kter kontroluje zda k njak udlosti dolo i nikoliv a zrove by na ni reagovala. Takovou smyku nen teba vytvet. V Turbo Vision existuje a to v objektu TApplication, konkrtn v metod RUN. Kd Run je: var E:TEvent; E.What:=evNothing; repeat if E.What evNothing then EventError(E); GetEvent(E); HandleEvent(E); until EndState<>Continue; -METODA GETEVENT Zde dochz k testovn uivatelskho vstupu. Pokud k njakmu dojde, napln se parametr E:TEvent TApplication.GetEvent je jedin msto, zabvajc se fyzickm vstupem, proto ji musme pedefinovat, chceme-li zmnit zpsob zachzen se vstupnm zazenm. -EN UDLOST, METODA HANDLEEVENT Pokud v GetEvent vznikne udlost, je uloena do struktury E typu TEvent a pedna metod HandleEvent. kolem metody TApplication.HandleEvent je pedn udlosti objektu, ktermu pat a jej ppadn zpracovn, pokud se zjist, e udlost pat aplikaci (potomku TApplication) --EN UDLOST OD MYI Adrest udlosti vznikl stisknutm tlatka myi je view nachzejc se pod kurzorem myi v dob vzniku udlosti. Jednotliv subview modlnho view jsou prochzena v obrcenm poad ne byla vloena. (posledn vloen bude zkoumno prvn) Toto uspodn se zve z-order. --ZAMEN UDLOSTI Jako Focused udlosti se udlosti z klvesnice a udlosti typu pkaz (vybrn poloky z menu). Adrestem je vdy zamen view=aktivn. Pokud po prohledn vech subview se nespn vrt udlost k modlnmu view (od kterho zaalo prohledvn) je zavolna metoda EventError a udlost zanik. EventError je przdn, lze ji pedefinovat. --UDLOST TYPU BROADCAST Udlosti typu evBroadcast a uivatelsky definovan.Nen pesn uren adrest, proto jsou udlosti pedny vem subview modlnho view. Pouvaj se k vzjemn komunikaci mezi objekty. --ZPRACOVN UDLOST Automatickou reakci na standardn udlosti zabezpeuje metoda HandleEvent. Nap. okno reaguje na udlost typu broadcast, e se m zavt, zmnit velikost a podobn. HandleEvent lze pedefinovat, ale ztratme automatick zpracovn tchto udlost. Po zpracovn udlosti je teba ji vyistit. Pomoc metody ClearEvent se nastav Event.What:=evNothing a do event.Info se zape @Self - oznaen udlosti jako zpracovan. DOPLNN PROGRAMU ABY REAGOVAL NA PKAZY uses app, views, objects, menus, drivers, dialogs; const cmSesNab=100; cmUkNab=101; cmZrnab=102; cmIMonitory=103; cmIDisky=104; cmIKlavesnice=105; cmOMonitory=106; cmOdisky=107; cmOKlavesnice=108; cmMore=109; type pDealer=^Tdealer; tdealer=object(Tapplication) procedure initMenuBar;virtual; procedure initStatusLine;virtual; procedure HandleEvent(var event:TEvent);virtual; procedure SestavNabidku; Procedure UkazNabidku; Procedure ZrusNabidku; procedure Vstup(ceho:string); procedure vystup(ceho:string); end; procedure tDealer.initMenuBar; var r:tRect; begin getExtent(r); r.b.y:=r.a.y+1; menubar:=new(pMENUbar, init(r, newmenu( NEWSUBmenu('~N~abidka',hcNOcontext,NEWMENU( newItem('~S~estav','',0,cmsesnab, hcNocontext, newItem('~U~kaz','',0,cmuknab, hcNocontext, newItem('~Z~rus','',0,cmzrnab, hcNocontext, newLine( newItem('~K~onec','ALT-X',kbALTX,cmQuit, hcNocontext, nil))))) ), newSubMenu('Vstupy',hcNOcontext,newMenu( newItem('Monitory','',0,cmImonitory, hcNocontext, newItem('Disky','',0,cmIdisky, hcNocontext, newItem('Klavesnice','',0,cmIklavesnice, hcNocontext, nil)))), newSubMenu('Vystupy',hcNOcontext, newMenu( newItem('Monitory','',0,cmOmonitory, hcNocontext, newItem('Disky','',0,cmOdisky, hcNocontext, newItem('Klavesnice','',0,cmOklavesnice, hcNocontext, nil)))), NIL)))) )); end; Procedure tDealer.initStatusLine; var r:trect; begin getExtent(r); r.a.y:=r.b.y-1; statusLine:=new(pStatusLine, Init(r, newStatusDef(0,$FFFF, newStatusKey('~ALT-X~ Exit',kbAltX,cmQuit, newStatusKey('~F1~ Help',kbF1,cmHelp, newStatusKey('~F2~ Nabidka',kbF2,cmSEsNab, newStatusKey('~F10~ Menu',kbF10,cmMenu, nil)))), nil) )); end; Procedure TDealer.HandleEvent(var Event:TEvent); begin Tapplication.handleEvent(Event); case event.command of cmSesNab :sestavNabidku; cmUkNab :UkazNabidku; cmZrNab :ZrusNabidku; cmImonitory :Vstup('Monitory'); cmIdisky :Vstup('Disky'); cmIKlavesnice :Vstup('Klavesnice'); cmOmonitory :Vystup('Monitory'); cmODisky :Vystup('Disky'); cmOKlavesnice :Vystup('Klavesnice'); else exit; end; ClearEvent(event); end; Procedure Tdealer.sestavNabidku; begin end; Procedure Tdealer.zrusNabidku; begin end; Procedure Tdealer.ukazNabidku; begin end; Procedure Tdealer.vstup(ceho:string); begin end; Procedure Tdealer.vystup(ceho:string); begin end; VAR a:tdealer; BEGIN a.init; a.run; a.done; END. Odezva na vechny udlosti typu pkaz je umstna v Tdealer.handleEvent. Pokud nebude na obrazovce dn modln dialog-box, pak budou vechny pkazy zpracovvny tmto objektem (potomek TApplication) POZNMKY KE ZPRACOVN UDLOST MASKOVN UDLOST Kad view obsahuje poloku EventMask, jej jednotliv bity koresponduj s bity poloky TEvent.What. Nastaven bitu do 1 znamen, e view bude danou udlost zpracovvat, 0 - ignorace udlosti ZMNA POAD PEDVN ZAMENCH UDLOST Kad view m poloku OPTION. Pokud v tto poloce nastavme bit ofPreProcess - pak toto view dostane zamenou udlost dve ne zamen view ofPostProcess - dostane udlost a po zamenm view. View zjituje v jak fzi udlost dostv pomoc poloky PHASE svho vlastnka (GROUP ve kter je vloeno). PHASE nabv hotnoty: phFocused, phPreProcess, phPostProcess ZKAZ A POVOLEN PKAZ Pkazy s hodnotou 0..255 mohou bt zakzny a nsledn povoleny. Zakzan pkaz je uivateli nedostupn (ed poloka v menu) Provd se pomoc metod: TView.DisableCommands a TView.EnableCommands. Ob maj jedin parametr TCommandSet - mnoina pkaz. kter se maj zakzat i povolit. UIVATELSKY DEFINOVAN UDLOSTI Nejvych est bit TEvent.What lze vyut pro zaveden novch kategori udlost. Pak je s nimi zachzeno jako s typem evBroadcast. Ppadn lze nastavit typ udlost, nastavenm bit v promnn PositionalEvents nebo FocusedEvents (pozin nebo zamen udlost) KOMUNIKACE MEZI OBJEKTY Vzjemn komunikace se pouv zdka a zna patn navrenou strukruru programu! K zasln zprv slou funcke message: Function Message(receiver:PView;What,Command:Word;InfoPtr:Pointer):pointer; Receiver - oznaen pjemce zprvy What - druh zprvy Command - pkaz InfoPtr - pomacn informace Je-li udlost spn zpracovna, funkce vrt ukazatel na objekt, kter ji zpracoval. METODA TAPPLICATION.IDLE Je vyvolna metodou tApplication.GetEvent, kdykoliv nen k dispozici dn udlost. Jej tlo je przdn. Lze ji proto pedefinovat a vyut nap. ke kontrole heapu... je spoutna pravideln, ani by zpomalovala bh programu, protoe se spout, kdy se dn prce nevyaduje. ZOBRAZITELN OBJEKTY - VIEWS CO JSOU TO VIEWS Oznaujeme tak kad objekt, kter me bt zobrazen na obrazovce. Je to jedin cesta pro vstup na obrazovku v Turbo Vision. View jsou vechny tdy objekt odvozen od tdy TView. TView je abstraktn objekt, pedek pro vechna view. Obsahuje vlastnosti pro vechna view spolen. Hiearchie objekt: TObject TCollection TSortedCollection TStringCollection TResourceCollection TResourceFile TStream TDosStream TBufStream TEmsStream TStringList TStringListMaker TView TCluster TCheckBoxes TRadioButtons TFrame TGroup TDesktop TProgram TApplication TWindow TDialog THistorywindow TBackGround TButton TStaticText TLabel TParamText THistory TListViewer THistoryViewer TListBox TInputLine TMenuView TMenuBar TMenuBox TScrollBar TScroller TTextDevice TTerminal TStatusLine