AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Sinnvollste Abbildung eines mehrdimensionalen assoziativen Arrays in Delphi?

Sinnvollste Abbildung eines mehrdimensionalen assoziativen Arrays in Delphi?

Ein Thema von mh166 · begonnen am 24. Mai 2015 · letzter Beitrag vom 29. Mai 2015
Antwort Antwort
Benutzerbild von mh166
mh166

Registriert seit: 14. Nov 2004
Ort: Chemnitz
443 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#1

Sinnvollste Abbildung eines mehrdimensionalen assoziativen Arrays in Delphi?

  Alt 24. Mai 2015, 17:30
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: var hash: TDictionary<String, TDictionary<Integer, TDictionary<Integer, String>>>; Das kann ja nun auch nicht des Rätsels Lösung sein. Hoffe ich.

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
Tiefgründige Sätze unserer Zeit:
Zitat von Luckie:
Und diesen Token zur Laufzeit zu modifizieren würde bedeuten, dass du zur laufzeit das Token ändern musst.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.091 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Sinnvollste Abbildung eines mehrdimensionalen assoziativen Arrays in Delphi?

  Alt 24. Mai 2015, 17:46
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
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Sinnvollste Abbildung eines mehrdimensionalen assoziativen Arrays in Delphi?

  Alt 24. Mai 2015, 18:11
Nimm statt string oder integer einfach einen Record mit einem class operator implicit für diese beiden Typen.

PHP behandelt z.B. 1 und '1' gleich. Der interne Wert ist also immer ein String.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.123 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Sinnvollste Abbildung eines mehrdimensionalen assoziativen Arrays in Delphi?

  Alt 25. Mai 2015, 10:55
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
  Mit Zitat antworten Zitat
Benutzerbild von mh166
mh166

Registriert seit: 14. Nov 2004
Ort: Chemnitz
443 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#5

AW: Sinnvollste Abbildung eines mehrdimensionalen assoziativen Arrays in Delphi?

  Alt 28. Mai 2015, 19:56
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!

Nimm statt string oder integer einfach einen Record mit einem 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 String oder 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.

Wow Cooler Threadtitel...
Danke.

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.

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
Tiefgründige Sätze unserer Zeit:
Zitat von Luckie:
Und diesen Token zur Laufzeit zu modifizieren würde bedeuten, dass du zur laufzeit das Token ändern musst.
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Sinnvollste Abbildung eines mehrdimensionalen assoziativen Arrays in Delphi?

  Alt 28. Mai 2015, 22:40
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. TDictionary<TTriple<string, integer, integer>, string> verwenden.
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#7

AW: Sinnvollste Abbildung eines mehrdimensionalen assoziativen Arrays in Delphi?

  Alt 29. Mai 2015, 05:45
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';
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:44 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