Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Feld direkt per Name ansprechen? (https://www.delphipraxis.net/216525-feld-direkt-per-name-ansprechen.html)

DerMondistunsereSonne 13. Jan 2025 11:21

Feld direkt per Name ansprechen?
 
Moin,

Irgendwie fehlt mir gerade etwas. Angenommen ich habe ein Array oder etwas vergleichbares, mit A,1,1 und B,2,2, wie kann ich dann meineVariable['A'].ErsteProp aufrufen? Oder gibt es nichts vergleichbares in Delphi?

Uwe Raabe 13. Jan 2025 12:05

AW: Feld direkt per Name ansprechen?
 
Sorry, aber ich habe noch nicht verstanden, was du eigentlich machen willst.

DerMondistunsereSonne 13. Jan 2025 12:09

AW: Feld direkt per Name ansprechen?
 
Ich möchte eine Liste/Dictionary/Struct oder ähnliches anlegen, dass in der ersten Eigenschaft einen Indize enthält, über das ich das Element direkt ansprechen kann:

So etwas wie:

Delphi-Quellcode:
type
  TMyList = packed record
    MyName: string;
    Prop1: string;
    Prop2: Integer;
  end;

var
  MyList: array of TMyList
Und dann so ansprechbar:

Delphi-Quellcode:
MyList['MeinName'].Prop1 := 'MeinName';
Anstatt mittels for nach dem Element zu suchen.

haentschman 13. Jan 2025 12:23

AW: Feld direkt per Name ansprechen?
 
Zitat:

Anstatt mittels for nach dem Element zu suchen.
https://docwiki.embarcadero.com/Libr...jectDictionary
1. Klasse für deine Properties TMeineKlasse erstellen
2. in das erzeugte TObjectDictionary<string, TMeineKlasse> das erzeugte Object hinzufügen

Suchen:
Delphi-Quellcode:
 Variable := MyDictionary['Test']; // in der Variable (TMeineKlasse) ist dann das Objekt wenn gefunden, ansonsten nil.
 ...
Bearbeiten:
Delphi-Quellcode:
 Variable := MyDictionary['Test']
 Variable.Prop1 := 'Bla'
 ...
 MyDictionary['Test'].Prop1 := 'Bla';
:wink:

PS: auch ein Record sollte gehen. Dann aber ein TDictionary. TObjectDictionary räumt die Objekte weg.

Redeemer 13. Jan 2025 14:20

AW: Feld direkt per Name ansprechen?
 
Zitat:

Zitat von haentschman (Beitrag 1545114)
PS: auch ein Record sollte gehen. Dann aber ein TDictionary. TObjectDictionary räumt die Objekte weg.

...wenn der Konstruktor korrekt aufgerufen wurde.

DerMondistunsereSonne 13. Jan 2025 14:23

AW: Feld direkt per Name ansprechen?
 
Ich hatte ja auf eine einfachere Variante gehofft, aber dann schaue ich mir das mal an.

PS: Dein Edit zu spät gesehen, so etwas habe ich mir vorgestellt. Ich versuche mich mal daran.

Redeemer 13. Jan 2025 14:30

AW: Feld direkt per Name ansprechen?
 
Zitat:

Zitat von haentschman (Beitrag 1545114)
PS: auch ein Record sollte gehen.

Geht übrigens nicht. Die letzte Zeile deines Codes würde nicht funktionieren, weil du Felder von Eigenschaften, die ein Record sind, nicht schreiben kannst.
Die obersten zwei gehen. Man muss nur die Variable zurückschreiben.
haentschmans zweiter Codeblock enthält zwei völlig unterschiedliche Herangehensweisen vor und nach den Ellipsen. Vermutlich wollte er das untere so nicht schreiben, es würde aber bei Klassen gehen.

haentschman 14. Jan 2025 06:34

AW: Feld direkt per Name ansprechen?
 
Zitat:

es würde aber bei Klassen gehen.
...persönlich mag ich Records nicht. Deswegen immer alles mit Klassen. Bei der Aussage mit den Records, "sollte gehen", ...war nicht getestet. :zwinker:

Dennis07 15. Jan 2025 18:55

AW: Feld direkt per Name ansprechen?
 
Zitat:

Zitat von haentschman (Beitrag 1545142)
Zitat:

es würde aber bei Klassen gehen.
...persönlich mag ich Records nicht. Deswegen immer alles mit Klassen. Bei der Aussage mit den Records, "sollte gehen", ...war nicht getestet. :zwinker:

Naja du kannst rumtricksen, dann geht es schon. Ist nur halt nicht so cool. Wenn du aber stattdessen das Ergebnis einer Variablen zuweist und hinterher wieder zurückschreibst, kannst du damit problemlos arbeiten.

Alternativ kannst du natürlich immer über die RTTI auf Felder/Eigenschaften zugreifen und somit Objekte serialisieren. Gibt dazu schon genügend Beispiele.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:07 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 by Thomas Breitkreuz