Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

85
Vererbung Helmut Paulus Speyer, 7./8.11.2006

Transcript of Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

Page 1: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

Vererbung

Helmut Paulus

Speyer, 7./8.11.2006

Page 2: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

2

OO

P:

Vere

rbu

ng

Teil 1

Grafik mit Delphi

Page 3: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

3

OO

P:

Vere

rbu

ng

Zeichenfläche TCanvas

Canvas-Objekte dienen als Zeichenfläche für grafische Elemente.

Sie kapseln eine Vielzahl von Methoden zur Ausgabe von Grafik und Text in einem rechteckigen

Bereich.

TCanvas

moveto(x,y : integer);

lineto(x, y : integer);

ellipse(x1,y1,x2,y2 : integer)

rectangle(x1,y1,x2,y2 : integer)

polygon(p : array of Tpoint);

TextOut(x, y: Integer; const Text: string);...

Brush : TBrush

Pen : TPen

Font : TFont...

Pinsel – Füllfarbe, Muster ... Stift – Linienfarbe, Stil ...

Schriftart – Farbe, Schrifttyp ...

Der Koordinatenursprung (0,0) ist in der linken oberen Ecke einer Komponenten, die ein Canvas-Objekt zur Verfügung stellen.

TCanvas-Werkzeuge Pen, Brush und Font, zuständig für bestimmte Teilaufgaben:

Page 4: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

4

OO

P:

Vere

rbu

ng

Wie erhält man ein TCanvas-Objekt?

TCanvas-Objekte werden von einigen Delphi-Komponenten als Property zur Verfügung gestellt: z. B.:

Formular, Paintbox, Image, Bitmap

Der Koordinatenursprung ist die linke obere Ecke der jeweiligen Komponente.

Die positive y-Achse zeigt nach unten.

Die Image-Komponente speichert die Graphik zusätzlich in einer Hintergrundbitmap, so dass das Bild automatisch anzeigt wird, wenn das Formularfenster, nachdem es verdeckt war, wieder in den Vordergrund geholt wird.

Das Formular und Paintbox zeichnen das Bild nur einmalig. Damit es nach dem Verdecken wieder erscheint, muss das Zeichnen der Graphik in der OnPaint-Ereignismethode der jeweiligen Komponente erfolgen. Dieses Ereignis wird vom Betriebssystem automatisch ausgelöst.

Der Koordinatenursprung ist die linke obere Ecke der jeweiligen Komponente.

Die positive y-Achse zeigt nach unten.

Die Image-Komponente speichert die Graphik zusätzlich in einer Hintergrundbitmap, so dass das Bild automatisch anzeigt wird, wenn das Formularfenster, nachdem es verdeckt war, wieder in den Vordergrund geholt wird.

Das Formular und Paintbox zeichnen das Bild nur einmalig. Damit es nach dem Verdecken wieder erscheint, muss das Zeichnen der Graphik in der OnPaint-Ereignismethode der jeweiligen Komponente erfolgen. Dieses Ereignis wird vom Betriebssystem automatisch ausgelöst.

Page 5: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

5

OO

P:

Vere

rbu

ng

Objekthierarchie

Das Bild-Objekt Bild vom Typ TImage verwaltet über das Attribut Canvas ein Leinwand-Objekt der Klasse TCanvas, das wiederum ein Zeichenstift-Objekt der Klasse TPen und ein Malpinsel-Objekt der Klasse TBrush verwaltet.

Die entsprechenden Attribute Pen und Brush werden als Property zur Verfügung gestellt.

Beispiel: Blaues Rechteck

Bild.Canvas.Brush.Color := clbue;

Bild.canvas.rectangle(10,10,100,20);

Beispiel: Blaues Rechteck

Bild.Canvas.Brush.Color := clbue;

Bild.canvas.rectangle(10,10,100,20);

Pinselfarbe blau

Rechteck mit der linken oberen Ecke am Punkt (X1, Y1) und der rechten unteren Ecke am Punkt (X2, Y2).

Page 6: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

6

OO

P:

Vere

rbu

ng

Aufgaben 1

1. Testen Sie das Beispielprogramm Grafiktest

2. Variieren Sie verschiedene Modi der Pinsel und StifteTesten Sie insbesondere den NotXOR-Füllmodus

3. Das Programm soll wie folgt verbessert werden:• Nach Wahl Kreise, Rechtecke oder Polygone

zeichnen • Position und Größe der Figur interaktiv durch

Mausklicks bestimmen- Kreis: Kreismittelpunkt und Radius- Rechteck/Polygon: Eckpunkte

Page 7: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

7

OO

P:

Vere

rbu

ng

Zustandsbasierte Ablaufmodellierung

Alter Zustand

Auslösende Aktion

Ausgelöste Aktion Neuer Zustand

Z0 AuswahlBoxClick Punktefeld inizialisieren Z1

Z1 FormMausDown

Punkt speichern

[letzter Punkt] Figur zeichnen

Z1

Z0

Ablauf:

Figur auswählen

Punkte bestimmen

Figur zeichnen

Z0 BereitFür Auswahl der Figur

Z1 Figur gewähltfür Punktaufnahme aktiviert

Zustände:

Eine Figur soll erzeugt werden:

Page 8: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

8

OO

P:

Vere

rbu

ng

Zustandsbasierte Ablaufmodellierung

Zustandsautomat:

[nicht letzter Punkt]AuswahlBoxClickPunktearray inizialieren

Z1:Figur

gewählt

Z0:Berei

t

[letzter Punkt]

FormMouseDownFigur zeichnen

FormMouseDownPunkt aufnehmen

Steuerung durch Ereignismethoden:

AuswahlBoxClick : Figurtyp wählen

FormMouseDown : Punkte speichern bis alle Punkte aufgenommen

Steuerung durch Ereignismethoden:

AuswahlBoxClick : Figurtyp wählen

FormMouseDown : Punkte speichern bis alle Punkte aufgenommen

Page 9: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

9

OO

P:

Vere

rbu

ng

Zustandsbasierte Modellierung

Ein Zustandsdiagramm ist immer genau einer Klasse zugeordnet. Es beschreibt das dynamische Verhalten der Objekte.

In einem Zustandsdiagramm wird festgehalten:

• auf welche interne und externe Ereignisse ein Objekt reagiert,

• wie ein Objekt reagiert und welche Aktivitäten ausgelöst werden, wenn es sich in einem bestimmten Zustand befindet,

• in welchen Folgezustand ein Objekt übergeht als Reaktion auf ein Ereignis.

In einem Zustandsdiagramm wird festgehalten:

• auf welche interne und externe Ereignisse ein Objekt reagiert,

• wie ein Objekt reagiert und welche Aktivitäten ausgelöst werden, wenn es sich in einem bestimmten Zustand befindet,

