Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Geometrische Objekte in Array hizufügen (https://www.delphipraxis.net/166022-geometrische-objekte-array-hizufuegen.html)

hotkey 26. Jan 2012 11:01

Geometrische Objekte in Array hizufügen
 
Hallo , im Rahmen unseres Unterrichtes müssen wir ein Programm programmieren , das auf Buttonklicks jeweils geometrische Formen zeichnet z.B Rechteck , Dreieck etc.

Das habe ich zwar jetzt geschafft , aber wir müssen das jetzt sozusagen verwalten mit Arrays.

Und ich weiß nciht , wie ich das jetzt in einen Array packen soll , damit ich die Formen verwalten kann.

Ich habe zwar einen Array deklariert etc , aber wie packe ich das alles in das Array rein ?

Bei Christan Stelzmann , der diesen Crashkurs macht , hat das hier geschrieben :

Zitat:

interface

type
TgeomFormArray = Array of TgeomForm;

implementation

function gesamtflaeche (formen : TgeomFormArray) : Integer;
var i : Integer;
begin
result := 0;

for i:=0 to High(formen) do
result := result + formen[i].flaeche;
end;
Das ist mein Code :

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    PaintBox1: TPaintBox;
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Button2: TButton;
    Edit3: TEdit;
    Edit4: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;





  Tgeo_objects = class
  end;


  Tpunkt = class(Tgeo_objects)
    x :integer;
    y:integer;
 
    procedure setx(r:integer);
    procedure sety(z:integer);

   end;


   TLinie = class(Tpunkt)
    p1,p2:Tpunkt;
    end;


    TViereck = class(TLinie)
    protected
    procedure zeichne;
    end;

    TDreieck = class(Tviereck)
    procedure Dreieckzeichnen;
    end;


    Tgeo_objectsArray = Array of Tgeo_objects;


var
  Form1: TForm1;
  MyViereck : TViereck;
  Punkt:Tpunkt;
  r:integer;
  z:integer;
  GeoArray :Tgeo_objectsarray;
  i :integer;
  Mydreieck:Tdreieck;



implementation


procedure TViereck.zeichne;
begin
form1.PaintBox1.Canvas.MoveTo(myviereck.x,myviereck.y);
form1.paintbox1.canvas.LineTo(myviereck.x+100,myviereck.y);

form1.paintbox1.canvas.lineto(myviereck.x+100,myviereck.y+100);

form1.paintbox1.canvas.lineto(myviereck.x,myviereck.y+100);

form1.paintbox1.Canvas.MoveTo(myviereck.x,myviereck.y);
form1.PaintBox1.canvas.LineTo(myviereck.x,myviereck.y+100);
end;

procedure TPunkt.Setx(r:integer);
begin
x:=r;
end;

procedure TPunkt.sety(z:integer);
begin
y:=z;
end;


procedure TDreieck.Dreieckzeichnen;
begin
form1.PaintBox1.Canvas.MoveTo(mydreieck.x,mydreieck.y);
form1.PaintBox1.Canvas.LineTo(mydreieck.x+100,mydreieck.y);

form1.PaintBox1.Canvas.MoveTo(mydreieck.x,mydreieck.y);
form1.paintbox1.canvas.LineTo(mydreieck.x,mydreieck.y+100);

form1.paintbox1.Canvas.MoveTo(mydreieck.x,mydreieck.y+100);
form1.PaintBox1.Canvas.LineTo(mydreieck.x+100,mydreieck.y);


end;


{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
MyViereck := TViereck.Create;

r:= strtoint(edit1.text);
z:= strtoint(edit2.text);

myviereck.setx(r);
myviereck.sety(z);

MyViereck.zeichne;
MyViereck.Free;
end;




procedure TForm1.Button2Click(Sender: TObject);
begin
r := strtoint(edit3.text);
z := strtoint(edit4.text);

Mydreieck := Tdreieck.Create;

mydreieck.setx(r);
mydreieck.sety(z);

mydreieck.Dreieckzeichnen;
mydreieck.Free
end;

end.

DeddyH 26. Jan 2012 11:05

AW: Geometrische Objekte in Array hizufügen
 
Du erzeugst das entsprechende Objekt und fügst es dann Deinem Array hinzu, nachdem Du dessen Größe entsprechend dimensioniert hast (SetLength).

hotkey 26. Jan 2012 11:10

AW: Geometrische Objekte in Array hizufügen
 
Das verstehe ich ja , aber ich habe Probleme bei der Umsetzung.

Ein Objekt habe ich doch schon erzeugt , oder nicht ?

DeddyH 26. Jan 2012 11:16

AW: Geometrische Objekte in Array hizufügen
 
Aber Du hast es noch nicht ins Array verfrachtet. An Deiner Stelle würde ich mir dafür einfach eine Methode schreiben.
Delphi-Quellcode:
procedure TForm1.AddToArray(GeoObject: Tgeo_objects);
begin
  SetLength(Tgeo_objectsArray, Length(Tgeo_objectsArray) + 1);
  Tgeo_objectsArray[High(Tgeo_objectsArray)] := GeoObject;
end;
Übrigens sieht Deine Klassenhierarchie nicht sonderlich aus, ein bisschen Vererbung könnte nicht schaden ;)

hotkey 26. Jan 2012 11:19

AW: Geometrische Objekte in Array hizufügen
 
Danke für die Hilfe.

Was meinst du mit mehre Vererbung könntest du das bitte etwas konkretisieren?

4 Klassen reichen doch , oder nicht ?

DeddyH 26. Jan 2012 11:22

AW: Geometrische Objekte in Array hizufügen
 
Nunja, allen Klassen ist wohl mindestens gemein, dass sie sich zeichnen sollen, oder? Dann würde ich in der Basisklasse schon einmal die Methode "zeichne" deklarieren, wahrscheinlich abstrakt, da sich jedes Objekt ja etwas anders zeichnet. Damit steht Dir in den abgeleiteten Klassen automatisch diese Methode zur Verfügung, muss aber ggf. noch überschrieben werden.

Sir Rufo 26. Jan 2012 11:39

AW: Geometrische Objekte in Array hizufügen
 
Zitat:

Zitat von DeddyH (Beitrag 1147720)
Nunja, allen Klassen ist wohl mindestens gemein, dass sie sich zeichnen sollen, oder? Dann würde ich in der Basisklasse schon einmal die Methode "zeichne" deklarieren, wahrscheinlich abstrakt, da sich jedes Objekt ja etwas anders zeichnet. Damit steht Dir in den abgeleiteten Klassen automatisch diese Methode zur Verfügung, muss aber ggf. noch überschrieben werden.

Dazu haben wir doch schon einen Thread

Und dieses Konstrukt ist aus OOP-Sicht ... ähhmm .. geht gar nicht - sorry
Delphi-Quellcode:
// aha nix ... warum dann, nun ja kommt vielleicht noch :o)
Tgeo_objects = class
  end;

  // ok, ein Punkt
  Tpunkt = class(Tgeo_objects)
    x :integer;
    y:integer;
 
    procedure setx(r:integer);
    procedure sety(z:integer);

   end;

  // Wieso wird das denn jetzt von TPunkt abgeleitet???
   TLinie = class(Tpunkt) // <--- ???
    p1,p2:Tpunkt; // <--- ist ja soweit ok
    end;

  // ein Viereck benötigt 4 Punkte, nur ein spezielles Viereck, das Rechteck, kann mit 2 Punkten beschrieben werden
    TViereck = class(TLinie)
    protected
    procedure zeichne;
    end;

  // das ist auch sehr fragwürdig ... ein Dreieck benötigt 3 Punkte
    TDreieck = class(Tviereck)
    procedure Dreieckzeichnen;
    end;

hotkey 26. Jan 2012 11:46

AW: Geometrische Objekte in Array hizufügen
 
Ich weiß zwar , dass das , was ich mache , aus OOP-Sicht dumm ist bzw. nicht schlau.

Aber wir sind Einsteiger und das ist nicht unser Primärziel , für mich geht es erstmal darum , diese Sachen zu verstehen , wie es aus OOP-Sicht ist , ist mir eigentlich egal , das kann ich später , wenn ich gewisse Kenntnisse habe , erweitern/verbessern.

Sir Rufo 26. Jan 2012 11:55

AW: Geometrische Objekte in Array hizufügen
 
Zitat:

Zitat von hotkey (Beitrag 1147730)
Ich weiß zwar , dass das , was ich mache , aus OOP-Sicht dumm ist bzw. nicht schlau.

Aber wir sind Einsteiger und das ist nicht unser Primärziel , für mich geht es erstmal darum , diese Sachen zu verstehen , wie es aus OOP-Sicht ist , ist mir eigentlich egal , das kann ich später , wenn ich gewisse Kenntnisse habe , erweitern/verbessern.

Leider nicht ... weil du wirst diese Aufgabe so nicht lösen können, wenn du OOP nicht richtig umsetzt

schlecki 26. Jan 2012 12:16

AW: Geometrische Objekte in Array hizufügen
 
Zitat:

Zitat von Sir Rufo (Beitrag 1147728)
Delphi-Quellcode:
  // ein Viereck benötigt 4 Punkte, nur ein spezielles Viereck, das Rechteck, kann mit 2 Punkten beschrieben werden
    TViereck = class(TLinie)
    //...
    end;

Kann nicht jedes beliebige Viereck mit 2 Punkten dargestellt werden? Wenn ich 2 gegenüberliegende Punkte habe, dann "entstehen" doch die 2 anderen Punkte durch austauschen/mischen der x/y-Koordinaten, oder?
also etwa so:
Code:
P1(5,10) und P2(20, 30) => P3(5,30) und P4(20,10)


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:49 Uhr.
Seite 1 von 2  1 2      

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