![]() |
Problem mit Bearbeiten eines Objekts im Array . OOP
Hallo, hab ein Problem und eine Frage..
Das Problem zu erst :
Delphi-Quellcode:
Und zwar geht es darum , dass ich jetzt mit eure Hilfe ( danke nochmal ) Tgeo_objects in einen Array reingehauen habe.
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. 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. |
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.
|
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. |
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.... |
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 ? |
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.
|
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. ![]() 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") |
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. |
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 ? |
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 11:08 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz