Registriert seit: 12. Jul 2007
4 Beiträge
|
Anfängerfragen zum OOP mit Delphi
12. Jul 2007, 21:37
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:
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.
TGeoForm:
Delphi-Quellcode:
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.
Beispiel rechteck:
Delphi-Quellcode:
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.
Beispiel Dreieck:
Delphi-Quellcode:
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.
dazu noch die unit Typ wo das drinsteht:
Delphi-Quellcode:
unit Typ;
interface
type
TTyp = (Rechteck, Dreieck, Kreis);
implementation
end.
|