Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Sinnvollste Abbildung eines mehrdimensionalen assoziativen Arrays in Delphi? (https://www.delphipraxis.net/185238-sinnvollste-abbildung-eines-mehrdimensionalen-assoziativen-arrays-delphi.html)

mh166 24. Mai 2015 16:30

Sinnvollste Abbildung eines mehrdimensionalen assoziativen Arrays in Delphi?
 
Hallo Leute,

ich bin bei einem Projekt gerade dabei bestimmte Werte (genauer gesagt: Fenstertitel, X-&Y-Koordinaten sowie einen zugehörigen String) in eine Art Array zu packen.

Um mal PHP als triviale Analogie herzunehmen:
PHP-Quellcode:
$hash['Foo'][12][27] = 'Bar';
$hash['Hello'][18][59] = 'World';
Ich denke das System ist naheliegend.

Mein Problem: wie stelle ich das am geschicktesten mit Delphi dar? :| Assoziative Arrays im klassischen Sinne gibt es ja nicht. Nehme ich aber ein TDictionary, sieht das am Ende gruselig aus:
Delphi-Quellcode:
var hash: TDictionary<String, TDictionary<Integer, TDictionary<Integer, String>>>;
Das kann ja nun auch nicht des Rätsels Lösung sein. Hoffe ich. :lol:

Nun ist die Frage: wie kann ich am einfachsten oder am elegantesten einem Key über (Fenstertitel, X, Y) den Wert (String) zuordnen?

Wenn alles nichts hilft habe ich schon über sowas nachgedacht:
Delphi-Quellcode:
hash := TDictionary<String, String>.Create;
hash.Add('Foo_12_27', 'Bar');
Ist zwar nicht das Eleganteste, aber funktioniert immerhin recht einfach. Schließlich sollen die drei Parameter ja nur einen Key bilden. Alles in einem Array (oder etwas adäquatem) zu speichern, würde zu einem späteren Zeitpunkt die Iteration über die einzelnen Parameter vereinfachen (z.B. einen Dump von nur einem bestimmten Fenster im Hash erstellen). Aber notfalls könnte ich darauf wohl verzichten. Die meisten Zugriffe erfolgen einfach nach dem Schema Key->Value.

Vielen Dank schon mal für eure Ideen und Vorschläge! :)

mfg, mh166

Der schöne Günther 24. Mai 2015 16:46

AW: Sinnvollste Abbildung eines mehrdimensionalen assoziativen Arrays in Delphi?
 
Ich finde deine erste Idee mit dem Tdictionary aus der RTL gar nicht so schlecht. Einmal einen Typalias dafür generiert und gut ist: Jeder weiß was gemeint ist und Tipparbeit sparst du meinetwegen auch. Analog zum Typalias noch eine Methode welche eine leere Instanz (oder Klon) liefert und man hat doch alles, oder?

Nur weil die Rohform gruselig aussieht? Wie ich in C++ schon manchen habe Templates missbrauchen sehen ist das aber noch richtig gut :)

Sir Rufo 24. Mai 2015 17:11

AW: Sinnvollste Abbildung eines mehrdimensionalen assoziativen Arrays in Delphi?
 
Nimm statt
Delphi-Quellcode:
string
oder
Delphi-Quellcode:
integer
einfach einen Record mit einem
Delphi-Quellcode:
class operator implicit
für diese beiden Typen.

PHP behandelt z.B.
Delphi-Quellcode:
1
und
Delphi-Quellcode:
'1'
gleich. Der interne Wert ist also immer ein String.

Mavarik 25. Mai 2015 09:55

AW: Sinnvollste Abbildung eines mehrdimensionalen assoziativen Arrays in Delphi?
 
Wow Cooler Threadtitel...

Was willst Du den damit erreichen?
Wie viele Fenster sind es denn? 10 100 1000 mehr?
Wie schnell musst Du das Richtige finden?

Mavarik

mh166 28. Mai 2015 18:56

AW: Sinnvollste Abbildung eines mehrdimensionalen assoziativen Arrays in Delphi?
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1302887)
Ich finde deine erste Idee mit dem Tdictionary aus der RTL gar nicht so schlecht. Einmal einen Typalias dafür generiert und gut ist

