Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi property für zweidimensionale Arrays (https://www.delphipraxis.net/23573-property-fuer-zweidimensionale-arrays.html)

mytar 5. Jun 2004 13:14


property für zweidimensionale Arrays
 
Ich hab ein Problem bei den propertys.

und zwar möchte ich mit property Matrix folgendes machen:
-Matrix soll die gesamte Matrix zurueckgeben
-Matrix[i, j] soll nur das Element von [i, j] zurückgeben

Ich weiss wie propertys ohne Indizes funktionieren,
aber da es sich hier um ein 2D-Array handelt, nützt mir das nicht viel!
Deshalb benötigt ich dringend eure Hilfe.

mytar

rsilo 5. Jun 2004 15:40

Re: property für zweidimensionale Arrays
 
Vom Ansatz her müsste das genau gleich sein wie die

property Items.

Dort kann man auch einen Index angeben, dann erhält man das ListItem bzw. den String,

ohne Index erhält man TListItems bzw. TStrings


Die Property kommt in vielen Komponenten wie Listbox und ListView enthalten ist.

Lieg ich da richtig?


grüße
rsilo

Jens Schumann 5. Jun 2004 15:46

Re: property für zweidimensionale Arrays
 
Hallo,
der Ansatz mit Items ist schon nicht schlecht.
Bei einer TListBox ist die property Itemsvom Type TStrings.
Normalerweise wird auf die einzelnen Elemente wie folgt zugegriffem
Delphi-Quellcode:
Items.Strings[Index]
Jetzt kann man aber eine property zu einer default property machen
Dann reicht folgendes für den Zugriff auf ein Element
Delphi-Quellcode:
Items[Index]
Man beachte im folgenden Source das Wort default und das es nach dem Semikolon kommt !!!
Delphi-Quellcode:
  TStrings = class(TPersistent)
  ...
  public
  ...
    property Strings[Index: Integer]: string read Get write Put; default;
  ...
  end;

mytar 5. Jun 2004 15:50

Re: property für zweidimensionale Arrays
 
Wie ist dass dan aber zu vestehen?

Bei Items erhält man TListItems und bei Items[Index] bekommt man das ListItem mit dem entsprechenden Index zurück.

Eine überladenen Prozedur geht bei propertys ja nicht, als kann man overload vergessen.

Wie würde man das dann machen?

mytar

Jens Schumann 5. Jun 2004 15:53

Re: property für zweidimensionale Arrays
 
Genau so wie ich es oben beschrieben habe.

mytar 6. Jun 2004 15:00

Re: property für zweidimensionale Arrays
 
ok, das was du bereits gesagt hast hab ich nun verstanden,

d.h. aber ich muss einen Klasse für mein 2D-Array schreiben, oder?

und dass Array selbst muss dann in dieser Klasse als Private-Attribut enthalten sein, nicht?

ich hab mir da folgendes gedacht:



Delphi-Quellcode:
type
  TMatrix = Array of Array of Real;

  T2DArrayClass = class(TObject)
   private
    FMatrix: TMatrix;
    function GetElement(i, j: Integer): Real;
    procedure SetElement(i, j: Integer; const Value: Real);
   public
    property Elements[i, j: Integer]: Real read GetElement write SetElement; default;
   end;

  TFatherClass = class(TObject)
   private
    function GetMatrix: T2DArrayClass;
    procedure SetMatrix(const Value: T2DArrayClass);
   public
    property Matrix: T2DArrayClass read GetMatrix write SetMatrix;
   end;
Irgendwas stimmt an meiner Überlegung noch nicht (ich hab das ganze nicht nicht implementiert)

kann mir jemand helfen?

mytar

Jens Schumann 7. Jun 2004 19:06

Re: property für zweidimensionale Arrays
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
da ich Deinen Ansatz so nie verwenden würde habe ich Dir mal ein Beispiel
gebastelt. D.h. so würde ich das Problem lösen. Dyn. Array's würde ich nur mir einer
Pistole am Kopf verwenden.

Delphi-Quellcode:
  TArrayElement = class(TObject)
  private
    FDouble: Double;
  public
    property Value : Double read FDouble write FDouble;
  end;

  TArrayElements = class(TObject)
  private
    FList   : TList;
    FXCount : Integer;
    FYCount : Integer;
    function GetCount: Integer;
    function GetItem(X, Y: Integer): TArrayElement;
    procedure AddNullElement;
  public
    constructor Create;
    destructor Destroy; override;
    procedure Clear;
    procedure Size(XSize, YSize : Integer);
    property Element[X,Y : Integer] : TArrayElement read GetItem; default;
    property XCount : Integer read FXCount;
    property YCount : Integer read FYCount;
  end;
TArrayElement repräsentiert ein Element das Array's.
TArrayElements verwaltet die einzelnen Elemente.
Im Beipsiel findest Du den hier fehlenden Code.

P.S. Real gibt es nur noch aus kompatibilitäts Gründen. Verwende besser Double.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:16 Uhr.

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