Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi property: 2 dimensionales Array (https://www.delphipraxis.net/147271-property-2-dimensionales-array.html)

Spezi 4. Feb 2010 23:26


property: 2 dimensionales Array
 
Hallo DP,
ich habe eine Klasse mit folgendem aufbau (gekürzt):
Delphi-Quellcode:
type playing_field=Array[0..2*b,-2..2*l+2] of Integer;

type Tfield=class(TObject)
      private
        Ffield:playing_field;
      public
        property Field:playing_field read ffield write ffield;
  end;
Wenn ich nun auf diese property lesend zugreife, klappt auch alles wunderbar.
Nur bei
Delphi-Quellcode:
Feld.field[x,y]:=1;
hapert es.
("Der linken Seite kann nichts zugewiesen werden.")

Ich habe es auch schon versucht, dass ich schreibe:
Delphi-Quellcode:
property Field[x,y:Integer]:playing_field read get_field write set_field;
(Und eben die beiden funktionen/prozeduren weiter oben deklariere)

Dann kommt aber eine Fehlermeldung ala "Inkompatible Typen".

Weiß jemand wie es richtig funktioniert?

PS: Ich habe mir auch Tutorials angeschaut, aber dort werden keine 2D Arrays behandelt :?

Khabarakh 4. Feb 2010 23:56

Re: property: 2 dimensionales Array
 
Da statische Arrays Wertetypen sind, kann das genauso wenig wie bei Record-Properties funktionieren. Du brauchst entweder Zeiger oder dynamische Arrays.

MacGuyver 5. Feb 2010 00:08

Re: property: 2 dimensionales Array
 
N'abend,

schau dir mal TList.Items an. Das müsste auch zweidimensional gehen. In Get und Set kannst du dann gleich eine Bereichsprüfung mittels Min() und Max() einbauen, damit du dir nicht den Speicher zerschießt.

Stefan

Spezi 5. Feb 2010 00:08

Re: property: 2 dimensionales Array
 
Hmm, gut...

Mit Zeigern kenne ich mich nicht aus.

Wie könnte ich denn bei einem dynamischen Array festlegen, dass der Index bei unter 0 beginnt?
(In meinem Beispiel -2)

MacGuyver 5. Feb 2010 00:20

Re: property: 2 dimensionales Array
 
So wie es in TList gemacht wurde werden die Werte in den eckigen Klammern zu Parameter. Erst sieht das so aus, als sei es ein Array, ist aber nur ein Parameter. Man kann an der Stelle auch irgendwie Strings übergeben, mit denen dann indiziert wird.

Khabarakh 5. Feb 2010 00:26

Re: property: 2 dimensionales Array
 
Zitat:

Zitat von Spezi
Wie könnte ich denn bei einem dynamischen Array festlegen, dass der Index bei unter 0 beginnt?

Gar nicht, also wahrscheinlich doch lieber Array Properties.
Ich sehe gerade erst, dass du das ja schon versucht hast, du hattest nur einen kleinen Fehler:
Delphi-Quellcode:
property Field[x,y:Integer]: Integer ...
Denn das Array ist ja bei dieser Lösung außen vor, wie McGuyver sagt.

Spezi 5. Feb 2010 00:41

Re: property: 2 dimensionales Array
 
Also, das mit der TList versteh ich irgendwie nicht.
Das ist im Prinzip ein Array mit Zeigern oder?

Aber wie kann ich sowas nutzen, muss ich für jedes Element/jeden Index einen eigenen Zeiger festlegen?

Spezi 5. Feb 2010 01:30

Re: property: 2 dimensionales Array
 
Also, ich habe es nun ohne Properties versucht.
Der Zugriff sollte nun über Funktionen/Prozeduren (getValue,setValue) erfolgen.

Allerdings erhalte ich nun eine Zugriffsverletzung beim Setzen.

Kann es sein, dass man generell nichts an einer Eigenschaft eines Objektes ändern kann, sofern diese Eigenschaft ein statisches Array ist? :gruebel:
(Edit: Wenn man Zeiger außer Acht lässt :P )

scrat1979 5. Feb 2010 06:27

Re: property: 2 dimensionales Array
 
Eine Zugriffsverletzung kann z.B. daher kommen, dass Du auf einen nicht vorhanden Index zugreifen möchtest.

Delphi-Quellcode:
 XYZ : array[1..10] of Integer;

 [...]

  XYZ[0] := 45; // hier kracht es
Das ist bei mir bei Arrays im Rahmen von FOR-Schleifen auch mal häufiger der Fall, wenn ich zu wenig nachdenke. Das solltest Du meiner Meinung nach zunächst mal überprüfen.

Spezi 5. Feb 2010 17:16

Re: property: 2 dimensionales Array
 
Nein, viel banaler.

Ich habe zwar
Delphi-Quellcode:
var feld:TFeld;
geschrieben, aber vergessen zu schreiben:
Delphi-Quellcode:
feld:=TField.Create();
:stupid:


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