Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Anfängerfragen zum OOP mit Delphi (https://www.delphipraxis.net/95767-anfaengerfragen-zum-oop-mit-delphi.html)

acillus 12. Jul 2007 20:37


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:
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.

Jelly 12. Jul 2007 21:53

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 ?

acillus 12. Jul 2007 22:07

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)

Jelly 12. Jul 2007 22:13

Re: Anfängerfragen zum OOP mit Delphi
 
Zitat:

Zitat von acillus
die frage ist nur noch wie das mit den typen funktioniert (rechteck, dreieck, kreis)

Was funktioniert denn da nicht ? Deine Instanzerstellung stimmt doch soweit.

acillus 12. Jul 2007 22:18

Re: Anfängerfragen zum OOP mit Delphi
 
Liste der Anhänge anzeigen (Anzahl: 1)
habe die Fehlermeldung mal hochgeladen

Jelly 12. Jul 2007 22:21

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.

acillus 12. Jul 2007 22:29

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;

sirius 12. Jul 2007 22:34

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 17:38 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz