![]() |
Viereck zeichnen OOP
Hallo , wir arbeiten jetzt im LK mit geometrischen Objekten und wir sollen mittels OOP jetzt Vierecke , Kreise , Rechtecke etc zeichnen lassen.
Ich habe jetzt mit dem Viereck angefangen. Er compiliert ohne Fehler , aber ich bekomme es nicht gezeichnet. Wir sollen erstmal zwei Punkte festlegen und dann diese mit Linien verbinden , damit ein Viereck entsteht. Hier ist der Code :
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls; type TForm1 = class(TForm) PaintBox1: TPaintBox; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; Tgeo_objects = class end; Tpunkt = class(Tgeo_objects) x,y:integer; procedure setx(r:integer); procedure sety(r:integer); end; TLinie = class(Tpunkt) p1,p2:TPunkt; end; TViereck = class(TLinie) procedure zeichne; end; var Form1: TForm1; MyViereck : TViereck; Punkt : TPunkt; implementation procedure TViereck.zeichne; begin form1.PaintBox1.Canvas.MoveTo(myviereck.x,myviereck.y); form1.PaintBox1.Canvas.LineTo(myviereck.x,myviereck.y); end; procedure tPunkt.setx(r:integer); begin x:=r; end; procedure Tpunkt.sety(r:integer); begin y:=r; end; {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin MyViereck := TViereck.create; myviereck.setx(7); myviereck.sety(9); Myviereck.zeichne; myviereck.Free; end; end. |
AW: Viereck zeichnen OOP
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls; type TForm1 = class(TForm) PaintBox1: TPaintBox; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; Tgeo_objects = class end; Tpunkt = class(Tgeo_objects) x,y:integer; procedure setx(r:integer); procedure sety(r:integer); end; TLinie = class(Tpunkt) p1,p2:TPunkt; end; TViereck = class(TLinie) procedure zeichne; end; var Form1: TForm1; implementation {$R *.dfm} var MyViereck : TViereck; Punkt : TPunkt; procedure TViereck.zeichne; begin form1.PaintBox1.Canvas.MoveTo(myviereck.x, myviereck.y); form1.PaintBox1.Canvas.LineTo(myviereck.x + 100, myviereck.y); end; procedure tPunkt.setx(r:integer); begin x:=r; end; procedure Tpunkt.sety(r:integer); begin y:=r; end; procedure TForm1.Button1Click(Sender: TObject); begin MyViereck := TViereck.create; try myviereck.setx(7); myviereck.sety(9); Myviereck.zeichne; finally myviereck.Free; end; end; end. |
AW: Viereck zeichnen OOP
Danke für die Hilfe , aber warum try ?
Könntest du mir das bitte erklären ? Danke schon im Voraus. |
AW: Viereck zeichnen OOP
try - finally ist ein Schutzblock. Wenn innerhalb von try - finally ein Fehler auftritt, so wird trotzdem noch der Bereich finally - end ausgeführt.
Tritt also ein Fehler in deinen Objekt-Methoden auf, so wird das Objekt trotzdem richtig freigegeben und es entsteht kein Speicherleck. |
AW: Viereck zeichnen OOP
Warum sollte in diesem Bereich ein Fehler entstehen ?
Braucht man sowas bei so einem Mickymaus-Programm ? |
AW: Viereck zeichnen OOP
hmm, nee, so macht man das nicht
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:
Jetzt mal ein konkretes Objekt:
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;
Delphi-Quellcode:
Jetzt sieht man auch, wieso OPP Vorteile bringt ... es kann helfen den Code zu reduzieren und insgesamt übersichtlicher zu machen
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; 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; |
AW: Viereck zeichnen OOP
Zitat:
|
AW: Viereck zeichnen OOP
Alles klar , vielen Dank für die Antworten und Hilfen.
Schönen Sonntag noch. hotkey |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:47 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz