![]() |
Public Arrays in Klassen
Hallo! Ich habe mir eine Klasse geschrieben, die eine Wertetabelle mit X-Koordinaten und den dazugehörigen Y-Koordinaten darstellen soll. Dazu habe ich intern einfach ein Record mit X-Koordinate und Y-Koordinate deklariert und wollte anschließend ein Array dieses Records in den Public Bereich der Klasse schreiben,
weil ich später z.B. so darauf zugreifen können muss:
Code:
Das Problem ist nur, dass man Arrays nicht einfach public setzen kann. Wie kann ich trotzdem mein Ziel erreichen ?
meinobjekt.Koordinaten[100].x_wert := "2"
meinobjekt.Koordinaten[100].y_wert := "4"
Code:
unit UCoordinates;
interface type RCoordinates = Record xvalue : Single; yvalue : Single; end; type TCoordinates = class(TObject) private ACoordinates: Array of RCoordinates; public constructor Create(); destructor Destroy; ACoordinates: Array of RCoordinates; end; implementation constructor TCoordinates.Create(); begin inherited Create; end; destructor TCoordinates.Destroy; begin end; end. |
Re: Public Arrays in Klassen
Nach dieser Art:
Delphi-Quellcode:
type
TArray = array of RCoordinates ; TCoordinates = class(TObject) private FCoordinates : TArray ; function GetCoordinates (Index : integer) : RCoordinates ; public property ACoordinates [index : integer] : TArray read GetCoordinates ; end ; ... function TCoordinates.GetCoordinates (Index : integer) : RCoordinates ; begin Result := FCoordinates[index] ; end ; |
Re: Public Arrays in Klassen
Vielen vielen Dank ! Bin immer wieder beeindruckt wie schnell man Antworten bekommt.
Ich kann jetzt in gewünschter Art auf die Elemente im Array zugreifen. So hier z.B.:
Code:
Das Problem ist jetzt nur, dass ich ja eigentlich auch drauf schreiben wollte in dieser Art:
showmessage(FloatToStr(MyCoordinates.Coordinates[0].y_value));
Code:
Nach langem Probieren habe ich das irgendwie nicht hinbekommen :?
MyCoordinates.Coordinates[0].y_value := 22;
Hat da jemand ne Idee ? Ist bestimmt wieder total simpel. Und hier für alle,die wissen wollen, wie der Schreibzugriff geklappt hat:
Delphi-Quellcode:
unit UCoordinates;
interface type RCoordinates = Record x_value : Single; y_value : Single; end; type TCoordinates = class(TObject) private ACoordinates : Array of RCoordinates; function GetCoordinates (Index : integer) : RCoordinates ; public constructor Create(); destructor Destroy; property Coordinates [index : integer] : RCoordinates read GetCoordinates; end; implementation constructor TCoordinates.Create(); begin inherited Create; SetLength(ACoordinates, 1); ACoordinates[0].x_value := 0; ACoordinates[0].y_value := 0; end; destructor TCoordinates.Destroy; begin end; function TCoordinates.GetCoordinates (Index : integer) : RCoordinates ; begin Result := ACoordinates[index] ; end ; end. |
Re: Public Arrays in Klassen
Von ausserhalb deiner Klasse wirst du nicht schreibend auf ACoordinates[i].y_value zugreifen können, da RCoordinates ein Record ist. Du wirst höchstens die Chance haben, ACordinates[i] komplett zu beschreiben.
Innerhalb der Klasse kannst du aber bequem über FCoordinates schreibend zugreifen. |
Re: Public Arrays in Klassen
Schade, das ist ziemlich ärgerlich, denn ich muss genau so zu greifen können,wie ich es beschrieben habe, weil der Lehrer das so vorgegeben hat. In der Schule haben wir das irgendwann mal ach so geschafft. Ich glaube wir hatten das Array irgendwie über ne Umleitung doch noch publizieren können. Wahrscheinlich war das irgendwie über einen Pointer darauf ?
Weiß vielleicht jemand was ich meine ? |
Re: Public Arrays in Klassen
Moin Sezer,
mach' mal aus Deinem Record eine Klasse
Delphi-Quellcode:
Nicht zu vergessen dann davon auch immer eine Instanz zu erzeugen, bevor darauf zugegriffen werden kann.
RCoordinates = class(TObject)
private Fx_value : Single; Fy_value : Single; public property x_value : single read Fx_Value write Fx_Value; property y_value : single read Fy_Value write Fy_Value; end; |
Re: Public Arrays in Klassen
So da bin ich wieder! Ich hab jetzt das Record mit der Klasse ersetzt. Trotzdem kann ich nicht einfach das Array mit Instanzen dieser Klasse in den Public Bereich packen. Ich könnte jetzt auch wieder wie vorher mit nem Property Werte Lesen, aber nicht schreiben. Was hat das denn nun für einen Vorteil, wenn ich eine Klasse benutze ? Jetzt muss ich auch noch dynamisch Instanzen davon laden und das wäre dann das zweite Problem.
Vielleicht hab ich das auch ganz missverstanden ? Kannst du vielleicht den Code einfach mal ergänzen ? Hab gerade ne Blockade :?
Delphi-Quellcode:
unit UCoordinates;
interface type //Unterklasse Zahlenpaar TPair = class(TObject) private Fx_value : Single; Fy_value : Single; public constructor create(); destructor destroy(); property x_value : single read Fx_Value write Fx_Value; property y_value : single read Fy_Value write Fy_Value; end; //Klasse Tabelle mit Zahlenpaaren TCoordinates = class(TObject) private ACoordinates : Array of TPair; public constructor Create(); destructor Destroy; ACoordinates : Array of TPair; // Das geht leider nicht ! Field definition not allowed after methods or properties end; implementation //Implementation für TPair constructor TPair.Create(); begin inherited Create; end; destructor TPair.Destroy; begin end; //Implementation für TCoordinates constructor TCoordinates.Create(); begin inherited Create; SetLength(ACoordinates, 1); end; destructor TCoordinates.Destroy; begin end; end. |
Re: Public Arrays in Klassen
Zitat:
|
Re: Public Arrays in Klassen
Sorry hab das grad weggelassen. Der Tip mit dem Property ist natürlich noch implementiert.
Aber wie gesagt bringt mir die Klasse auch nicht viel. Damit hätte ich halt das Record selber definiert aber mehr auch nicht (oder vielleicht doch ?). Jedenfalls habe ich immer noch keinen Schreibzugriff. :gruebel:
Delphi-Quellcode:
unit UCoordinates;
interface type //Unterklasse Zahlenpaar TPair = class(TObject) private Fx_value : Single; Fy_value : Single; public constructor create(); destructor destroy(); property x_value : single read Fx_Value write Fx_Value; property y_value : single read Fy_Value write Fy_Value; end; //Klasse Tabelle mit Zahlenpaaren TCoordinates = class(TObject) private ACoordinates : Array of TPair; function GetCoordinates (Index : integer) : TPair ; public constructor Create(); destructor Destroy; property Coordinates [index : integer] : TPair read GetCoordinates; end; implementation //Implementation für TPair constructor TPair.Create(); begin inherited Create; end; destructor TPair.Destroy; begin end; //Implementation für TCoordinates constructor TCoordinates.Create(); begin inherited Create; SetLength(ACoordinates, 1); end; destructor TCoordinates.Destroy; begin end; function TCoordinates.GetCoordinates (Index : integer) : TPair ; begin Result := ACoordinates[index] ; end ; end. |
Re: Public Arrays in Klassen
Zitat:
Delphi-Quellcode:
Ich rate dir dringend mal ein Tutorial über Klassen in Delphi durchzulesen, z.B.
public
property Coordinates [index : integer] : TPair read GetCoordinates write SetCoordinates ; ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:43 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