AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Anfängerfragen zum OOP mit Delphi

Offene Frage von "acillus"
Ein Thema von acillus · begonnen am 12. Jul 2007 · letzter Beitrag vom 12. Jul 2007
Antwort Antwort
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
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Anfängerfragen zum OOP mit Delphi

  Alt 12. Jul 2007, 21:53
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 ?
  Mit Zitat antworten Zitat
acillus

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

Re: Anfängerfragen zum OOP mit Delphi

  Alt 12. Jul 2007, 22:07
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)
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Anfängerfragen zum OOP mit Delphi

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

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

Re: Anfängerfragen zum OOP mit Delphi

  Alt 12. Jul 2007, 22:18
habe die Fehlermeldung mal hochgeladen
Miniaturansicht angehängter Grafiken
fehler_777.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Anfängerfragen zum OOP mit Delphi

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

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

Re: Anfängerfragen zum OOP mit Delphi

  Alt 12. Jul 2007, 22:29
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;
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Anfängerfragen zum OOP mit Delphi

  Alt 12. Jul 2007, 22:34
Du benutzt nicht zufällig eine Instanz von TDreieck namens Dreieck
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es 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

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:13 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