|
Registriert seit: 12. Jul 2007 4 Beiträge |
#1
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. |
![]() |
Ansicht |
![]() |
![]() |
![]() |
ForumregelnEs ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus. Trackbacks are an
Pingbacks are an
Refbacks are aus
|
|
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
![]() |
![]() |