• in welchen Folgezustand ein Objekt übergeht als Reaktion auf ein Ereignis.

Zustandsbasierte Modellierung ist bei der Entwicklung von Systemen immer dann sinnvoll, wenn das Verhalten eines Systems nicht nur von äußeren Eingaben oder Ereignissen abhängt, sondern auch von inneren Zuständen, die das System in Abhängigkeit von den Eingaben bzw. Ereignissen durchläuft.

Je nach Zustand kann ein Objekt anders auf dasselbe Ereignis reagieren.

Page 10: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

10

OO

P:

Vere

rbu

ng

Implementierung

type

TZustand = (z0,z1);

TGUI = class(TForm)

procedure AuswahlBoxClick(Sender: TObject);

procedure FormMouseDown(... X, Y: Integer);

private

{ Private-Deklarationen}

Zustand : TZustand;

NMax : integer;

Punkte : array of TPoint;

procedure zeichneFigur;

public

{ Public-Deklarationen}

end;

Anzahl der EckpunkteDynamischer Array als Liste der Eckpunkte

Zustandsvariable

Typ der Zustandsvariablen mit den Konstanten z0, z1

Die gewählten Punkte werden gespeichert. Sind alle für die Figur notwendigen Punkte bestimmt, wird sie gezeichnet.

Page 11: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

11

OO

P:

Vere

rbu

ng

Implementierung

procedure TGUI.AuswahlBoxClick(...);

begin

if Zustand = z0 then

begin

case AusWahlBox.ItemIndex of

0,1 : NMax := 2;

2 : NMax := einlesen

end;

zustand := z1;

end;

end;

Figur auswählen im Zustand Z0

Procedure TGUI.FormMouseDown(...,X,Y:Integer);

Var nr : integer;

begin

if Zustand = z1 then

begin // neuen Punkt dem Array hinzufügen

nr := length(Punkte); //Punktzahl feststellen

setLength(Punkte,nr+1); //Arraylänge erhöhen

Punkte[nr] := Point(x,y); //Punkte zuweisen

if nr = NMax-1 then // letzter Punkt?

begin zeichneFigur;

//Zustand z0 wiederherstellen

Punkte := nil; //Punkte löschen

Auswahlbox.ItemIndex := -1;

Zustand := z0; end; end;

end;

Punkte speichern im Zustand Z1

Page 12: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

12

OO

P:

Vere

rbu

ngTeil 2

Projekt Minigolf

Page 13: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

13

OO

P:

Vere

rbu

ng

Minigolfanlage

Start

Ziel

Ziel: Ball ins Loch schlagen

Page 14: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

14

OO

P:

Vere

rbu

ng

Modellierung der Animation

Benutzer klickt aufs Spielfeld Ball rollt schrittweise in Richtung der Verbindungslinie Maus –

Ballmitte Bei jedem Schritt wird seine Geschwindigkeit geringer

Spielende, wenn Zielpunkt erreicht

Lösung:

- Animationsschritte – timergesteuert (Ereignis: OnTimer)

- Vermeidung von Flimmern durch Doppelte Pufferung

Idee:

Doppelte Pufferung – Double Buffering:• Zusätzlich zum Bild auf dem Monitor wird noch ein Bild im Hintergrund

gehalten.Hierzu wird ein zweites Canvas-Objekt für das Bild im Speicher benötigt.

• Alle graphischen Ausgaben erfolgen zunächst im Speicherbild; anschließend wird dieses auf dem Monitor ausgegeben.

Doppelte Pufferung – Double Buffering:• Zusätzlich zum Bild auf dem Monitor wird noch ein Bild im Hintergrund

gehalten.Hierzu wird ein zweites Canvas-Objekt für das Bild im Speicher benötigt.

• Alle graphischen Ausgaben erfolgen zunächst im Speicherbild; anschließend wird dieses auf dem Monitor ausgegeben.

Page 15: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

15

OO

P:

Vere

rbu

ng

OOA: Analyse

GUI

Puffer

Ball

KZiel

KStart

Bitmap-Objekt

Formular

Kreisobjekte

Fachkonzept

GUI-Schicht

Steuerung

Timer Animator

Spielfeld Image-Komponente

Page 16: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

16

OO

P:

Vere

rbu

ng

Beziehungen

TBall

TForm

TImage

TKreis

TCanvas

TGUI1

benutzt

benutzt

ist ein

2 1

TTimer

Fachkonzept

GUI-Schicht

TBitmap1

Page 17: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

17

OO

P:

Vere

rbu

ng

Modellierung der Klassen

TKreis

xPos, yPos //Mittelpunkt

FFarbe, FRadCanvas //Ref. auf Zeichenfläche

createpaintmoveto // an neue Position

TBall

vx //Geschw. in x - Richtungvy //Geschw. in y – RichtungZustand (liegt,rollt)

rolle //verschieben um vx,vysetVgetAbsVgetZustandsetZustand

ist ein

KZielKStart Ball

instance of

Klassen:

Objekte:

instance of

Page 18: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

18

OO

P:

Vere

rbu

ng

Implementierung der Klasse „TKreis“

procedure TKreis.paint;var x1,y1,x2,y2 : integer;begin //umgebendes Rechteck x1 := xPos-Frad; y1 := yPos-Frad;

x2 := xPos+Frad; y2 := yPos+Frad;

with canvas do begin

Pen.Mode := pmNotXor;

Pen.Color := clblack;

brush.color:= FFarbe;

ellipse(x1,y1,x2,y2); end;end;

constructor TKreis.create(CanRef : TCanvas; x,y : integer);begin

xPos := x; yPos := y; canvas := CanRef;// Anbindung an GUIend;

TKreis

- xPos : integer- yPos : integer- FRad : integer

- FFarbe : TColor

- Canvas : TCanvas

+ Create(CanRef : TCanvas; x,y : integer)

+ paint+ moveto(x,y : integer)+ setAttribute(r : integer; f : TColor)

Zeichnen im NotXOR-Modus ermöglicht Löschen der Figur

- nicht bei Doppelter Pufferung

Page 19: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

19

OO

P:

Vere

rbu

ng

Implementierung der Klasse „TKreis“

procedure TKreis.setAttribute(r : integer;f : TColor);

begin

//paint; //zum Löschen

FRad := r;

FFarbe := f;

//paint; //zum Löschen

end;;

procedure TKreis.moveto(x,y : integer);begin

//paint; //zum Löschen xPos := x;

yPos := y;

//paint;//erneut zeichnen

end;

TKreis

- xPos : integer- yPos : integer- FRad : integer

- FFarbe : TColor

- Canvas : TCanvas

+ Create(CanRef : TCanvas; x,y : integer)

+ paint+ moveto(x,y : integer)+ setAttribute(r : integer; f : TColor)

