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/)
-   -   Problem mit Bearbeiten eines Objekts im Array . OOP (https://www.delphipraxis.net/166571-problem-mit-bearbeiten-eines-objekts-im-array-oop.html)

hotkey 19. Feb 2012 13:48

Problem mit Bearbeiten eines Objekts im Array . OOP
 
Hallo, hab ein Problem und eine Frage..

Das Problem zu erst :


Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    PaintBox1: TPaintBox;
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Edit3: TEdit;
    Edit4: TEdit;
    Button2: TButton;
    Button3: TButton;
    Edit5: TEdit;
    Edit6: TEdit;
    Edit7: TEdit;
    Edit8: TEdit;
    Edit9: TEdit;
    Label4: TLabel;
    Button4: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;



  tgeo_objects = class
end;

    TViereck = class(Tgeo_objects)
      private
     x,y:integer;
    public
      procedure setx;
      procedure sety;
      function getx:integer;
      function gety:integer;
    protected
     procedure zeichne;
   end;

  TDreieck = class(TViereck)
  protected
  procedure zeichnen;

  public
   procedure setx;
   procedure sety;
   function getx:integer;
   function gety:integer;
end;




TKreis = class (TDreieck)
procedure Kreiszeichnen;
private
x1,y1,x2,y2:integer;
public
procedure setx1;
procedure sety1;
procedure setx2;
procedure sety2;

function getx1:integer;
function gety1:integer;
function getx2:integer;
function gety2:integer;

end;

Tgeo_objectsArray = Array of Tgeo_objects;



var
  Form1: TForm1;
  lange,breite:integeR;
  myviereck : Tviereck;
  mydreieck : Tdreieck;
  mykreis : Tkreis;
 GeoArray :Tgeo_objectsarray;

implementation




 procedure addtoarray(Geoobject:tgeo_objects);  // Hier wird ein Array erzeugt , um die Objekte zu verwalten
 begin
   SetLength(GeoArray, Length(GeoArray) + 1);
   GeoArray[High(GeoArray)] := GeoObject;
 end;

procedure tviereck.setx; //setzen
begin
 x:= strtoint(form1.Edit1.text);

end;

procedure Tviereck.sety;  //setzen
begin
y:= strtoint(form1.edit2.Text);
end;

function Tviereck.getx;
begin

result :=x;

end;

function tviereck.gety;
begin
result:=y;
end;


procedure tdreieck.setx; //setzen
begin
 x:= strtoint(form1.Edit3.text);

end;

procedure Tdreieck.sety;  //setzen
begin
y:= strtoint(form1.edit4.Text);
end;

function Tdreieck.getx;
begin

result :=x;

end;

function tdreieck.gety;
begin
result:=y;
end;


procedure Tkreis.setx1;
begin
x1 := strtoint(form1.Edit5.Text);
end;

procedure Tkreis.sety1;
begin
y1 := strtoint(form1.edit6.text);
end;

procedure Tkreis.setx2;
begin
x2 := strtoint(form1.edit7.text);
end;

procedure Tkreis.sety2;
begin
y2:= strtoint(form1.Edit8.text);
end;


function tkreis.getx1;
begin
result := x1;
end;

function tkreis.gety1;
begin
result := y1;
end;

function tkreis.getx2;
begin
result := x2;
end;

function tkreis.gety2;
begin
result := y2;
end;



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

  form1.paintbox1.canvas.lineto(myviereck.getx+100,myviereck.gety+100);

  form1.paintbox1.canvas.lineto(myviereck.getx,myviereck.gety+100);

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

 procedure Tdreieck.zeichnen;
begin
  form1.PaintBox1.Canvas.MoveTo(mydreieck.getx,mydreieck.gety);
  form1.PaintBox1.Canvas.LineTo(mydreieck.getx+100,mydreieck.gety);

  form1.PaintBox1.Canvas.MoveTo(mydreieck.getx,mydreieck.gety);
  form1.paintbox1.canvas.LineTo(mydreieck.getx,mydreieck.gety+100);

  form1.paintbox1.Canvas.MoveTo(mydreieck.getx,mydreieck.gety+100);
  form1.PaintBox1.Canvas.LineTo(mydreieck.getx+100,mydreieck.gety);
  end;

  procedure Tkreis.Kreiszeichnen;
  begin
  form1.PaintBox1.Canvas.Ellipse(x1,y1,x2,y2);
  end;


  procedure Farbe;
  begin
  if (form1.edit9.text) = ('rot')
   then
     begin
        form1.Color:=clred;
        end;
 end;


{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
   Myviereck := Tviereck.creatE;

   myviereck.setx;
   myviereck.sety;

   myviereck.zeichne;
   myviereck.free;

end;



procedure TForm1.Button2Click(Sender: TObject);
begin
   mydreieck := tdreieck.Create;

   mydreieck.setx;
   mydreieck.sety;

   mydreieck.zeichnen;
   mydreieck.Free;

end;

procedure TForm1.Button3Click(Sender: TObject);
begin
    mykreis := tkreis.Create;

    mykreis.setx1;
    mykreis.sety1;
    mykreis.setx2;
    mykreis.sety2;

    mykreis.Kreiszeichnen;
    mykreis.Free;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
 farbe;
end;

end.
Und zwar geht es darum , dass ich jetzt mit eure Hilfe ( danke nochmal ) Tgeo_objects in einen Array reingehauen habe.

Jetzt habe ich aber das Problem , dass ich erstmal die Anzahl der Felder bestimmen will ( [0..3 ] ( 4 Felder ) und dass ich dann , z.B auf der GUI in ein Edit-Feld die Feldnummer eingebe z.B 2 und dann soll entsprechend dieser Eingabe das , was in Feld 2 ist , ausgeführt werden.
Zum Beispiel:

Im Feld 2 ist TDreieckzeichnen drin und der Benutzer gibt jetzt per Edit-Feld die 2 ein , dann soll automatisch auf der Paintbox ein Dreieck gezeichnet werden.

( Der Benutzer sucht sich selbst die Position aus , deswegen die vielen Editfelder , bitte nicht wundern).

Hoffe ihr könnt mir helfen.

Danke schon im Voraus.

DeddyH 19. Feb 2012 18:03

AW: Problem mit Bearbeiten eines Objekts im Array . OOP
 
Ehrlich gesagt verstehe ich weder die Frage noch den Code. Wozu die Klasse tgeo_objects, wenn sie weder Methoden noch Properties noch sonst irgendetwas enthält? Und weshalb stammt ein Dreieck von einem Viereck und ein Kreis von einem Dreieck ab? Was hat das Formular in den Setter-Methoden der Klassen zu suchen? Wozu die globalen Variablen? Ich ralle das nicht, sry.

hotkey 19. Feb 2012 18:17

AW: Problem mit Bearbeiten eines Objekts im Array . OOP
 
Das eine war mein Problem.

Sobald ich vererbe z.B von TDreieck , werden sie Methoden (set,get) nicht mitvererbt. Das sollte die Frage sein , die später gestellt werden würde.

Na die Vererbungssache ist nicht in Ordnung , aber bin erstmal froh , wenn es geht und es geht auch.

Aber man kann doch sowas in ein Array packen.
Und ein Array hat doch Felder , in diese Felde möchte ich jetzt die Objekte reinzutun um die Objekte zu verwalten.

Es soll gezeichnet werden , aber es soll auch vorher auf die Arrayfelder zugreifen.

stahli 19. Feb 2012 18:32

AW: Problem mit Bearbeiten eines Objekts im Array . OOP
 
Also da ist wohl einiges im argen:

Methoden kannst Du in der Basisklasse als "virtual" deklarieren und in Ableitungen mit "override" überschreiben.

Ansonsten sollte man in einer Klasse nicht auf ein Formular zugreifen. Ein Objekt (Klassininstanz) sollte immer autark sein - also unabhängig von anderen Objekten.

Im Grunde könntest Du Deine Linien einfach in Prozeruren zeichnen. Oder Du baust Deine Komponenten wie ein Panel auf, das seinen eigenen Canvas hat und sich selbst auf diesem Canvas darstellt.

Verstanden habe ich Deine Frage auch nicht. Vielleicht musst Du Dein Konzept nochmal überdenken....

hotkey 19. Feb 2012 18:35

AW: Problem mit Bearbeiten eines Objekts im Array . OOP
 
Okay , dann beantwotre ich die Frage mit einer Gegenfrage.
UND BITTE:
Ich habs verstanden , das es nicht wirklich OOP ist , ist mir klar , aber der Fokus liegt , wie schon so oft gesagt , wo anders.


Was kann man mit einem Array machen ?

Wo seht ihr den Sinn , sowas in ein Array reinzuhauen ?

Hat es überhaupt Sinn?

Wenn man eine Schüler-Datenbank , mit dem gleichen Datentyp (string) hat , und das in einen Array reinhaut , was kann man dann machen ?

DeddyH 19. Feb 2012 18:38

AW: Problem mit Bearbeiten eines Objekts im Array . OOP
 
Man benutzt ein Array, wenn man eben mehrere gleichartige Datentypen verwalten will. Steht die Anzahl schon fest, dann kann man ein statisches Array verwenden, ansonsten nimmt man ein dynamisches Array oder gleich eine Liste.

himitsu 19. Feb 2012 18:40

AW: Problem mit Bearbeiten eines Objekts im Array . OOP
 
Wenn du keine Ahnung hast, was man damit machen kann, wozu willst du das dann unbedingt einbauen?

Oder andersrum gefragt: Was willst du erreichen?


Der Sinn eines Arrays:
In einem Array oder einer Liste (z.B. Delphi-Referenz durchsuchenTObjectList) kann man z.B. mehrere Objekte verwalten.




Empfehlen würde ich aber dennoch erstmal etwas mehr über OOP zu lernen.
Einer der Grundgedanken von OOP ist die Trennung von Code. (heutzutage auch noch die Trennung von Code und GUI)
Wenn du ein globale Variablen nutzen mußt und dann auch noch über globale Variablen auf die GUI zugreifen mußt, dann solltest du dir gedanken machen, was dort falsch ist.
z.B. die SetX- und SetY-Methoden ... denen gibt man die Werte als Parameter mit und läßt sie sich nicht selber die Werte holen.
Tipp: Wenn eine Klassen absolut nichts von der Form wissen, außer dem, was man ihnen über Parameter und Property mitgeteilt hat, dann bist du auf dem richtigen Weg. (also die Werte der Edits und das Canvas muß man ihnen "geben")

stahli 19. Feb 2012 18:43

AW: Problem mit Bearbeiten eines Objekts im Array . OOP
 
... und es macht nur Sinn, wenn Du Deine Objekte längerfristig am Leben lässt.
Dann kannst Du sie in einem Array (auch in mehreren Spalten) oder einer Liste (nur eine Spalte, aber einfacher im Handlíng) speichern.
Da Du Deine Objekte sofort wieder freigiebst mach ein Array in Deinem Fall keinen Sinn.

hotkey 19. Feb 2012 18:53

AW: Problem mit Bearbeiten eines Objekts im Array . OOP
 
Ja , ich will mit einem Array "VERWALTEN".

Ich will , dass z.B TDreieck als Objekt in einem Array gespeichert wird , z.B im Feld Nummer 3.

Und immer so weiter , versteht man es jetzt genauer ?

stahli 19. Feb 2012 19:12

AW: Problem mit Bearbeiten eines Objekts im Array . OOP
 
Ja das kannst Du so machen.
Wenn Dir eine einfache Sammlung reicht (Du also nicht mehrere Spalten brauchst), dann würde ich eine TList oder TObjectList (wenn Dein delphi die schon kennt) statt einem Array empfehlen.


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