Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Viereck zeichnen OOP

  Alt 22. Jan 2012, 14:10
hmm, nee, so macht man das nicht
  1. 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
  2. Man kann ja nicht nur auf ein Formular, bzw. einer PaintBox zeichnen ... sondern auf einen Canvas
  3. 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;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (22. Jan 2012 um 14:15 Uhr)
  Mit Zitat antworten Zitat