Page 20: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

20

OO

P:

Vere

rbu

ng

Implementierung der Klasse „TBall“

type

TZustand = (liegt, rollt);

TBall = class(TKreis) //abgeleitet von TKreis

private

vx,vy : double;

Zustand : TZustand;

public

procedure rolle;

procedure setV(x, y : double);

function getAbsV : double;

function getVx : double;

function getVy : double;

function getZustand : TZustand;

procedure setZustand(z : TZustand);

end;

Vererbung:

• Die Klasse TKreis wird erweitert; dabei werden die Attribute und Operationen an die abgeleitete Klasse weitergegeben.

Vererbung:

• Die Klasse TKreis wird erweitert; dabei werden die Attribute und Operationen an die abgeleitete Klasse weitergegeben.

TBall

- vx : double- vy : double;- Zustand: TZustand

+ rolle;+ setV(x, y : double);+ getV : double;+ getZustand : TZustand+ getZustand

TKreis

ist ein

Page 21: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

21

OO

P:

Vere

rbu

ng

Implementierung der Klasse „TBall“

procedure TBall.setV(x, y : double);

begin

vx := x; vy := y;

if getAbsV > 0.5 then Zustand := rollt

else Zustand := liegt;

end;

function TBall.getAbsV : double;

begin

result := sqrt(vx*vx + vy*vy);

end;

procedure TBall.rolle;

begin

if Zustand = rollt then

begin

xPos := round(xPos + vx); yPos := round(yPos + vy);

setV(0.8*vx, 0.8*vy);

end;end;

TBall

- vx : double- vy : double;- Zustand : TZustand

+ rolle;+ setV(x, y : double);+ getAbsV : double;+ getZustand : TZustand+ getZustand

TKreis

ist ein

Page 22: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

22

OO

P:

Vere

rbu

ng

Modellierung des Ballabschlags

Der liegende Ball, wird er durch Mausklick (x,y) abgeschlagen.

Der Abschlag erfolgt in Richtung des Verbindungslinie Mauspunkt Ballmitte.

vx

V

vy

Mausklick:

Ball abschlagen

Geschwindigkeitsvektor:

vx = Ball.getx – x

vy = Ball.gety – y

Geschwindigkeitsvektor:

vx = Ball.getx – x

vy = Ball.gety – yAnimation-OnTimer:

Ball.rolle wird in der Ereignismethode der Timerkomponente ständig ausgerufen.

Die Position wird neu berechnet und die Geschwindigkeit verringert.

Eine Zustandsänderung (liegt) erfolgt, wenn sie zu klein wird.

(x,y)

Page 23: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

23

OO

P:

Vere

rbu

ng

Ball: Zustandsdiagramm

Alter Zustand

Auslösende Aktion

Ausgelöste Aktion Neuer Zustand

liegt

SpielfeldMouseDown

Ball.setV(vx,vy) rollt

BtnStartPosClickStartposition einnehmen

liegt

Animiere Ball.rolle liegt

rollt

Animiere

[Im Ziel][außerhalb]

Ball.rolle -> Bewegung[|v| > 0,5]/[|v| < 0,5]

rollt/liegtliegt liegt

Zustände des Balls

liegt

v = 0

rollt |v| > 0,5

[|v| > 0,5]

SpielFeldMouseDownsetV(vx,vy)

rolltlieg

t

[|v|< 0,5] v [im Ziel] v [außerhalb]

animiererolle

animiereRolle

animiererolle

Page 24: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

24

OO

P:

Vere

rbu

ng

Modellierung des Spielablaufs

Spielphasen:

Sp0 Bahn vorbereitet

Sp1 Bahn wird bespielt

Sp2 Bahn beendet

Sp3 Spiel beendet

SpU unterbrochen

Anforderungen:

• Bei Spielbeginn Ball auf Startposition

• Kein Abschlag, wenn Ball im Loch oder außerhalb des Spielfeldes

• Bahn/Spiel zu Ende, wenn Ball im Loch

Alter Zustand

Auslösende Aktion

Ausgelöste AktionenNeuer Zustand

Sp0

SpUBtnStartPosClick

Ball auf StartpunktBall.setZustand(liegt)Punkte auf 0

Sp1

Ball auf StartpunktStrafpunkte

Sp1

Sp1SpielFeldMouseDown

Ball.setV, Punkte erhöhen Sp1

Sp1 Animiere

