Die Grundlage ist in diesem Fall der geometrische Punkt.
Dieser greift jedoch bereits auf ein (abstraktes) Objekt Ort zurück, den Typ TOrt, der die Koordinaten verwaltet. Ein Punkt verfügt dann über weitere Attribute wie z.B. eine Farbe. Ein weiteres könnte beispielsweise sein ob der Punkt auf der Zeichenfläche dargestellt ist, also etwa Sichtbar.
Der Objekttyp TPunkt benötigt dann Methoden wie sich anzuzeigen. Dies übernimmt die Prozedur zeige. Da diese in abgeleiteten Objekten überschrieben wird, und das erst zur Laufzeit, wird sie virtuell deklariert. Dabei entscheidet sich erst zur Laufzeit, welche zeige-Methode aufgerufen wird. Dies ist nötig für die Methode verschiebe, die auf beliebige Objekte anwendbar sein soll.
Abgeleitete Objekte sind schließlich im Beispiel der Kreis, dessen Typ TKreis zusätzlich das Attribut Radius erhält, bzw. das Quadrat, dessen Seiten parallel zu den Fensterbegrenzungen liegen und dessen Typ TQuadrat ein zusätzliches Attribut Seite erhält.
unit uGeometrie;
interface
uses Graphics,Unit1;
type
TOrt = class(TObject)
private
X,Y : integer;
public
constructor create(x,y: integer);
procedure setX(x: integer);
procedure setY(y: integer);
function getX(): integer;
function getY(): integer;
end;
TPunkt = class(TOrt)
private
Farbe : TColor;
public
constructor create(x,y: integer; f:TColor);
procedure zeige(); virtual;
procedure zeichne();
procedure loesche();
procedure verschiebe(DeltaX, DeltaY: integer);
procedure setColor(f : TColor);
end;
TKreis = class(TPunkt)
private
Radius : integer;
public
constructor create(x,y: integer; f:TColor; r: integer);
procedure zeige(); override;
end;
TQuadrat = class(TPunkt)
private
Seite : integer;
public
constructor create(x,y: integer; f:TColor; s: integer);
procedure zeige(); override;
end;
implementation
constructor TOrt.create(x,y: integer);
begin
self.X := x;
self.Y := y;
end;
procedure TOrt.setX(x: integer);
begin
self.X := x;
end;
procedure TOrt.setY(y: integer);
begin
self.Y := y;
end;
function TOrt.getX(): integer;
begin
getX := X;
end;
function TOrt.getY(): integer;
begin
getY := Y;
end;
constructor TPunkt.create(x,y: integer; f:TColor);
begin
inherited create(x,y);
Farbe := f;
end;
procedure TPunkt.zeige();
begin
FAnwendung.Image1.Canvas.Rectangle(x-1,y-1,x+1,y+1);
end;
procedure TPunkt.zeichne();
begin
FAnwendung.Image1.Canvas.Pen.Color:=Farbe;
zeige;
end;
procedure TPunkt.loesche();
begin
FAnwendung.Image1.Canvas.Pen.Color:=clWhite;
zeige;
end;
procedure TPunkt.verschiebe(DeltaX, DeltaY: integer);
begin
loesche;
setX(getX + DeltaX);
setY(getY + DeltaY);
zeichne;
end;
procedure TPunkt.setColor(f : TColor);
begin
Farbe := f;
end;
constructor TKreis.create(x,y: integer; f:TColor; r: integer);
begin
inherited create(x,y,f) ;
self.Radius := r;
end;
procedure TKreis.zeige();
begin
FAnwendung.Image1.Canvas.Ellipse(X-Radius div 2,Y-Radius div 2,X+Radius div 2,Y+Radius div 2);
end;
constructor TQuadrat.create(x,y: integer; f:TColor; s: integer);
begin
inherited create(x,y,f) ;
self.Seite := s;
end;
procedure TQuadrat.zeige();
begin
FAnwendung.Image1.Canvas.Rectangle(X-Seite div 2,Y-Seite div 2,X+Seite div 2,Y+Seite div 2);
end;
end.
In der Anwendungs-Unit (GUI) wurden z.B. folgende Anweisungen ausgeführt:
uses uGeometrie;
{$R *.DFM}
var
PunktA, PunktB, PunktC : TPunkt;
Kreis : TKreis;
Quadrat : TQuadrat;
procedure TGeometrieGUI.buStartClick(Sender: TObject);
begin
PunktA := TPunkt.create(30,100,clred);
PunktB := TPunkt.create(50,80,clblue);
PunktC := TPunkt.create(70,100,clgreen);
Kreis := TKreis.create(200,200,clred,100);
Quadrat := TQuadrat.create(200,50,clblue,150);
PunktA.zeichne();
PunktB.zeichne();
PunktC.zeichne();
Kreis.zeichne();
Quadrat.zeichne();
end;
procedure TGeometrieGUI.buVerschiebeClick(Sender: TObject);
begin
Kreis.verschiebe(-100,-50);
PunktA.verschiebe(0,80);
Quadrat.verschiebe(50,60);
end;
[Index] [Zurück/Objekttyp-UML]
Autor: Jürgen Dehmer
Letzte Änderung: 27. April 2003