Informatika I: přednáška 10 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 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.
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í.
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
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ů)
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;
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;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;
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.
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 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);
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 Pascaluunit 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 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;
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;
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 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(...)
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 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í).
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á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.
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
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 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;
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
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;
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.