Ball.rolle[Eingelocht][außerhalb] [im Locht&[alle Bahnen]

Sp1Sp0 (Sp2)SpU (Sp3)

Sp2 BtnNextBahn Bahn aufbauen/Ball auf Bahn Sp0

Page 25: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

25

OO

P:

Vere

rbu

ng

Zustandsdiagramm

BtnStartPosClickBall an Start Sp1

Sp0

BtnStartPosClickBall an StartStrafpunkte

SpielFeldMouseDown

Ball.setV(vx,vy)animiere

[außerhalb]

In der einfachen Version (nur eine Spielbahn) entfallen die Zustände Sp2 und Sp3

Spielablauf:

SpU

animiere[eingelocht]

BtnNextBahnBahn aufbauenBall auf Bahn

Sp2 Sp3

animiere[eingelocht

& alle Bahnen]

animiere

Page 26: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

26

OO

P:

Vere

rbu

ng

Doppelte Pufferung

1. Zeichnen im Hintergrund:

Puffer.canvas.ellipse(...);

2. Hintergrundbild ins Spielfeld kopieren:

Spielfeld.canvas.draw(0,0,Puffer)

Spielfeld.canvas

Puffer.canvas

Graphikausgabe in zwei Schritten:

Hintergrundbil

d

Puffer : TBitmap

Monitorbild

Spielfeld : TImage

Bei der Animation von bewegten Objekten wird das Hinter-grundbild vor jeder Änderung gelöscht, indem die Zeichen-fläche mit der Hintergrundfarbe gefüllt wird:

Puffer.Canvas.fillRect(...);

Bei der Animation von bewegten Objekten wird das Hinter-grundbild vor jeder Änderung gelöscht, indem die Zeichen-fläche mit der Hintergrundfarbe gefüllt wird:

Puffer.Canvas.fillRect(...);

Page 27: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

27

OO

P:

Vere

rbu

ng var

Puffer : TBitmap; //enthält das Hintergrundbild

procedure TFenster.FormCreate( ... );

begin

Puffer := TBitmap.Create;

Puffer.Width := SpielFeld.Width;

Puffer.Height := SpielFeld.Height; ...

StartPkt := TKreis.create(Puffer.canvas,StartX,StartY);

ZielPkt := TKreis.create(Puffer.canvas,400,100);

Ball := TBall.create(Puffer.canvas,50,50); ...

end;

Implementierung: Doppelte Pufferung

Bitmap-Objekt erzeugen

Größe des Puffers anpassen

Zeichenfläche des Puffers an Graphik-Objekte übergeben

Idee: Alle Graphikausgaben erfolgen zunächst in ein Hintergrundbild, das dann als Ganzes in eine sichtbare Zeichenfläche kopiert wird.

Einrichten des Puffers (OnCreate)

Page 28: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

28

OO

P:

Vere

rbu

ng

procedure TFenster.zeichneSpielFeld;begin //altes Bild löschen (mit Hintergrundfarbe füllen)

Puffer.Canvas.Brush.Color := SpielFeld.Canvas.Brush.Color;

Puffer.Canvas.FillRect(rect(0,0,Puffer.width,Puffer.height));

//Graphische Objekte neu zeichnen im Hintergrund

StartPkt.paint;

ZielPkt.paint;

Ball.paint;

//Hintergrundbild in Zeichenfläche des Spielfeldes kopieren

SpielFeld.Canvas.Draw(0,0,Puffer);

end;

Implementierung: Doppelte Pufferung

Hintergrundbild aufbauen und auf dem Monitor ausgeben

Die Formular-Methode zeichneSpielfeld enthält alle Graphikbefehle. Sie wird nach jeder Aktualisierung eines Graphikobjekts aufgerufen.

Benutzt man das Canvas-Objekt des Formulars als Monitorzeichenfläche, so kann das Zeichnen durch das OnPaint-Ereignis des Formulars ausgelöst werden.

Die Formular-Methode zeichneSpielfeld enthält alle Graphikbefehle. Sie wird nach jeder Aktualisierung eines Graphikobjekts aufgerufen.

Benutzt man das Canvas-Objekt des Formulars als Monitorzeichenfläche, so kann das Zeichnen durch das OnPaint-Ereignis des Formulars ausgelöst werden.

Page 29: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

29

OO

P:

Vere

rbu

ng

Aufgaben 2

1. Programm Minigolf testen.

2. Programm so erweitern, dass Spielstände angezeigt werden.- pro Schlag ein Punkt- 2 Strafpunkte, wenn Ball von außerhalb zurückgeholt wird

3. Reflexion an den Rändern des Spielfeldes

4. Entwicklung eines magischen Feldes (Objekt), das den Ball vom Spielfeld schleudert, sobald er es betritt.

Page 30: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

30

OO

P:

Vere

rbu

ngTeil 3

Modellierung grafischer Objekte

Page 31: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

31

OO

P:

Vere

rbu

ng

Anwendungsbeispiel

Aktivitäten: verschieben, drehen, skalieren, editieren

Page 32: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

32

OO

P:

Vere

rbu

ng

Anforderungen

• Erzeugung und Verwaltung von grafischen Objekten unter-schiedlicher Form

• Fähigkeiten der Objekte- frei verschiebbar (Maus)- skalierbar- drehbar

Page 33: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

33

OO

P:

Vere

rbu

ng

Erste OOA-Analyse

Problem: Vielfalt der Objekte

Optimierung: Entwicklung einer Klassenhierarchie

TKreis

TRechteck

TParallel

TQuadrat

TDreieck

TText

...

Page 34: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

34

OO

P:

Vere

rbu

ng

Klassenhierarchie

TGrafikElement

TKreis TPolygon TTextTLinie

TRegNEck

TRechteck

TParallel

Page 35: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

35

OO

P:

Vere

rbu

ng

Klassenhierarchie

Optimierung der Klassen durch Entwicklung einer Vererbungsstruktur

Ziele:

• Der gemeinsame Kern aller Elemente wird in einer Basisklasse modelliert.

• Spezialisierte Klassen werden von der Basisklasse abgeleitet;sie fügen spezielle Attribute und Operationen hinzu oder definieren bestimmte Dinge neu.

Page 36: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

36

OO

P:

Vere

rbu

ng

Klassenhierarchie

Vorteile:

Durch Vererbung werden alle gemeinsamen Eigenschaften und Operationen an abgeleitete Klassen weitergegeben:

Grundlegende Attribute und Operationen werden nur einmal entwickelt

Möglichkeit zur Anpassung und Erweiterung unter geringem Aufwand (Wiederverwendbarkeit)

Einheitlicher Zugriff auf verschiedene Objekttypen wird möglich(Polymorphismus)

Page 37: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

37

OO

P:

Vere

rbu

ng

Einfaches Beispiel

Kreise und Rechtecke

Page 38: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

38

OO

P:

Vere

rbu

ng

Kreise und Rechtecke

TKreis

xPos, yPos //Mittelpunkte

FFarbe // Füllfarbe

Canvas //Zeichenflächenref.

Markiert // Markierungsflag

FRad //Radius

CreatepaintMoveto // verschiebenskalieren //vergrößern

TRechteck

xPos, yPos //Mittelpunkte

FFarbe // Füllfarbe

Canvas //Zeichenflächenref.

Markiert // Markierungsflag

FBreite, FLaenge

Create paintMoveto // verschiebenskalieren //vergrößern

Beide Klassen besitzen gleiche Attribute und Methoden gleicher Funktionalität.

Das Gemeinsame muss nicht mehrmals implementiert werden!

Page 39: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

39

OO

P:

Vere

rbu

ng

Erste Modellierung der Klassen

TKreis

FRad //Radius

paintskalieren //vergrößern

TRechteck

FBreite, FLaenge

paint skalieren //vergrößern

Basisklasse

abgeleitete Klassen

(Unterklasse)

Generalisierung

Spezialisierung

Die Basisklasse enthält den gemeinsamen Kern aller grafischen Objektklassen.

TGrafikElement

xPos, yPos //Mittelpunkte

FFarbe // Füllfarbe

Canvas //Zeichenflächenref.

Markiert // Markierungsflag

Create //BasiskonstruktorMoveto // verschieben

ist ein ist ein

Page 40: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

40

OO

P:

Vere

rbu

ng

Implementierung der Basisklasse

TGrafikElement

- xPos : integer- yPos : integer

- FFarbe : TColor

- Fmarkiert : boolean

- Canvas : TCanvas

+ Create(CanRef : TCanvas; x, y : integer)+ moveto(x, y : integer);

+ getX : integer+ getY : integer

TGrafikElement = class

private

xPos : integer;

yPos : integer;

FFarbe : TColor;

Fmarkiert : boolean;

Canvas : TCanvas;

public

constructor create(CanRef : TCanvas; x,y : integer);

procedure moveto(x,y : integer);

function getX : integer;

function getY : integer;

getFarbe Farbe : Tcolor;

procedure setFarbe(wert : TColor);

end;

Page 41: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

41

OO

P:

Vere

rbu

ng

Implementierung der Basisklasse

constructor TGrafikElement.create(CanRef : TCanvas; x,y : integer);

begin

xPos := x;

yPos := y;

canvas := CanRef;

End;

TGrafikElement

- xPos : integer- yPos : integer

- FFarbe : TColor

- Fmarkiert : boolean

- Canvas : TCanvas

+ Create(CanRef : TCanvas; x, y : integer)

+ getX : integer+ getY : integer Die Objekte erhalten eine Referenz auf das

Zeichenflächenobjekt des GUI-Objekts

procedure TGrafikElement.moveto(x,y : integer);

begin

xPos := x;

yPos := y;

end;

Page 42: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

42

OO

P:

Vere

rbu

ng

„Ist ein“ - Beziehung

Die Unterklassen beschreiben nur die Abweichungen von von der Oberklasse. Alles andere kann wiederverwendet werden, weil es in der Oberklasse vorliegt.

Die Methoden und Attribute der Oberklasse bilden eine Teilmenge der Methoden und Attribute der Unterklasse.

Ein Objekt der Unterklasse hat somit ein Objekt der Oberklasse als Teilobjekt.

Umgekehrt sind alle Objekte der Unterklasse eine Teilmenge der Objekte der Oberklasse.

TGrafikElement

...

...

TKreis

- FRad : integer

- setRadius(wert : integer)

+ paint+ setAttribute( r : integer, f : TColor)

ist ein

Jeder Kreis ist ein GrafikElement

Konsequenz: Zuweisungskompatibilität

Einer Variablen vom Typ der Oberklasse kann eine Referenz auf ein Unterklassenobjekt zugewiesen werden.

Page 43: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

43

OO

P:

Vere

rbu

ng

Implementierung der Klasse „TKreis“

TKreis = class(TGrafikElement)

private

Frad : integer;

public

constructor create(CanRef : TCanvas; x,y : integer);

procedure paint;

procedure setAttribute(r : integer;f : TColor);

function getRadius : integer;

procedure setRadius(wert : integer);

end;

TGrafikElement

...

...

TKreis

-FRad : integer

-...

+ paint+ setAttribute( r : integer, f : TColor)+ getRadius : ineger

+ setRadius(wert : integer)

ist ein

Page 44: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

44

OO

P:

Vere

rbu

ng

Implementierung der Klasse „TKreis“

TGrafikElement

...

...

TKreis

- FRad : integer

- setRadius(wert : integer)

+ paint+ setAttribute( r : integer, f : TColor)

ist ein

constructor TKreis.create(CanRef : TCanvas; x,y : integer);

begin

inherited create(CanRef,x,y); //Konstruktor der Oberklasse

FRad := 10;

end;

Durch Aufruf des geerbten Konstruktors werden die Attribute des Basisobjekts initialisiert.Das abgeleitete Objekt enthält quasi ein Basisobjekt als Teilobjekt.

Page 45: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

45

OO

P:

Vere

rbu

ng

Implementierung der Klasse „TKreis“

TGrafikElement

...

...

TKreis

- FRad : integer

+ paint

+ setRadius(wert : integer)

+ setAttribute( r : integer, f : TColor)

ist ein

procedure TKreis.setAttribute(r : integer;f : TColor);

begin

FRad := r;

FFarbe := f;

end;

procedure TKreis.paint;var x1,y1,x2,y2 : integer;

begin //umgebendes Rechteck x1 := xPos-Frad; y1 := yPos-Frad;

x2 := xPos+Frad;

y2 := yPos+Frad;

with canvas do begin brush.color:= FFarbe; ellipse(x1,y1,x2,y2); end;end;

Page 46: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

46

OO

P:

Vere

rbu

ng

Vererbung und Zugriffrechte

Schutzebenen: public

keine Zugriffsbeschränkung nach außen private

Zugriff nur innerhalb einer Klasse protected

Zugriff auch in abgeleiteten Klassen möglich

Elemente einer Klasse können in der Klassendeklaration vor dem Zugriff von außen geschützt werden (Geheimnisprinzip).

Vererbung der Zugriffsrechte

Die Zugriffsrechte einer Klasse werden an abgeleitete Klassen vererbt.Schutzrechte können in einer abgeleiteten Klasse abgeschwächt, aber nicht verschärft werden.

Die Schutzebenen private und protected gelten allerdings nur für den Zugriff aus einer anderen Unit heraus.

Page 47: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

47

OO

P:

Vere

rbu

ng

Zuweisungskompatibilität

Konsequenz der „ist ein“ – Beziehung:

Einer Objektvariablen einer Oberklasse können Objekte aller

Unterklassen zugewiesen werden. Die Umkehrung gilt nicht.

Beispiel:

Var

Kreis : TKreis; Rechteck : TRechteck Grafik : TGrafikElement; ...

Kreis := TKreis.create(...); Rechteck := TRechteck.create(..);

...

Beachte:

Grafik ist eine Referenz auf den Teil des Kreisobjekts, der von TGrafikElement geerbt wird.

Möglich:Grafik := Kreis; Grafik.setFarbe(clred);Grafik := Rechteck;

Nicht möglich: Grafik.setAttribute(...)Grafik.setBreite(100);

Page 48: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

48

OO

P:

Vere

rbu

ng

is - Operator : Typprüfung (Laufzeit)

Beispiel:

Var

Figur : TGrafikElement;

Kreis : TKreis; ...

if Figur is TKreis then

TKreis(Figur).paint; Typumwandlung (type cast)

- liefert true , wenn das Objekt Figur eine Instanz der angegebenen

Klasse oder eines ihrer abgeleiteten Klassen ist

Operatoren „is“ und „as“

as - Operator : Typumwandlung (Laufzeit)

Beispiel:

Kreis := Figur as TKreis;

(Figur as TKreis).paint;

- liefert eine Referenz auf ein Objekt vom des Objektes Kreis

Page 49: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

49

OO

P:

Vere

rbu

ng

Statische Methoden

Kreis.paint; //paint - Methode des Kreisobjekts

Rechteck.paint; //paint - Methode des

Rechteckobjekts

Der Typ der Referenz auf das Objekt bestimmt, welche Methode aufgerufen wird.

Die bisher definierten Methoden sind statisch:

Beim Compilieren ist der Objekttyp bekannt, sodass die Sprungadresse der Methode festgelegt werden kann (statische Bindung)

Problem:

Dieses Verhalten ist, wenn Vererbung ins Spiel kommt, oft unerwünscht. Z. B. wenn sich erst zur Laufzeit entscheidet, welcher Objekttyp angesprochen wird.

Page 50: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

50

OO

P:

Vere

rbu

ng

Statische Methoden

Beispiel:

Zur Laufzeit werden verschiedene Grafikobjekte erzeugt und ihre Referenzen in einem Array als Container verwaltet:

Var Figur : array[1..10] of GrafikElement;

Ziel: Einheitlicher Zugriff auf bestimmte Methoden, wie z. B.:

for i := 1 to 10 do Figur[i].paint;

Dazu müsste der aktuelle Objekttyp für die Auswahl der Methode maßgebend sein.

Da zur Compilierzeit noch nicht feststeht, welche Objekttypen ins Array aufgenommen werden, entscheidet sich erst zur Laufzeit, welche Objektmethode aufgerufen werden soll.

Page 51: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

51

OO

P:

Vere

rbu

ng

Virtuelle Methoden

Die Basisklasse erhält ebenfalls eine Methode paint; diese wird aber als virtual deklariert.

TGrafikElement = class private

...

public

...

procedure paint;virtual;

end;

TKreis = class(TGrafikElement) private ...

public

procedure paint;override; ...

end;

Lösung des Problems durch virtuelle Methoden:

paint wird in der Unterklasse überschrieben,

d.h. als override deklariert und neu

implementiert.

Page 52: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

52

OO

P:

Vere

rbu

ng

Verhalten virtueller Methoden

Var Figur : Array[1..10] of GrafikElement;

Figur[5].paint; //Aufruf der virtuellen Methode

Die Referenz auf das Objekt enthält Information über den Typ des übergebenen Objekts. Dadurch kann die zum Objekt passende Methode aufgerufen werden.

Der Typ des aktuellen Objekts bestimmt zur Laufzeit die Methode.

Interne Realisierung:

Objekte besitzen einen Zeiger auf eine virtuelle Methodentabelle (VMT), die Zeiger auf alle virtuellen Methoden der Klasse enthält.Bei virtuellen Methoden erfolgt der Aufruf über diese Methodenzeiger-Tabelle.

Dynamische Bindung / late binding

Page 53: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

53

OO

P:

Vere

rbu

ng

Polymorphismus

Das Konzept der dynamischen Bindung heißt in der OOP

Polymorphismus (Vielgestaltigkeit).

Merkmale

Bei polymorphen Objektenvariablen entscheidet sich erst zur Laufzeit, welcher Klasse das Objekt angehört.

Eine in einer Basisklasse als virtual deklarierte Methode definiert eine Schnittstelle für alle abgeleiteten Klassen, auch wenn diese noch nicht festgelegt sind.

Ein Programm, das virtuelle Methoden einer Basisklasse enthält kann sehr leicht um abgeleitete Klassen erweitert werden, weil sichergestellt ist, dass stets die richtige Methode aufgerufen wird.

Empfehlung

Statische Methoden einer Basisklasse sollten nicht überschrieben werden.

Wenn Überschreiben notwendig erscheint, sollte die Methode als virtual deklariert werden.

Page 54: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

54

OO

P:

Vere

rbu

ng

Abstrakte Klassen

Die Basisklasse TGrafikElement muss die Methode paint enthalten, kann sie aber nicht sinnvoll implementieren, weil diese Klasse zu allgemein ist. Die Implementation kann also entfallen.Dazu wird die virtuelle Methode der Basisklasse zusätzlich als abstract deklariert.

Merkmale:

Abstrakte Klassen enthalten mindestens eine abstrakte virtuelle Methode, die überschrieben werden muss.

Von abstrakten Klassen können keine Instanzen gebildet werden.

Abstrakte Klasse bilden eine gemeinsame Schnittstelle für alle Unterklassen.

TGrafikElement = class ...

procedure paint;virtual;abstract;...

end;

TGrafikElement als abstrakte

Klasse

Page 55: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

55

OO

P:

Vere

rbu

ng

Aufgaben 3

1. Programm SimpelObjekt testen

2. Ergänzung der Objekte um die Funktion „Flaeche“. Der Zugriff soll polymorph erfolgen.

3. Ableitung der Klasse TQuadrat von TRechteck und testen

4. Polymorphismus anwenden:Eine Bank verfügt über Girokonten und Sparkonten. Während Girokonten überzogen werden können, dürfen Sparkonten keinen negativen Stand aufweisen.Der Auszahlungsaufruf soll für beide Kontotypen einheitlich seinEntwickeln Sie eine geeignete Vererbungsstruktur (UML)

Page 56: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

56

OO

P:

Vere

rbu

ngTeil 4

Objektverwaltung

Page 57: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

57

OO

P:

Vere

rbu

ng

Objektverwaltung

Aufgaben eines Objektverwalters Referenzen unterschiedlicher Objekttypen speichern Einfügen, entfernen von Referenzen Zugriff auf einzelne Objekte oder alle ermöglichen Zeichnen aller Objekte

Realisierung Speicher (lineare Liste)

Array of TGrafikElement (dyn. Array) Lineare Liste entwickeln Vorhandene Container – Objekte nutzen oder anpassen

(TList) Methoden

Einfügen Entfernen Verschieben (innerhalb der Liste) Objekt an bestimmter Position ermitteln Zeichnen

Page 58: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

58

OO

P:

Vere

rbu

ng

Klassendiagramm

TGrafikElement

#F Markiert : boolean; #Farbe : TcolorxPos : integeryPos : integer

# zeichneMarke+ paint

TVerwalter

- Elemente : TList

+ Count : integer

+ add(Objekt : TGrafikElement)

+ getElement( index : integer);

+ getElementAt(x, y : integer) : TGrafikElement

+ entferne(Objekt : TGrafikElement)

+ paintAll

*

TGUI

SelObjekt : TGrafikElement

Verwalter : TVerwalter

FormCreate(...)FormPaint(...)

FormMouseDown(...)

FormMouseMove(...)

Der Verwalter hat ein Tlist-Objekt zur Aufnahme der Elemente

1

getElementAt(x,y)

- Element an der Position (x, y) der Zeichenfläche

Page 59: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

59

OO

P:

Vere

rbu

ng

Problem: Objekt auswählen

function TVerwalter.getElementAt(x, y : integer): TGrafikElement;

var i, dx, dy : integer;

Obj : TGrafikElement;

begin

result := nil;

for i := 0 to Elemente.Count-1 do

begin

Obj := TGrafikElement(Elemente[i]);

dx := x-Obj.getx;

dy := y-Obj.gety;

if dx*dx + dy*dy < 100 then

result := Obj;

end;

end;

Liste der Objekte durchlaufen und Abstand zum übergebenen Punkt (x,y) berechnen

Abstandsbedingung prüfen

Referenz des letzten

gefundenen Objekts

zurückgeben

evtl. gefundenes Objekt ans

Ende der Liste setzen, damit

es als letztes gezeichnet wird

und damit alle anderen

überdeckt.

Objekt an der Stelle (x, y)

Algorithmus:

Page 60: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

60

OO

P:

Vere

rbu

ng

Zusammenfassung

1. Optimierung der Klassenstruktur Verwaltungs - Klassen hinzufügen Komplexe Klassen zerlegen

2. Optimierung der Attribute

3. Optimierung der Operationen

4. Optimierung der Vererbungsstruktur Abstrakte Operationen für einheitliche Schnittstellen Abstrakte Oberklassen bilden Polymorphismus maximieren Vererbungshierarchie komprimieren Existierende Klassen wiederverwenden

OOD- Klassendiagramm

Page 61: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

61

OO

P:

Vere

rbu

ng

Aufgaben 4

Erweiterung des Programms SimpelObjekt

• Objektverwalter einbinden (Klasse TVerwalter (Unit: uVerwalter)

• Objekte mit der Maus über den Bildschirm ziehen

• Farbe oder Größe einer mit Maus gewählten Figur ändern

• Mit Hilfe der Maus beliebig viele Objekte interaktiv erzeugen

Page 62: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

62

OO

P:

Vere

rbu

ngTeil 5

Realisierung des Tangram-Projekts

Page 63: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

63

OO

P:

Vere

rbu

ng

Anforderungen

Erzeugung geometrischer ObjekteBeschränkung auf Polygone und Kreise genügt

Fähigkeiten der Objekte- verschiebbar (Maus)- skalierbar- Drehbar

Verwaltung der Objekte mit Hilfe eines Verwalter-Objekts

Page 64: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

64

OO

P:

Vere

rbu

ng

Darstellung eines Polygons

Canvas – Methode: procedure Polygon(Points array of TPoint)

Der Parameter ist ein beliebig langes Array (dyn. Array) von Punkten (TPoint). Die Punkte enthalten die Bildschirmkoordinaten der Eckepunkte der Figur.

Canvas – Methode: procedure Polygon(Points array of TPoint)

Der Parameter ist ein beliebig langes Array (dyn. Array) von Punkten (TPoint). Die Punkte enthalten die Bildschirmkoordinaten der Eckepunkte der Figur.

Problem: - Der Referenzpunkt (xPos,yPos) soll Mittelpunkt der Figur sein. (erleichtert Drehen und Verschieben)

- Die Figur soll um den Referenzpunkt gedreht werden.

Lösung:

Die aktuellen Bildschirmkoordinaten werden stets aus einem Basispolygon berechnet, dessen Mittelpunkt der Ursprung (0,0) ist.

Alle Manipulationen (Vergrößerung, Verschiebung, Drehung) werden nur am Basispolygon durchgeführt und dieses anschließend zum Referenzpunkt verschoben.

Page 65: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

65

OO

P:

Vere

rbu

ng

Optimierte Klassen

Reduzierung auf die Klassen TKreis und TPolygon

TGrafikElement

# Markiert : boolean;

...# zeichneMarke+ paint + moveto(x,y :integer)+ skaliere(k : double)

TPolygon

+ initPolygon(... );+ paint+ skaliere(k : double)+ rotate(alpha : double)

# SPunkte : Array of TPoint# BPunkte : array of TPunkt

TKreis

+ paint;

+ skaliere(k : double)

TGrafikVerwalter

+ add(Element : TObjekt)

+ getElement( index : integer);

+ getElementAt(x, y : integer) : TGrafikElement

1*

abstrakt

Page 66: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

66

OO

P:

Vere

rbu

ng

Deklaration der Klasse „TPolygon“

TPolygon = class(TGrafikElement)

protected

Fn : integer; //Anzahl der Ecken

SPunkte : array of TPoint; //aktuelle Bildschirmkoordinaten der Eckpunkte

BPunkte : array of TPunkt; //Basispunkte (logische Koordinaten)

procedure setSchwerpunkt(absolut : boolean); //Schwerpunkt als Mittelpunkt

procedure zumRefPunkt; //Bildschirmkoordinaten der EckPunkte aktualisieren

public

procedure initPolygon(p : array of TPunkt; absolut : boolean);virtual;

procedure paint;override;

procedure moveto(x,y : integer);override;

procedure skaliere(k : double);override;

procedure rotate(alpha : double);virtual;

function n : integer;

end;

Page 67: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

67

OO

P:

Vere

rbu

ng

Klasse TPolygon

TPolygon

+ initPolygon(... );+ paint+ skaliere(k : double)+ rotate(alpha : double)

# SPunkte : array of TPoint# BPunkte : array of TPunkt

Initialisierung:

initPolygon(p : array of TPunkt; absolut : boolean)

- übernimmt ein Punkte-Array und bildet daraus das Basispolygon.

- absolut : gibt an, ob die Koordinaten absolute

Bildschirmkoordinaten sind

Type

TPoint = record x,y : integer end;

TPunkt = record x,y : double end;

Umwandlungsfunktionen

function Point(x, y : Integer): TPoint;

function Punkt(x, y : double) : TPunkt;

Page 68: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

68

OO

P:

Vere

rbu

ng

Initialisieren des Basispolygons

Schritte:

1. Initialisieren der dynamischen Arrays SPunkte und BPunkte2. Speichern der übergebenen Punkte in Bpunkte

3. Polygon so verschieben dass der Ursprung zum Schwerpunkt wird 4. Zum Referenzpunkt schieben, d. h. SPunkte bestimmen

procedure TPolygon.setPolygon(p : array of TPunkt; absolut : boolean);

//Basispolygon initialisieren

var i : integer;

begin

Fn := Length(p); //Anzahl der Punkte ermitteln und speichern

setLength(BPunkte,Fn); //dyn. Array mit Fn Werten initialisieren

setLength(SPunkte,Fn);

for i := 0 to Fn-1 do // Punkte in BPunkte speichern

BPunkte[i] := p[i];

setSchwerpunkt(absolut);

zumRefPunkt; // SPunkte aktualisieren

end;

Page 69: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

69

OO

P:

Vere

rbu

ng

Schwerpunkt setzen

procedure TPolygon.setSchwerpunkt(absolut : boolean);var i : integer; xs,ys : double;

begin //Schwerpunkt des Basispolygons

xs := 0; ys := 0;

for i := 0 to Fn-1 do begin xs := xs + BPunkte[i].x; ys := ys + BPunkte[i].y; end; xs := xs/n; ys := ys/n;

//Basispolygon so verschieben, dass der Schwerpunkt der Ursprung (0;0) wird for i := 0 to n-1 do begin BPunkte[i].x := BPunkte[i].x - xs; BPunkte[i].y := BPunkte[i].y - ys; end; if absolut then

begin //Schwerpunkt wird Referenzpunkt xPos := round(xs); yPos := round(ys); end;

end;

Page 70: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

70

OO

P:

Vere

rbu

ng

Verschieben des Basispolygons

O

BP1BP0

BP3 BP2

P0

P3 P2

P1

MFür alle Punkte:

P.x := xPos + BP.x;

P.y := yPos + BP.y;

Verschiebung des Basispolygons zum Referenzpunkt

BP : Basispunkte

P : Bildschirmpunkte

Procedure TPolygon.ZumRefPkt

Page 71: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

71

OO

P:

Vere

rbu

ng

Skalieren des Basispolygons

Zentrische Streckung des Basispolygons

BP0 BP1

BP2BP3

BP0’ BP1’

BP2’BP3’

Für alle Punkte:

BP.x := k*BP.x;

BP.y := k*BP.y;

BP : Basispunkte

k : Streckfaktor

Procedure skaliere(k : double)

Page 72: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

72

OO

P:

Vere

rbu

ng

Drehen des Basispolygons

Drehung eines Punktes um den Ursprung mit Drehwinkel durch Multiplikation mit der Drehmatrix

y

x

cosαsinα

sinαcosα

y'

x'

yyy

xxx

cossin'

sincos'

procedure TPolygon.rotate(alpha : double);Var i : integer; x,y : double;begin alpha := alpha*Pi180;

for i := 0 to Fn-1 do begin x := cos(alpha)*BPunkte[i].x-sin(alpha)*BPunkte[i].y;

y := sin(alpha)*BPunkte[i].x+cos(alpha)*BPunkte[i].y;

BPunkte[i].x := x; BPunkte[i].y := y; end; zumRefPunkt;

end;

Page 73: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

73

OO

P:

Vere

rbu

ng

Zeichnen des Polygons

procedure TPolygon.paint;

begin

with canvas do

begin

Pen.Style := pssolid;

// Pen.Mode := pmNotXor;

Pen.Color := clblack;

brush.color := FFarbe;

//Polygon zeichnen

polygon(SPunkte);

if Fmarkiert then

zeichneMarke; //Markierungsrechteck

end;

end;

Page 74: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

74

OO

P:

Vere

rbu

ng

Anbindung an die GUI-Klasse

TGUI

Figur : array[1..7] of TGrafikElement

SelObjekt : TPolygon

FormCreate(...)

FormPaint(...)

FormMouseDown(...)

FormMouseMove(...)

TForm

ist ein

- Verwalter

- Objekte erzeugen, Referenzen speichern

Ereignisgesteuerter Ablauf:

- Objekt auswählen, drehen

- Objekt verschieben

- ausgewähltes Objekt

- Objekte zeichnen

Page 75: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

75

OO

P:

Vere

rbu

ng

Aufgaben 5

1. In der Unit uGrafEleCont ist ein Graphikverwalter(Container) als Ableitung der Klasse TList implementiert.Binden Sie diesen Verwalter in das Tangram-Projekt ein.

2. Leiten Sie die Klasse TLinie für eine Strecke zwischen zwei Punkten TPolygon ab und fügen Sie sie ins Projekt A5/GrafikObjTest ein.

Page 76: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

76

OO

P:

Vere

rbu

ng

Ausblicke

Dialogfensters zum Editieren einzelner Objekte Listenfenster zur Ansicht aller Objekte ...

Page 77: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

77

OO

P:

Vere

rbu

ng

Dialogfenster

Das Dialogfenster ist durch eine Referenz mit einem Objekt verbunden(initialisieren); es somit dessen Operationen aufrufen

Aktualisieren liest die Attribute des Objekts und zeigt sie an Speichern schreibt die geänderten Attributwerte ins Objekt zurück

TForm

TGrafEleDlg

Initialisieren()Aktualisieren()Speichern()

TGrafikElement

Page 78: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

78

OO

P:

Vere

rbu

ng

Implementierung

Var Grafik : TGrafikElement;

procedure TGrafEleDlg.init(GrafObj : TGrafikElement);

begin

Grafik := GrafObj;

aktualisiere;

end;

SelObjekt := getElementAt(x,y); //angeklickte Figur finden

if (SelObjekt <> nil) then

begin //Dialog öffnen und initialisieren

GrafEleDlg.init(SelObjekt);//Referenz übergeben

GrafEleDlg.Show;

end;

Öffnen des Dialogs im Formular

Initialisieren des Dialogs

Page 79: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

79

OO

P:

Vere

rbu

ng

Aufgabe 6

1. Entwerfen Sie einen Editier- Dialog für das Projekt SimpelObjekt

2. Binden Sie den Dialog ins Projekt ein

Page 80: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

80

OO

P:

Vere

rbu

ng

Literatur und Links

Helmut Balzert: Lehrbuch der Software-Technik Eckart Modrow: Informatik mit Delphi Band 1 / 2 Siegfried Spolwig:

www.oszhdl.be.schule.de\gymnasium\faecher\informatik\index.htm

Klaus Merkerthttp://hsg.region-kaiserslautern.de/faecher/inf/index.php

Page 81: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

81

OO

P:

Vere

rbu

ng

Lösung: A 3.4

TKonto

- FKontoNr : integer- FStand : double

Create (nr : integer)Auszahlen(Betrag : double)

TSparkonto

+ Auszahlen(...)

TGirokonto

+ Auszahlen(...)

Page 82: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

82

OO

P:

Vere

rbu

ng

Projekt Memory

Zu entwickeln ist ein Programm, das das bekannte Memory-Spiel simuliert.

/0/ In einer ersten Version spielt ein Spieler alleine. Durch Mausklick können die Spielkarten aufgedeckt werden. Der Computer ist dabei der Spielleiter. Der Punktestand des Spieler wird protokolliert

/1/ In der zweiten Version ist der Computer ein Gegenspieler, der mit einer Gewinnstrategie ausgestattet ist.

/0/ In einer ersten Version spielt ein Spieler alleine. Durch Mausklick können die Spielkarten aufgedeckt werden. Der Computer ist dabei der Spielleiter. Der Punktestand des Spieler wird protokolliert

/1/ In der zweiten Version ist der Computer ein Gegenspieler, der mit einer Gewinnstrategie ausgestattet ist.

Pflichten:

Prototyp:

Page 83: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

83

OO

P:

Vere

rbu

ng

Projekt Uhr

Page 84: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

84

OO

P:

Vere

rbu

ng

Ampelsteuerung Fußgängerübergang

Nach:http://www.kbs.uni-hannover.de/Lehre/Info1/WS98/Projekte/atze/public_html/Presentation/

Page 85: Vererbung Helmut Paulus Speyer, 7./8.11.2006. OOP: Vererbung 2 Teil 1 Grafik mit Delphi.

85

OO

P:

Vere

rbu

ng

Ampelsteuerung Baustelle

Nach:http://www.kbs.uni-hannover.de/Lehre/Info1/WS98/Projekte/atze/public_html/Presentation/