2. Polymorfizmus
Domovská stránka Programovanie v C++ OOP a Windows Ročníkový projekt Princípy počítačov Princípy databáz Všeličo Kontakt

 

Na prednáške:


Odvodenie triedy

Vytvoríme potomka triedy TGrTree:

unit Kostra;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics,
  Tree, GrTree;

type
  TKostra=class(TGrTree)
  protected
    procedure DoCalculate; override;
  end;

implementation

// TKostra:
// TKostra - protected:

procedure TKostra.DoCalculate;
begin
if not (Parent is TGrTree) then Exit;
X:=(7*X+TGrTree(Parent).X+dX) div 8;
Y:=(7*Y+TGrTree(Parent).Y+dY) div 8;
end;

end.
 

type
  TRubberSkelet=class(TSkelet)
  private
    FIsXY: Boolean;
    FRatio: Real;
  protected
    procedure DoStep; override;
  public
    constructor Create(Parent: TSkelet; dX, dY: Integer; Ratio: Real);
    property Ratio: Real read FRatio write FRatio;
  end;

constructor TRubberSkelet.Create(Parent: TSkelet; dX, dY: Integer; Ratio: Real);
begin
  inherited Create(Parent, dX, dY);
  FRatio:=Ratio;
end;

procedure TRubberSkelet.DoStep;
begin
  if Parent=nil then inherited
  else
    if not FIsXY then begin
      inherited;
      FIsXY:=True;
    end else begin
      X:=Round((1-Ratio)*X+Ratio*(Parent.X+dX));
      Y:=Round((1-Ratio)*Y+Ratio*(Parent.Y+dY));
    end;
end;

program s ukážkou

Ukážka vytvorenia objektov:
  Hlava:=TSkelet.Create(nil, Image1.Width/2, Image1.Height/7);
  Krk:=TRubberSkelet.Create(Hlava, 0, 10, 0.5);


Potomkovia komponentov

Vytvoríme farebné tlačidlo ako potomka triedy TCustomPanel. TCustomPanel je predchodca triedy TPanel. TCustomPanel má viaceré vlastnosti s prístupovými právami protected:

type
  TColorButton=class(TCustomPanel)
  private
    FIsDown: Boolean;
    procedure SetIsDown(IsDown: Boolean);
  public
    property Color;
    property IsDown: Boolean read FIsDown write SetIsDown;
    property OnClick;
  end;

procedure TColorButton.SetIsDown(IsDown: Boolean);
begin
  if FIsDown=IsDown then Exit;
  FIsDown:=IsDown;
  if not IsDown then BevelOuter:=bvRaised
  else BevelOuter:=bvLowered;
end;

TColorButton zdedil chránenú (protected) vlastnosť Color a udalosť OnClick. Ak chceme používateľovi umožniť modifikovanie vlastností, zverejníme ich názvy v časti public. Toto je špeciálne správanie sa vlastností - pre metódy takéto jednoduché zverejňovanie nefunguje.

Budeme používať viacero farebných tlačidiel, takže ich vytvoríme a nastavíme počas behu programu:

procedure TForm1.FormCreate(Sender: TObject);
var
  B: TColorButton;
  X: Integer;
begin
  X:=0;
  while X+64<ClientWidth do begin
    B:=TColorButton.Create(Self);
    B.Parent:=Self;
    B.SetBounds(X, ClientHeight-16, 64, 16);
    B.Color:=RGB(Random(256), Random(256), Random(256));
    B.OnClick:=PanelClick;
    X:=X+64;
  end;
end;

Vysvetlenie:

O zrušenie objektov sa postará rodič - formulár.

procedure TForm1.PanelClick(Sender: TObject);
var
  C: TControl;
  I: Integer;
begin
  for I:=0 to ControlCount-1 do begin
    C:=Controls[I];
    if C is TColorButton then TColorButton(C).IsDown:=C=Sender;
  end;
  Image1.Canvas.Brush.Color:=TColorButton(Sender).Color;
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
var
  I, XX, YY: Integer;
begin
  if not (ssLeft in Shift) then Exit;
  for I:=1 to 10 do begin
    XX:=X+Random(11)-5;
    YY:=Y+Random(11)-5;
    Image1.Canvas.Ellipse(XX-3, YY-3, XX+3, YY+3);
  end;
end;

celý program

Vysvetlenia:

© 2005 Ľubomír SALANCI