Einzelnen Beitrag anzeigen

acillus

Registriert seit: 12. Jul 2007
4 Beiträge
 
#1

Anfängerfragen zum OOP mit Delphi

  Alt 12. Jul 2007, 20: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.
  Mit Zitat antworten Zitat