Domovská stránka Programovanie v C++ Kontakt
  1. Opakovanie

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:

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:

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:

© 2015 Ľ. SALANCI