hmm, nee, so macht man das nicht
- Eine Klasse direkt mit einer globalen Variablen (hier Form1 bzw. Form1.PaintBox) zu verknüpfen, bzw. davon abhängig zu machen ist immer ein Schuss ins Knie ... Formualr umbenennen und schon knallt es
- Man kann ja nicht nur auf ein Formular, bzw. einer PaintBox zeichnen ... sondern auf einen Canvas
- Man muss sich überlegen, ob man die feste Verbindung zum Canvas wirklich zwingend braucht (kann sein, hängt davon ab, wie man das Objekt verwenden will)
Um per
OOP etwas zu entwickeln, so schreibt man sich erst mal auf, was man für jede Klasse wissen muss.
Dann sucht man nach den Gemeinsamkeiten zwischen diesen Klassen.
Hier in diesem konkreten Fall wäre es z.B. die Zeichnen-Routine, die jede Klasse haben muss.
Vierecke, Rechtecke (das ist doch ein und dasselbe), Kreise, Linien haben zudem noch eins gemeinsam:
Alle lassen sich mit 2 Punkten beschreiben, und zwar durch das umschließende Rechteck
Somit hätten wir folgende Basisklasse:
Delphi-Quellcode:
Tgeo_object = class
private
FRect : TRect;
FCanvas : TCanvas;
procedure SetRect( Value : TRect );
procedure SetCanvas( Value : TCanvas );
protected
procedure DoPaint; virtual; abstract;
public
property Rect : TRect read FRect write SetRect;
property Canvas : TCanvas read FCanvas write SetCanvas;
procedure Paint;
end;
implementation
procedure Tgeo_object.SetRect( Value : TRect );
begin
FRect := Value;
Paint;
end;
procedure Tgeo_object.SetCanvas( Value : TCanvas );
begin
FCanvas := Value;
Paint;
end;
procedure Tgeo_object.Paint;
begin
if Assigned( Canvas ) then
DoPaint;
end;
Jetzt mal ein konkretes Objekt:
Delphi-Quellcode:
Tgeo_Line = class( Tgeo_object )
protected
procedure DoPaint; override;
end;
implementation
procedure Tgeo_line.DoPaint;
begin
Canvas.MoveTo( Rect.TopLeft );
Canvas.LineTo( Rect.BottomRight );
end;
Jetzt sieht man auch, wieso OPP Vorteile bringt ... es kann helfen den Code zu reduzieren und insgesamt übersichtlicher zu machen
Um das jetzt in die richtige Paintbox zu bekommen macht man folgendes:
Delphi-Quellcode:
procedure TForm1.Button1Click( Sender : TObject );
var
lObj : Tgeo_object;
begin
lObj := Tgeo_Line.Create;
try
lObj.Rect.Left := 10;
lObj.Rect.Top := 10;
lObj.Rect.Width := 30;
lObj.Rect.Heigth := 30;
lObj.Canvas := PaintBox1.Canvas;
finally
lObj.Free;
end;
end;