![]() |
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 |
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 |
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:
Jetzt kann man aber eine property zu einer default property machen
Items.Strings[Index]
Dann reicht folgendes für den Zugriff auf ein Element
Delphi-Quellcode:
Man beachte im folgenden Source das Wort default und das es nach dem Semikolon kommt !!!
Items[Index]
Delphi-Quellcode:
TStrings = class(TPersistent)
... public ... property Strings[Index: Integer]: string read Get write Put; default; ... end; |
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 |
Re: property für zweidimensionale Arrays
Genau so wie ich es oben beschrieben habe.
|
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:
Irgendwas stimmt an meiner Überlegung noch nicht (ich hab das ganze nicht nicht implementiert)
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; kann mir jemand helfen? mytar |
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 repräsentiert ein Element das Array's.
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; 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 23:09 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