![]() |
Anfängerfragen zum OOP mit Delphi
Hallo Leute,
ich habe bis vor kurzem noch nie mit Delphi gearbeitet, allerdings schon vorher Grundkenntnisse mit Turbo Pascal gesammelt. Die Aufgabenstellung lautete wie folgt: Programmiere ein programm zum Zeichnen von Objekten (mit canvas auf der Form1 - Dreiecke, Rechtecke, Kreise), welche man verschieben kann und verschiedene Größen, Farben und Ausgangpunkte haben. Zudem sollen alle Objekte einzeln löschbar sein. Auf meiner Form befinden sich 3 buttons (rechteck, kreis, dreieck), sowie ein button zum löschen, 2 buttons um zwischen objekten vor- oder zurückzuschalten und 4 buttons für die richtungsänderungen. Mit hilfe von record habe ich das ganze schon nicht OOP konform lösen können, nun soll es aber mit hilfe von ObjectListen geschehen. Hier meine Fragen: 1. Wie nutze ich die case anweisung richtig mit hilfe des typs um eine instanz von Dreieck/Viereck/Kreis zu erstellen (siehe unter //Speichern in Form1 2. Wie setzte ich die canvas auf form1? "setcanvas(form1.canvas);" geht irgendwie nicht. 3. was fehlt ansonsten noch zum verschieben, löschen ect? wäre nett wenn jemand da helfen könnte. Hier die codes:
Delphi-Quellcode:
TGeoForm:
unit mainunit;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, geomForm, rechteck, contnrs, Typ, kreis, dreieck; type TForm1 = class(TForm) bt_rechteck: TButton; bt_dreieck: TButton; bt_kreis: TButton; bt_delete: TButton; bt_up: TButton; bt_down: TButton; bt_right: TButton; bt_left: TButton; bbt_exit: TBitBtn; la_objekt: TLabel; bt_zurueck: TButton; bt_vor: TButton; procedure bt_rechteckClick(Sender: TObject); procedure bt_dreieckClick(Sender: TObject); procedure bt_kreisClick(Sender: TObject); procedure FormCreate(Sender: TObject); private FList : TObjectList; public procedure Speichern(Typ : TTyp); end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.bt_dreieckClick(Sender: TObject); begin speichern(Typ.Dreieck); end; procedure TForm1.bt_kreisClick(Sender: TObject); begin speichern(Typ.Kreis); end; procedure TForm1.bt_rechteckClick(Sender: TObject); begin speichern(Typ.Rechteck); end; procedure TForm1.FormCreate(Sender: TObject); begin FList := TObjectList.Create; end; procedure TForm1.Speichern(Typ : TTyp); var kante, startA, startB, hoehe, breite, iNr, radius, zufall : integer; Farbe : TColor; FForm : TGeomForm; begin //Größe festlegen randomize; kante := random(100) + 10; radius := random(100) + 10; hoehe := random(100) + 10; breite := random(100) + 10; //Startpunkte festlegen randomize; startA := random(300) + 10; startB := random(300) + 10; //Farbe festlegen randomize; zufall := random(5)+1; case zufall of 1: Farbe := clred; 2: Farbe := clblack; 3: Farbe := clblue; 4: Farbe := clgreen; 5: Farbe := clyellow; end; //Speichern case Typ of Dreieck: FForm := TDreieck.create(startA,startB,kante,Farbe); Rechteck: FForm := TRechteck.create(startA,startB,hoehe,breite,Farbe); Kreis: FForm := TKreis.create(startA,startB,radius,Farbe); end; FList.add(FForm); //Zeichnen for iNr := 0 to FList.count - 1 do begin FForm := (FList[iNr] as TGeomForm); FForm.Zeichne; end; end; end.
Delphi-Quellcode:
Beispiel rechteck:
unit geomForm;
interface uses Windows, Graphics, typ; type TGeomForm = class(TObject) protected FTyp : TTyp; FCanvas : TCanvas; procedure ZeichneForm; virtual; abstract; public procedure SetCanvas(Canvas: TCanvas); virtual; procedure SetFarbe(Farbe: TColor); virtual; procedure SpringeZu(x: Integer; y: Integer); virtual; procedure Zeichne; virtual; procedure Loesche; virtual; function GetX: Integer; virtual; function GetY: Integer; virtual; end; implementation procedure TGeomForm.SetCanvas(Canvas: TCanvas); begin FCanvas := Canvas; end; procedure TGeomForm.SetFarbe(Farbe: TColor); begin // FFarbe:=Farbe; end; function TGeomForm.GetX: Integer; begin // Result := Fx1; end; function TGeomForm.GetY: Integer; begin // Result := Fy1; end; //Verschieben procedure TGeomForm.SpringeZu(x, y: Integer); var xMerke, yMerke : Integer; begin { xMerke := Fx1; yMerke := Fy1; Loesche; Fx1 := xMerke + x; Fy1 := yMerke + y; Zeichne; } end; //Lösche procedure TGeomForm.Loesche; begin with FCanvas do begin Pen.Color:=cl3DLight; Brush.Color:=cl3DLight; end; ZeichneForm; end; //Zeichne procedure TGeomForm.Zeichne; begin { with FCanvas do begin Pen.Color := FFarbe; Brush.Color := FFarbe; end; ZeichneForm; } end; end.
Delphi-Quellcode:
Beispiel Dreieck:
unit rechteck;
interface uses geomForm, Graphics, contnrs, classes, Windows; type TRechteck = class(TGeomForm) protected procedure ZeichneForm; override; var Fx1 : Integer; Fx2 : Integer; Fy1 : Integer; Fy2 : Integer; FFarbe : TColor; private procedure SetStartX(x : Integer); virtual; procedure SetStartY(y : Integer); virtual; function GetStartX : Integer; virtual; function GetStartY : Integer; virtual; public constructor Create(x1, y1, x2, y2 : Integer; Farbe : TColor); property X : Integer read Fx2 write SetStartX; property Y : Integer read Fy2 write SetStartY; end; implementation { TRechteck } constructor TRechteck.Create(x1, y1, x2, y2 : Integer; Farbe : TColor); begin Fx1 := x1; Fy1 := y1; Fx2 := x2; Fy2 := y2; FFarbe := Farbe; end; function TRechteck.GetStartX : Integer; begin Result := Fx1; end; function TRechteck.GetStartY : Integer; begin Result := Fy1; end; procedure TRechteck.SetStartX(x : Integer); begin Fx1 := x; end; procedure TRechteck.SetStartY(y : Integer); begin Fy1 := y; end; procedure TRechteck.ZeichneForm; begin with FCanvas do begin Rectangle(Fx1,Fy1,Fx1+Fx2,Fy1+Fy2); end; end; end.
Delphi-Quellcode:
dazu noch die unit Typ wo das drinsteht:
unit dreieck;
interface uses geomForm, Graphics, contnrs, classes, Windows; type TDreieck = class(TGeomForm) protected procedure ZeichneForm; override; var Fx1 : Integer; Fx2 : Integer; Fy1 : Integer; FFarbe : TColor; private procedure SetStartX(x : Integer); virtual; procedure SetStartY(y : Integer); virtual; function GetStartX : Integer; virtual; function GetStartY : Integer; virtual; procedure Punkte(Fx1, Fy1, Fx2 : Integer); var A,B,C : TPoint; // function getx: integer; override; public constructor Create(x1, y1, kante : Integer; Farbe : TColor); property X : Integer read Fx2 write SetStartX; end; implementation { TDreieck } //Constructor constructor TDreieck.Create(x1, y1, kante : Integer; Farbe : TColor); begin Fx1 := x1; Fy1 := y1; Fx2 := kante; FFarbe := Farbe; Punkte(Fx1,Fy1,Fx2); end; procedure TDreieck.Punkte(Fx1, Fy1, Fx2 : Integer); var fTemp : real; begin fTemp := round((sqrt(3) / 2) * Fx2); A := Point(Fx1, Fy1); B := Point(Fx1 + Fx2, Fy1); C := Point(Fx1 + round(Fx2 / 2), Fy1 - round(fTemp)); end; function TDreieck.GetStartX : Integer; begin Result := Fx1; end; function TDreieck.GetStartY : Integer; begin Result := Fy1; end; procedure TDreieck.SetStartX(x : Integer); begin Fx1 := x; end; procedure TDreieck.SetStartY(y : Integer); begin Fy1 := y; end; procedure TDreieck.ZeichneForm; begin with FCanvas do begin Punkte(Fx1,Fy1,Fx2); polygon([A,B,C]); end; end; end.
Delphi-Quellcode:
unit Typ;
interface type TTyp = (Rechteck, Dreieck, Kreis); implementation end. |
Re: Anfängerfragen zum OOP mit Delphi
Also mir fällt erstmal auf, dass du die Prozedur Zeichne nur in TGeomForm virtuell deklarierst, dort selber aber nichts implementiert. Und überschreiben in TDreieck usw. tust du diese Methode allerdings auch nicht, also passiert da erst schon mal gar nix.
Was heisst, SetCanvas (Form1.canvas) funktioniert nicht richtig... Gibts Fehlermeldungen ? |
Re: Anfängerfragen zum OOP mit Delphi
Habs doch hinbekommen.
habs in die mainunit "FForm.SetCanvas(canvas);" geschrieben, und jetzt zeichnet er auch. die frage ist nur noch wie das mit den typen funktioniert (rechteck, dreieck, kreis) |
Re: Anfängerfragen zum OOP mit Delphi
Zitat:
|
Re: Anfängerfragen zum OOP mit Delphi
Liste der Anhänge anzeigen (Anzahl: 1)
habe die Fehlermeldung mal hochgeladen
|
Re: Anfängerfragen zum OOP mit Delphi
Mir fällt da nur noch auf, dass sowohl deine Variable als auch deine Unit den Namen Typ trägt. Das mag Delphi eigentlich gar nicht.
|
Re: Anfängerfragen zum OOP mit Delphi
hab Typ (die Variable) jetzt TypForm genannt (procedurdeklaration, procedur und case), aber trotzdem der gleiche fehler :(
EDIT: es geht jetzt, musste es dann so schreiben: //Speichern case TypForm of Typ.Dreieck: FForm := TDreieck.create(startA,startB,kante,Farbe); Typ.Rechteck: FForm := TRechteck.create(startA,startB,hoehe,breite,Farbe) ; Typ.Kreis: FForm := TKreis.create(startA,startB,radius,Farbe); end; |
Re: Anfängerfragen zum OOP mit Delphi
Du benutzt nicht zufällig eine Instanz von TDreieck namens Dreieck :gruebel:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:44 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