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/)
-   -   Delphi Geometrische Objekte in Liste speichern (https://www.delphipraxis.net/127111-geometrische-objekte-liste-speichern.html)

Informatik-LK 7. Jan 2009 23:18


Geometrische Objekte in Liste speichern
 
Hallo ihr!

Ich wollte mal fragen, wie man die Eigenschaften eines Dreiecks, eines Rechtecks und die eines Kreises in einer Liste vom Typ TList speichern kann.
Mit Eigenschaften meine ich hierbei:

- beim Dreieck 3 Punkte: TPoint
- beim Rechteck 2 Punkte: TPoint
- beim Kreis 1 Punkt: TPoint und Radius: Integer.

Ich hoffe, ihr könnt mir helfen.

Informatik-LK

Sir Rufo 7. Jan 2009 23:38

Re: Geometrische Objekte in Liste speichern
 
Erzeuge Dir 3 Klassen für jeden Typ halt eine und schmeiß die in die Liste ... fertig.

TList speichert alles was von TObject abgeleitet wurde und das ist jede Klasse ;)

[edit]
ok, weil du Delphi-Anfänger bist :mrgreen:
Delphi-Quellcode:
type
  TRechteck = class
    Punkt1 : TPoint;
    Punkt2 : TPoint;
  end;
Und so greifst du über die Liste darauf zu:
Delphi-Quellcode:
if
  Liste.Items[ i ] is TRechteck
then
  begin
    with
      TRechteck( Liste.Items[ i ] )
    do
      begin
        // Hier kannst du auf das Objekt zugreifen
        // z.B.
        Punkt1.X := 10;
      end;
  end;
Die anderen Klassen werden analog behandelt.
[/edit]

Die Muhkuh 8. Jan 2009 00:19

Re: Geometrische Objekte in Liste speichern
 
Anstatt die TList nimmst eine TObjectList, die kümmert sich gleich noch um das Freigeben der Objekte.

Cyf 8. Jan 2009 04:32

Re: Geometrische Objekte in Liste speichern
 
Ich seh hier irgenwie grad den Grund nicht, Objekte statt Records zu verwenden. Würden die es nicht auch tun? :gruebel:

WS1976 8. Jan 2009 05:26

Re: Geometrische Objekte in Liste speichern
 
Hallo,

für jeden Typ eine Klasse? Viel zu umständlich.
ich würde eine Klasse nutzen in der es ein Array of Tpoint gibt. Zusätzlich definierst du dir einen Aufzählungstyp sodass du nachher fesstellen kannst was in der Klasse gespeichert wurde.
Willst du z.B. zusätzlich eine Zeichenroutine einfügen kannst du das mit canvas.polygon (weiss nicht exakt wie die procedure heisst) machen.

Delphi-Quellcode:
   Ageotyp=(Dreieck,Viereck,Kreis);
   Tgeometrie=class
      punkte:array of Tpoint;
      parameter:array of integer; //Radius für Kreis, 2 Radien für Ellipse
      geotyp:Ageotyp; //Ageotyp musst du als Aufzählungstyp definieren Ageotyp=(Dreieck,Viereck,Kreis)

      Constructor, Destructor, Prozeduren......
   end;
Beide Arrays sind offen, das heisst du musst, bevor du sie nutzen kannst die Grösse festlegen.
Als Beispiel für die Definition eines Kreises(habs nicht ausprobiert, also nicht böse sein wenn Fehler drin sind):

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var a:Tgeometrie;
begin
  a.Create;
  a.geotyp:=Kreis;
  setlength(a.punkte,1);
  setlength(a.parameter,1);
  a.punkte[0].X:=100; //Mittelpunkt X Wert
  a.punkte[0].Y:=100; //Mittelpunkt Y Wert
  a.parameter[0]:=50; //Radius
end;
Versuchs einfach mal, solltest du nicht zurecht kommen kannst du ja deinen Code posten.

Ich hoffe dir ist damit geholfen.

Grüsse
Rainer

alzaimar 8. Jan 2009 06:40

Re: Geometrische Objekte in Liste speichern
 
Zitat:

Zitat von Cyf
Ich seh hier irgenwie grad den Grund nicht, Objekte statt Records zu verwenden. Würden die es nicht auch tun? :gruebel:

Ja, aber wir leben in OOP-Zeiten, da nimmt man eben Klassen. Im Endeffekt müsstest Du ja Record-Zeiger in der Liste speichen, sodaß die Implementierung wieder etwas umständlicher wird.
Zitat:

Zitat von WS1976
für jeden Typ eine Klasse? Viel zu umständlich. ich würde eine Klasse nutzen in der es ein Array of Tpoint gibt.

Du pervertierst den OOP-Gedanken, indem Du eine Gottklasse definierst, die alles macht. So soll es ja gerade nicht sein.

Man könnte sich eine Basisklasse definieren, die grundlegende Funktionalität bereitstellt, z.B. 'Zeichnen', 'Umriss', 'MausInObjekt' usw. Die Methoden werden in den konkreten abgeleiteten Klassen implementiert, aber man kann einfach alle Objekte Zeichnen:
Delphi-Quellcode:
For i:=0 to GeoListe.Count - 1 do
  TGeoObjekt(GeoListe[i]).ZeichneObjekt;
Darauf aufbauend könnte man dann ein komplexes TGeoObjekt definieren, das aus einzelnen TGeoObjekten besteht und so eine recht komplexe und mächte Klassenbibliothek aufbauen.

Sir Rufo 8. Jan 2009 09:47

Re: Geometrische Objekte in Liste speichern
 
Ja, diese Vererbung ist genau der Grund für die Klassen.

Da aber Informatik-LK in seiner Signatur "Ich bin ein absoluter Delphi-Anfänger." stehen hat, wollte ich ihm aber nicht sofort mit der Vererbung kommen, aber schon mal auf das richtige Pferd setzen ;)

alzaimar 8. Jan 2009 09:54

Re: Geometrische Objekte in Liste speichern
 
Dein Beitrag war ja auch ok: Eine gute Mischung aus OOP und einfacher Umsetzung.

SirThornberry 8. Jan 2009 10:13

Re: Geometrische Objekte in Liste speichern
 
eine recht einfache Lösung wären variant-records. Gibt es eigentlich auch Variant-Objects? :gruebel:

Sir Rufo 8. Jan 2009 10:18

Re: Geometrische Objekte in Liste speichern
 
Zitat:

Zitat von SirThornberry
eine recht einfache Lösung wären variant-records. Gibt es eigentlich auch Variant-Objects? :gruebel:

Na klar, indem du die Variablen/Properties als Variant deklarierst.

Aber die Umsetzung ist nur im ersten Antritt einfacher. Wenn du da etwas mehr machen möchtest (Berechnung Flächeninhalt, Umfang, Zeichnen, etc.) dann bist du mit OOP besser dran und vor allem übersichtlicher!
Auch die Erweiterung um andere geometrische Objekte ist dann nur noch ein Spaziergang ;)

cu

Oliver


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:43 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