Budeme pracovať v prostredí Delphi/Lazarus. Pripomeňme niektoré jednoduché príkazy.
Kreslenie
Kreslíme do komponentu
Image1:
procedure TForm1.Button1Click(Sender:
TObject);
var
I: Integer;
begin
for I:=1 to 100 do begin
Image1.Canvas.MoveTo(I*5, 0);
Image1.Canvas.LineTo(0, 500-I*5);
end;
end;
Farby:
procedure TForm1.Button2Click(Sender:
TObject);
var
I: Integer;
begin
for I:=9
downto 0 do begin
Image1.Canvas.Brush.Color:=TColor(random(256*256*256));
Image1.Canvas.Rectangle(100-i*10, 100-i*10, 100+i*10, 100+i*10);
end;
end;
Vlastné procedúry:
procedure Pozdrav(X, Y: Integer; Text: string);
var
I: Integer;
begin
for I:=1
to Length(Text)
do begin
Form1.Image1.Canvas.TextOut(X, Y+Random(10)-5, Text[I]);
X:=X+10;
end;
end;
procedure TForm1.Button3Click(Sender:
TObject);
begin
Pozdrav(100, 50, 'Ahoj');
end;
Rekurzia
Majme procedúru:
procedure Kresli(Text: string; X, Y, A, D: Real;
dA, dD: Real);
var
I: Integer;
begin
if D<1 then Exit;
for I:=1 to Length(Text) do
case Text[I] of
'L': A:=A-dA;
'P': A:=A+dA;
'D': begin
Form1.Image1.Canvas.MoveTo(Round(X), Round(Y));
X:=X+D*Sin(A);
Y:=Y-D*Cos(A);
Form1.Image1.Canvas.LineTo(Round(X), Round(Y));
end;
'*': Kresli(Text, X, Y, A, D*dD, dA, dD);
end;
end;
Vyskúšajme, čo program nakreslí pre takéto rôzne volania:
- Kresli('D', 300, 200, 0, 100, 0, 0) ... úsečku dĺžky 100
- Kresli('DLDLDLD', 300, 200, 0, 100, PI/2, 0) ... štvorec so stranou 100
- Kresli('DL*DL*DL*DL*', 300, 200, 0, 100, PI/2, 0.3) ... rekurzívny štvorec
- Kresli('DL*PP*', 300, 200, 0, 100, PI/4, 0.5) ... rekurzívny binárny strom
Definovanie objektov
Definovanie objektovej triedy:
type
TObj=class
private
X, Y: Integer;
public
constructor
Create(nX, nY: Integer);
procedure
Kresli(Canvas: TCanvas);
virtual;
procedure
Pohni;
end;
constructor TObj.Create(nX, nY: Integer);
begin
inherited
Create;
X:=nX;
Y:=nY;
end;
procedure TObj.Kresli(Canvas:
TCanvas);
begin
Canvas.Brush.Color:=clRed;
Canvas.Ellipse(X-10, Y-10, X+10, Y+10);
end;
procedure TObj.Pohni;
begin
X:=X+Random(3)-1;
Y:=Y+Random(3)-1;
end;
Z definície vidíme, že:
- Položky X, Y sú definované v časti private,
a teda sú súkromné
- sú viditeľné iba pre metódy objektu a pri používaní objektu v inej programovej jednotke (unit) k nim nemáme
prístup.
- Pri konštrukcii objektu musíme uviesť dva parametre - napríklad, TObj.Create(100, 50).
- Metóda Kresli je virtuálna, čiže neskôr plánujeme využívať polymorfizmus.
Používanie objektov
Ukážka vytvorenia, nakreslenia a zrušenia objektu. Kreslíme do komponentu
Image1:
procedure TForm1.FormCreate(Sender:
TObject);
var
O: TObj;
begin
O:=TObj.Create(100, 50);
O.Kresli(Image1.Canvas);
O.Free;
end;
V nasledujúcej ukážke pracujeme s veľkým počtom objektov, ktoré si evidujeme v dynamickom poli.
Navyše objekty rozhýbeme a kreslíme
pri tiknutí časovača:
var
A: array
of TObj;
procedure TForm1.Image1MouseDown(Sender: TObject; Button:
TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
SetLength(A, Length(A)+1);
A[Length(A)-1]:=TObj.Create(X, Y);
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
I: Integer;
begin
for I:=0
to Length(A)-1
do A[I].Pohni;
Image1.Canvas.Brush.Color:=clWhite;
Image1.Canvas.FillRect(Image1.ClientRect);
for I:=0
to Length(A)-1
do A[I].Kresli(Image1.Canvas);
end;
procedure TForm1.FormDestroy(Sender: TObject);
var
I: Integer;
begin
for I:=0
to Length(A)-1
do A[I].Free;
end;
Vidíme, že sa snažíme oddeliť výpočtový algoritmus (napríklad, pre zmenu polohy) od algoritmu pre kreslenie objektu.
Dedičnosť
Od triedy TObj odvodíme
novú objektovú triedu TNovyObj:
type
TNovyObj=class(TObj)
public
procedure
Kresli(Canvas: TCanvas);
override;
end;
procedure TNovyObj.Kresli(Canvas:
TCanvas);
begin
Canvas.Brush.Color:=clBlue;
Canvas.Rectangle(X-10, Y-10, X+10, Y+10);
end;
Prvky poľa A môžu byť objekty triedy
TObj aj TNovyObj. Vďaka polymorfizmu pracujeme s prvkami poľa pracujeme
rovnako, ako doposiaľ (nemusíme meniť volanie pre nakreslenie objektov). Pri stlačení pravého tlačidla myši iba pridáme príkaz, ktorým
sa vytvorí nový
objekt triedy TNovyObj:
procedure TForm1.Image1MouseDown(Sender:
TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
SetLength(A, Length(A)+1);
if Button=mbLeft
then A[Length(A)-1]:=TObj.Create(X,
Y)
else
A[Length(A)-1]:=TNovyObj.Create(X, Y);
end;
Zhrnutie
Zopakovali sme:
- Základné algoritmy - pre kreslenie, cyklus, animovanie.
- Objektovo-orientované programovanie - používanie objektov, definovanie tried,
odvodzovanie tried, virtuálne metódy a polymorfizmus.
- Dynamické polia, časovač.
© 2015 Ľ. SALANCI