+ All Categories
Home > Documents > Informatika I 10 . přednáška

Informatika I 10 . přednáška

Date post: 17-Jan-2016
Category:
Upload: nanda
View: 49 times
Download: 0 times
Share this document with a friend
Description:
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 } - PowerPoint PPT Presentation
43
Informatika I 10. přednáška RNDr. Jiří Dvořák, CSc. [email protected]
Transcript
Page 1: Informatika I 10 . přednáška

Informatika I10. přednáška

RNDr. Jiří Dvořák, CSc.

[email protected]

Page 2: Informatika I 10 . přednáška

Informatika I: přednáška 10 2

Obsah přednášky

Objekty v Turbo a Borland Pascalu

Objekty v Object Pascalu

Prostředí Delphi

Page 3: Informatika I 10 . přednáška

Informatika I: přednáška 10 3

Objektový typ v Turbo Pascaluident_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.

Page 4: Informatika I 10 . přednáška

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ých složek

...end;

Pozn.: Sekce private a public mohou být vynechány nebo se mohou opakovat v libovolném pořadí.

Page 5: Informatika I 10 . přednáška

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;

Page 6: Informatika I 10 . přednáška

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;

Page 7: Informatika I 10 . přednáška

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.

Page 8: Informatika I 10 . přednáška

Informatika I: přednáška 10 8

MetodyTypy 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ů)

Page 9: Informatika I 10 . přednáška

Informatika I: přednáška 10 9

Příklady implementace metodconstructor 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;

Page 10: Informatika I 10 . přednáška

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;

Page 11: Informatika I 10 . přednáška

Informatika I: přednáška 10 11

procedure TBod.Kresli; begin PutPixel(X,Y,GetColor); end;constructor TKruznice.Inic(InicX,InicY,InicR:integer); begin TObrazec.Inic(InicX,InicY); R:=InicR; end;procedure TKruznice.Kresli; begin Graph.Circle(X,Y,R); {Circle je procedura jednotky Graph} end;constructor TElipsa.Inic(InicX,InicY,InicR,InicR2:integer); begin TKruznice.Inic(InicX,InicY,InicR); R2:=InicR2; end;procedure TElipsa.Kresli; begin Graph.Ellipse(X,Y,0,360,R,R2); end;

Page 12: Informatika I 10 . přednáška

Informatika I: přednáška 10 12

Virtuální metody a konstruktorVirtuá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 a tabulkou virtuálních metod příslušného objektového typu.

Page 13: Informatika I 10 . přednáška

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.

Page 14: Informatika I 10 . přednáška

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

Page 15: Informatika I 10 . přednáška

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)

Page 16: Informatika I 10 . přednáška

Informatika I: přednáška 10 16

Příklady s dynamickými objektytype 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);

Page 17: Informatika I 10 . přednáška

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;

Page 18: Informatika I 10 . přednáška

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.

Page 19: Informatika I 10 . přednáška

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;

Page 20: Informatika I 10 . přednáška

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;

Page 21: Informatika I 10 . přednáška

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.

Page 22: Informatika I 10 . přednáška

Informatika I: přednáška 10 22

Struktura jednotky v Object Pascaluunit jméno_jednotky;interface ... implementation ... initialization {volitelná inicializační část} ... finalization {volitelná úklidová část} ...

end.

Page 23: Informatika I 10 . přednáška

Informatika I: přednáška 10 23

Třída v Object Pascaluident_typu = class(ident_typu_předka) {Předek nemusí být uveden}seznam veřejných složekprivate seznam soukromých složekpublic seznam veřejných složekprotected 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;

Page 24: Informatika I 10 . přednáška

Informatika I: přednáška 10 24

Metody v Object PascaluStatické

hlavička metody;

Virtuální

hlavička metody; virtual;

Dynamické

hlavička metody; dynamic;

Předefinované dynamické nebo virtuální

hlavička metody; override;

Page 25: Informatika I 10 . přednáška

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.

Page 26: Informatika I 10 . přednáška

Informatika I: přednáška 10 26

Objekty v Object PascaluObjekty (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(...)

Page 27: Informatika I 10 . přednáška

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.

Page 28: Informatika I 10 . přednáška

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

Page 29: Informatika I 10 . přednáška

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.

Page 30: Informatika I 10 . přednáška

Informatika I: přednáška 10 30

Některé další rysy Object PascaluTří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í).

Page 31: Informatika I 10 . přednáška

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í

Page 32: Informatika I 10 . přednáška

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.

Page 33: Informatika I 10 . přednáška

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

Page 34: Informatika I 10 . přednáška

Informatika I: přednáška 10 34

Vlastnosti a událostiKaž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.

Page 35: Informatika I 10 . přednáška

Informatika I: přednáška 10 35

program Project1;

uses Forms, Unit1 in 'Unit1.pas' {Form1};

{$R *.RES}

begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run;end.

Struktura programu v Delphi

Page 36: Informatika I 10 . přednáška

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.

Page 37: Informatika I 10 . přednáška

Informatika I: přednáška 10 37

Předdefinovaná struktura jednotkyJednotka 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;

Page 38: Informatika I 10 . přednáška

Informatika I: přednáška 10 38

var Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);begin

end;

end.

Page 39: Informatika I 10 . přednáška

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.

Page 40: Informatika I 10 . přednáška

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;

Page 41: Informatika I 10 . přednáška

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

Page 42: Informatika I 10 . přednáška

Informatika I: přednáška 10 42

while not 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;

Page 43: Informatika I 10 . přednáška

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


Recommended