Ich bin ja grundsätzlich nich abgeneigt dagegen. Mir gings vor allem um die Frage, obs was sinnhafteres dafür gibt, das ich (noch) nicht kenne. Da ich nur hobbymäßig programmiere, wenn ich mal wieder ein Werkzeug für die Arbeit benötige, kenne ich (bzw. verwende aktiv) vermutlich nur einen kleinen Teil der ganzen wunderbaren Welt der RTL bzw. Delphi-Codebase allgemein. Aber ich freue mich immer, wenn ich mal wieder was Neues finde und nutzen kann! :idea::thumb:

Zitat:

Zitat von Sir Rufo (Beitrag 1302889)
Nimm statt
Delphi-Quellcode:
string
oder
Delphi-Quellcode:
integer
einfach einen Record mit einem
Delphi-Quellcode:
class operator implicit
für diese beiden Typen.

Ist natürlich eine Idee. Wobei es mir in dem Punkt eher um den Fakt des Dictionarys im Dictionary eines Dictionarys ging. Die Typen, ob nun
Delphi-Quellcode:
String
oder
Delphi-Quellcode:
integer
, sind da weniger das große Problem. Aber danke für deinen Vorschlag: im Zuge dessen gleich mal wieder was zur Überladung von Operatoren gelernt. 8-)

Zitat:

Zitat von Mavarik (Beitrag 1302913)
Wow Cooler Threadtitel...

Danke. :stupid:

Zitat:

Was willst Du den damit erreichen?
Wie viele Fenster sind es denn? 10 100 1000 mehr?
Wie schnell musst Du das Richtige finden?
Ich hooke eine API-Funktion (TextOutA), um dann unter dem Fenstertitel [1. Dimension], der jeweiligen X- und Y-Koordinate [2.&3. Dimension] dem dort stehenden Text zuzuordnen (letztlicher Wert). Auf die Art und Weise hole ich mir Daten aus einem anderen Programm, dass leider keine "normale" Win-GUI hernimmt, sondern alle Inhalte von Hand zeichnet. :roll:

Insgesamt sind es wohl kaum an die 10 Fenster. Dementsprechend ist auch die Frage nach der Performance nicht wirklich dramatisch. Mir gings mehr um die Frage der "Eleganz" und "Sinnhaftigkeit" bei dieser Konstellation.

mfg, mh166

Namenloser 28. Mai 2015 21:40

AW: Sinnvollste Abbildung eines mehrdimensionalen assoziativen Arrays in Delphi?
 
Ich habe in Delphi mit Templates keine Erfahrung, aber ich würde das so machen, wenn das geht (eher Pseudocode, da ich wie gesagt die Einzelheiten nicht kenne):
Delphi-Quellcode:
TPair<A, B> = class
private
  a: A;
  b: B;
public
  function Hash: THash;
end;

function TPair.Hash: THash;
begin
  Result := a.Hash xor b.Hash;
end;
Delphi-Quellcode:
TTriple<A, B, C> = class
private
  a: A;
  b: B;
  c: C;
public
  function Hash: THash;
end;

function TTriple.Hash: THash;
begin
  Result := a.Hash xor b.Hash xor c.Hash;
end;
usw. je nachdem, wie viele Dimensionen man braucht.

Und dann z.B.
Delphi-Quellcode:
TDictionary<TTriple<string, integer, integer>, string>
verwenden.

Dejan Vu 29. Mai 2015 04:45

AW: Sinnvollste Abbildung eines mehrdimensionalen assoziativen Arrays in Delphi?
 
Type
Delphi-Quellcode:
  TFormStorage = class
  private
    Function GetItem(const formName : String; X,Y : Integer) : String;
    Procedure SetItem(const formName : String; X,Y : Integer; const value : String);
  public
    property Item[formName : String; X,Y : Integer] : String Read GetItem Write SetItem;
  end;

var
  formStorage : TFormStorage;
...
// Zugriff
  formStorage['Foo',12,34] := 'Bar';


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