Index

Datentypen (12)


Objekt-Typ

4. Geometrie-Beispiel als PASCAL-Programm (Delphi)

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