|
2. Polymorfizmus |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
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 |
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; |
Vysvetlenia:
© 2005 Ľubomír SALANCI