1 / 43

Informatika I 10 . přednáška

Informatika I 10 . přednáška. RNDr. Jiří Dvořák, CSc. dvorak @uai.fme.vutbr.cz. Obsah přednášky. Objekty v Turbo a Borland Pascalu Objekty v Object Pascalu Prostředí Delphi. Objektový typ v Turbo Pascalu. ident_typu = object ( ident_typu_předka ) { předek nemusí být uveden }

nanda
Download Presentation

Informatika I 10 . přednáška

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Informatika I10. přednáška RNDr. Jiří Dvořák, CSc. dvorak@uai.fme.vutbr.cz

  2. Obsah přednášky • Objekty v Turbo a Borland Pascalu • Objekty v Object Pascalu • Prostředí Delphi Informatika I: přednáška 10

  3. Objektový typ v Turbo Pascalu ident_typu = object(ident_typu_předka) {předek nemusí být uveden} ident_položky: typ1; seznam identifikátorů položek: typ2; . . . hlavička metody 1; {statická metoda} hlavička metody 2; virtual; . . . end; Pozn.: Objektový typ musí být definován na nejvyšší úrovni programu nebo programové jednotky. Informatika I: přednáška 10

  4. Objektový typ v Borland Pascalu ident_typu = object(ident_typu_předka) {předek nemusí být uveden} seznam veřejných složek{lze vynechat} private seznam soukromých složek public seznam veřejnýchsložek . . . end; Pozn.: Sekce private a public mohou být vynechány nebo se mohou opakovat v libovolném pořadí. Informatika I: přednáška 10

  5. Příklad definice objektových typů type TObrazec = object X,Y:integer; {souradnice polohy} Viditelny:boolean; constructor Inic(InicX,InicY:integer); function DejX:integer; function DejY:integer; function JeVidet:boolean; procedure Kresli; virtual; procedure Ukaz; {pouziva metodu Kresli} procedure Smaz; {pouziva metodu Kresli pri pouziti stejne barvy jako je barva pozadi} procedure PresunDo(NoveX,NoveY:integer); {pouziva metody Smaz (na puvodni pozici) a Ukaz (na nove pozici)} destructor Odstran; virtual; end; Informatika I: přednáška 10

  6. TBod = object(TObrazec) procedure Kresli; virtual; end; TKruznice = object(TObrazec) R:integer; {polomer} constructor Inic(InicX,InicY,InicR:integer); procedure Kresli; virtual; end; TElipsa = object(TKruznice) R2:integer; {delka 2. poloosy} constructor Inic(InicX,InicY,InicR,InicR2:integer); procedure Kresli; virtual; end; Informatika I: přednáška 10

  7. Oblast platnosti identifikátorů a přístupnost složek Oblastí platnosti identifikátoru složky objektového typu (položky nebo metody) je příslušný objektový typ a všichni jeho potomci včetně bloků implementace metod. Identifikátor složky tedy musí být jedinečný v rámci příslušného objektového typu a jeho metod a všech jeho potomků a jejich metod. Složky definované v neoznačené sekci hned za hlavičkou objektového typu nebo v sekci public jsou přístupné bez omezení. Složky definované v sekci private jsou přístupné pouze v rámci modulu (programu nebo programové jednotky), který obsahuje definici tohoto objektového typu. Informatika I: přednáška 10

  8. Metody • Typy metod: procedure, function, constructor, destructor. • Metody a typ vazby: • statické (časná vazba) • virtuální (pozdní vazba) Pozn.: Konstruktor nemůže být virtuální metodou. • Implementace metod: Musí být provedena na stejné úrovni jako definice příslušného objektového typu. Označení metody při implementaci: ident_objektového_typu.ident_metody • Volání metod: ident_objektu.ident_metody(seznam parametrů) Informatika I: přednáška 10

  9. Příklady implementace metod constructor TObrazec.Inic(InicX,InicY:integer); begin X:=InicX; Y:=InicY; Viditelny:=false; end; function TObrazec.DejX:integer; begin DejX:=X; end; function TObrazec.DejY:integer; begin DejY:=Y; end; function TObrazec.JeVidet:boolean; begin JeVidet:=Viditelny; end; procedure TObrazec.Kresli; begin {Obrazec je abstraktni pojem, takze tato metoda je prazdna} end; Informatika I: přednáška 10

  10. procedure TObrazec.Ukaz; begin Viditelny:=true; SetColor(Barva); {nastaveni na barvu pro kresleni obrazcu} Kresli; end; procedure TObrazec.Smaz; begin Viditelny:=false; SetColor(GetBkColor); {nastaveni na barvu pozadi} Kresli; end; procedure TObrazec.PresunDo(NoveX,NoveY:integer); begin Smaz; X:=NoveX; Y:=NoveY; Ukaz; end; destructor TObrazec.Odstran; begin Smaz; end; Informatika I: přednáška 10

  11. procedure TBod.Kresli; begin PutPixel(X,Y,GetColor); end; constructorTKruznice.Inic(InicX,InicY,InicR:integer); begin TObrazec.Inic(InicX,InicY); R:=InicR; end; procedureTKruznice.Kresli; begin Graph.Circle(X,Y,R);{Circle je procedura jednotky Graph} end; constructorTElipsa.Inic(InicX,InicY,InicR,InicR2:integer); begin TKruznice.Inic(InicX,InicY,InicR); R2:=InicR2; end; procedureTElipsa.Kresli; begin Graph.Ellipse(X,Y,0,360,R,R2); end; Informatika I: přednáška 10

  12. Virtuální metody a konstruktor Virtuální metoda může být předefinována pouze virtuální metodou, jejíž hlavička navíc musí být identická s metodou původní. Jestliže objektový typ dědí nebo definuje virtuální metody, pak každá jeho instance musí být inicializována voláním konstruktoru před prvým použitím virtuálních metod. To znamená, že každý objektový typ, který obsahuje virtuální metody, musí mít alespoň jeden konstruktor (vlastní nebo zděděný). Konstruktor kromě provedení příkazů uvedených v jeho příkazové části ustavuje spojení mezi objektem atabulkou virtuálních metod příslušného objektového typu. Informatika I: přednáška 10

  13. Objekty Objekt = instance objektového typu • Statické objekty: Jejich vytvoření se zajistí deklarací příslušných proměnných v úseku var. • Dynamické objekty: Pro práci s nimi je třeba definovat proměnné typu ukazatel na příslušný objektový typ. Dynamické objekty se vytvářejí pomocí procedury new ve spolupráci s konstruktorem a ruší se pomocí procedury dispose ve spolupráci s destruktorem. Informatika I: přednáška 10

  14. Příklady se statickými objekty var A,B:TBod; Kr:TKruznice; El:TElipsa; ... A.Inic(50,50); A.Ukaz; B.Inic(150,150); B.Ukaz; Kr.Inic(100,100,30); Kr.Ukaz; El.Inic(180,100,40,20); El.Ukaz; Kr.PresunDo(100,150). Informatika I: přednáška 10

  15. Dynamické objekty • Vytvoření dynamického objektu: new(proměnná typu ukazatel na objektový typ, ident_konstruktoru(seznam parametrů)) • Zrušení dynamického objektu: dispose(proměnná typu ukazatel na objektový typ, ident_destruktoru) Informatika I: přednáška 10

  16. Příklady s dynamickými objekty type TUkBod = ^TBod; TUkKruznice = ^TKruznice; TUkElipsa = ^TElipsa; ... var UA,UB:TUkBod; UKr:TUkKruznice; UEl:TUkElipsa; ... new(UEl,Inic(100,100,50,30)); UEl^.Ukaz; dispose(UEl,Odstran); Informatika I: přednáška 10

  17. Příklad použití objektů unit Trideni; {Jednotka vyvazi abstraktni objektovy typ s vestavenou metodou bublinoveho trideni} interface const Nmax=100; type Trozsah=1..Nmax; TPoradi=object N:Trozsah; Poradi:array[Trozsah] of Trozsah; constructor Init; procedure Inicializuj; function Nema_predchazet(i,j:Trozsah):boolean; virtual; procedure Vymen(i,j:Trozsah); procedure Serad; end; implementation constructor TPoradi.Init; begin end; Informatika I: přednáška 10

  18. procedure TPoradi.Inicializuj; var i:Trozsah; begin for i:=1 to Nmax do Poradi[i]:=i; end; function TPoradi.Nema_predchazet(i,j:Trozsah):boolean; begin Nema_predchazet:=false; end; procedure TPoradi.Vymen(i,j:Trozsah); var p:Trozsah; begin p:=Poradi[i]; Poradi[i]:=Poradi[j]; Poradi[j]:=p; end; procedure TPoradi.Serad; var i,j:Trozsah; begin for i:=1 to N-1 do for j:=1 to N-i do if Nema_predchazet(j,j+1) then Vymen(j,j+1); end; end. Informatika I: přednáška 10

  19. program AplikaceTrideni; {Provadi vzestupne trideni pole zaznamu podle daneho klice} uses Trideni; type Tprvek=record klic:integer; hodn:string; end; Tpole=object(Tporadi) Pole:array[Trozsah] of Tprvek; function Nema_predchazet(i,j:Trozsah):boolean; virtual; procedure Cti; procedure Pis_poradi; function Dej_N:Trozsah; procedure Dej_prvek_pole(i:Trozsah; var Prvek:Tprvek); end; function Tpole.Nema_predchazet(i,j:Trozsah):boolean; var pi,pj:Trozsah; begin pi:=Poradi[i]; pj:=Poradi[j]; Nema_predchazet:=Pole[pi].klic>Pole[pj].klic; end; Informatika I: přednáška 10

  20. procedure Tpole.Cti; var i:Trozsah; begin Inicializuj; writeln('Zadej pocet prvku'); readln(N); for i:=1 to N do begin write(i,': '); with Pole[i] do readln(klic,hodn); end; end; procedure Tpole.Pis_poradi; var i:Trozsah; begin writeln; for i:=1 to N do with Pole[Poradi[i]] do writeln(klic:5,hodn); end; Informatika I: přednáška 10

  21. function Tpole.Dej_N:Trozsah; begin Dej_N:=N; end; procedure Tpole.Dej_prvek_pole(i:Trozsah; var Prvek:Tprvek); begin Prvek:=Pole[Poradi[i]]; end; var A:Tpole; begin A.Init; A.Cti; A.Serad; A.Pis_poradi; writeln('Stiskni Enter'); readln; end. Pozn: Uvedený program by po doplnění direktivy {$APPTYPE CONSOLE} za hlavičku programu fungoval i v Delphi. Informatika I: přednáška 10

  22. Struktura jednotky v Object Pascalu unit jméno_jednotky; interface ... implementation ... initialization {volitelná inicializační část} ... finalization {volitelná úklidová část} ... end. Informatika I: přednáška 10

  23. Třída v Object Pascalu ident_typu = class(ident_typu_předka) {Předek nemusí být uveden} seznam veřejných složek private seznam soukromých složek public seznam veřejných složek protected seznam chráněných složek {Složky zde uvedené jsou přístupné této třídě a všem jejím potomkům} end; Informatika I: přednáška 10

  24. Metody v Object Pascalu • Statické hlavička metody; • Virtuální hlavička metody; virtual; • Dynamické hlavička metody; dynamic; • Předefinované dynamické nebo virtuální hlavička metody; override; Informatika I: přednáška 10

  25. Virtuální a dynamické metody Virtuální i dynamické metody jsou volány pomocí pozdní vazby, ale liší se mechanismem jejího zabezpečení. • Virtuální metody: Zajištění pozdní vazby je rychlejší, ale má větší nároky na paměť. • Dynamické metody: Zajištění pozdní vazby je pomalejší, ale má menší nároky na paměť. Předefinování virtuální nebo dynamické metody: Místo direktivy virtual nebo dynamic je nutno použít direktivu override. Informatika I: přednáška 10

  26. Objekty v Object Pascalu Objekty (instance tříd) jsou implicitně dynamické, ovšem v textu programu se s nimi zachází tak, jako by byly statické. var ident_objektu: ident_třídy; {Tato proměnná je fyzicky reprezentována jako ukazatel} • Vytvoření objektu: ident_objektu:= ident_třídy.ident_konstruktoru(...); • Volání metod objektu: ident_objektu.ident_metody(...) Informatika I: přednáška 10

  27. Náhrada objektového typu třídou class v jednotce a programu pro třídění unit Trideni; interface const Nmax=100; type Trozsah=1..Nmax; TPoradi=class N:Trozsah; Poradi:array[Trozsah] of Trozsah; constructor Init; procedure Inicializuj; function Nema_predchazet(i,j:Trozsah):boolean; virtual; procedure Vymen(i,j:Trozsah); procedure Serad; end; implementation . . . end. Informatika I: přednáška 10

  28. program AplikaceTrideni; {$APPTYPE CONSOLE} {Provadi vzestupne trideni pole zaznamu podle daneho klice} uses Trideni; type Tprvek=record klic:integer; hodn:string; end; Tpole=class(Tporadi) Pole:array[Trozsah] of Tprvek; function Nema_predchazet(i,j:Trozsah):boolean; override; procedure Cti; procedure Pis_poradi; function Dej_N:Trozsah; procedure Dej_prvek_pole(i:Trozsah; var Prvek:Tprvek); end; . . . Informatika I: přednáška 10

  29. . . . var A:Tpole; begin A:=Tpole.Init; A.Cti; A.Serad; A.Pis_poradi; writeln('Stiskni Enter'); readln; end. Informatika I: přednáška 10

  30. Některé další rysy Object Pascalu • Třída může obsahovat také sekci published (pro její složky je možno zjistit informace o typu za běhu programu). • Třída vedle metod instancí může obsahovat také metody třídy (class methods). • Složkami třídy mohou být také vlastnosti. Vlastnost (property) je definována svým jménem a mechanismem získání nebo změny hodnoty vlastnosti. • Významným rysem Object Pascalu je mechanismus zpracování výjimek, který usnadňuje zajištění robustnosti programu (tj. jeho schopnosti zotavit se z chybových situací). Informatika I: přednáška 10

  31. Programovací prostředí Delphi • Objektově orientované programování v jazyku Object Pascal • Rychlý vývoj aplikací a prototypů • Událostmi řízené programování • Vizuální programování • Automatické generování části kódu • Vytváření databázových aplikací • Vytváření aplikací s více vlákny provádění Informatika I: přednáška 10

  32. Třídy a objekty v Delphi Předkem všech tříd v Delphi je třída TObject. Není-li tedy v definici třídy uveden předek, je třída přímým potomkem třídy TObject. Každá třída dědí od třídy TObject konstruktor Create a destruktory Destroy a Free. Přednostně by se měl používat destruktor Free, neboť nejprve testuje, zda objekt skutečně existuje a teprve potom provede jeho zrušení pomocí Destroy. Informatika I: přednáška 10

  33. Komponenty Delphi Komponenty Delphi zajišťují uživatelské rozhraní. Základními komponentami jsou formuláře, do kterých se vkládají další komponenty (tlačítka, přepínače, titulky, editační okna, dialogová okna, … ). Pro každý formulář vytvoří Delphi zvláštní jednotku. Všechny komponenty jsou implementovány jako objekty Object Pascalu. Třídy komponent jsou součástí knihovny vizuálních komponent (VCL - Visual Component Library). Informatika I: přednáška 10

  34. Vlastnosti a události Každá komponenta nabízí řadu vlastností, které určují vzhled či chování komponenty, a událostí, které se mohou vyskytnout v souvislosti s komponentou. Vlastnosti mohou být měněny v Object Inspectoru nebo za běhu programu. Pro každou událost je možno nastavit v Object Inspectoru obslužnou rutinu události, která je volána při vzniku dané události. Rutiny obsluhy událostí jsou jedním z klíčových prvků programování v Delphi. Informatika I: přednáška 10

  35. Struktura programu v Delphi program Project1; uses Forms, Unit1 in 'Unit1.pas' {Form1}; {$R *.RES} begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end. Informatika I: přednáška 10

  36. Objekt Application Application je objekt třídy TApplication a je definován v jednotce Forms. Tento objekt zapouzdřuje většinu práce, která je nutná k rozběhnutí programu ve Windows. Metoda Initialize zařizuje vše, co je nutné provést před vlastním spuštěním programu. Metoda CreateForm inicializuje formulář. Metoda Run přebírá události a rozděluje je do formulářů aplikace do té doby, než přijde příkaz k ukončení programu. Informatika I: přednáška 10

  37. Předdefinovaná struktura jednotky Jednotka přísluší k formuláři Form1, jehož součástí je tlačítko Button1. Objekt Form1 obsahuje metodu Button1Click pro ošetření události spočívající v kliknutí na tlačítko Button1. unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; Informatika I: přednáška 10

  38. var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); begin end; end. Informatika I: přednáška 10

  39. Program pro určení četností program Cetnosti; uses Forms, UCetnosti in 'UCetnosti.pas' {Form1}; {$R *.res} begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end. Pozn.: Tento program je automaticky vygenerován systémem a uložen v souboru Cetnosti.dpr. Dále jsou automaticky vytvořeny soubory Cetnosti.cfg, Cetnosti.dof a Cetnosti.res. Informatika I: přednáška 10

  40. unit UCetnosti; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) LNadpis: TLabel; EVstup: TEdit; EVystup: TEdit; LVstup: TLabel; LVystup: TLabel; BStart: TButton; procedure BStartClick(Sender: TObject); end; var Form1: TForm1; Informatika I: přednáška 10

  41. implementation {$R *.dfm} procedure UrciCetnosti(S1,S2:string); {Parametry teto procedury jsou jmena fyzickych souboru - vstupniho a vystupniho} var Zn:char; Cetnost:array['a'..'z'] of integer; Vstup,Vystup:TextFile; begin for Zn:='a' to 'z' do Cetnost[Zn]:=0; assignfile(Vstup,S1); assignfile(Vystup,S2); reset(Vstup); rewrite(Vystup); Informatika I: přednáška 10

  42. whilenot eof(Vstup) do begin read(Vstup,Zn); if Zn in ['a'..'z'] then Cetnost[Zn]:=Cetnost[Zn]+1 else if Zn in ['A'..'Z'] then begin Zn:=chr(ord(Zn)+ord('a')-ord('A')); Cetnost[Zn]:=Cetnost[Zn]+1; end; end; writeln(Vystup, 'Cetnosti pismen v souboru ',S1); writeln(Vystup); writeln(Vystup,'pismeno cetnost'); writeln(Vystup,'---------------'); for Zn:='a' to 'z' do writeln(Vystup,Zn:4,Cetnost[Zn]:9); closefile(Vstup); closefile(Vystup); end; Informatika I: přednáška 10

  43. procedure TForm1.BStartClick(Sender: TObject); {Procedura se spusti po kliknuti na tlacitko BStart na formulari. Predtim je ale třeba zadat jmena fyzickych souboru do editacnich poli EVstup a EVystup, cimz se nastavi hodnoty vlastnosti Text techto komponent.} var S1,S2:string; begin S1:=EVstup.Text; S2:=EVystup.Text; UrciCetnosti(S1,S2); Application.Terminate; end; end. Pozn.: Z textu této jednotky programátor vytváří pouze proceduru UrciCetnosti a tělo procedury TForm1.BStartClick. Vše ostatní se generuje automaticky na základě umisťování komponent na formulář a práce s ObjectInspectorem. Vytvořený zdrojový text jednotky je uložen v souboru UCetnosti.pas. Kromě toho je vygenerován soubor UCetnosti.dfm, který obsahuje použité komponenty a jejich vlastnosti. Informatika I: přednáška 10

More Related