Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Assoziatives Array oder ähnliches (https://www.delphipraxis.net/10656-assoziatives-array-oder-aehnliches.html)

sentinal 22. Okt 2003 20:31


Assoziatives Array oder ähnliches
 
Hallo,
ich bin auf der vergeblichen Suche nach einem assoziativen Array für Delphi.
Bin ich einfach nur Blind oder gibt es das nicht?¿
Gibt es eine andere Möglichkeit so etwas variabel zu erstellen?¿
Habe die zwei numerische Arrays und möchte diese irgendwie verknüpfen:

[0] = value1
[1] = value2
...

[0] = key1
[1] = key2

Nun möchte ich sagen könne gib mir value von key1 und er soll value1 ausspucken.

Hat da einer eine Idee?¿

negaH 22. Okt 2003 23:47

Re: Assoziatives Array oder ähnliches
 
Hä?
KeyArray[0] = Key1 somit ValueArray{0] = Value1, demzufolge KeyArray[1] = Key2 und ValueArray[1] = Value2, sprich KeyArray[x] = Key_X und ValueArray[x] = Value_X.

Gruß Hagen

sentinal 22. Okt 2003 23:55

Re: Assoziatives Array oder ähnliches
 
Hallo,
ich kenn nur den KEY. Nur mit diesem möchte ich ans VALUE kommen.

negaH 23. Okt 2003 00:03

Re: Assoziatives Array oder ähnliches
 
Aha, nun wird deine Frage genauer, den unter assoziativen Arrays verstehe ich was ganz anderes.

Entweder definierst du deine Datenstrukturen um in
Delphi-Quellcode:
type
  TKeyValue = packed record
    Key: TKey;
    Value: TValue;
  end;

  TKeyValueArray = array of TKeyValue;
Und speicherst somit im Array beide zusammengehörigen Werte ab. Du musst dann nur noch den Key im Array suchen und hast die Value.

Oder du benutzt zwei getrennte Arrays für Key und Value, musst zuerst den Index des Keys finden und benutzt diesen um in das parallele Array der Values zuzugreifen.

Jetzt stellt sich die Frage wie der Key definiert ist. Ist er z.B. ein Integer zwischen 0..1023 und zu jedem dieser 1024 Keys gibt es auch einen Key, dann könnte man den Key als Index in das Value Array selber benutzen.

D.h. die Struktur wie ein Key aussieht und wieviele Keys es gibt entscheidet darüber was am besten geeignetesten ist. Also wie sehen die Keys/Values denn nun aus ?

Gruß Hagen

PS: am besten ist es immer wenn man in seiner Frage beschreibt was man machen will und wofür es sein soll.

sentinal 23. Okt 2003 10:38

Re: Assoziatives Array oder ähnliches
 
Hallo,

ich würde da gerne die Datenbankergebnisse leichtzer mit abfragen.
Weil wenn ich immer durchzählen muss das wievielte Feld nun die id ist oder die email dann bringt mich das um.

Die Keys sind also Strings.
Die Values sind auch Strings.

nun wenn ich mir eine Funktion schreiben muss die immer erst das Element mit dem Wert 'Key' sucht und dann mit dem Key von dem Element aus dem anderen Array das raussuchen muss, ist das doch auf dauer glaube nicht sehr toll im Bezug auf genutzte Leistung zu Ergebnis, oder?
Darum habe ich gehofft, dass man es direkt zuweisen kann.

sentinal 23. Okt 2003 10:45

Re: Assoziatives Array oder ähnliches
 
Achso, falls das nicht klar geworden ist:

Ich habe zwei Arrays entstanden aus
Delphi-Quellcode:
_myRow := mysql_fetch_row(_myRes);
_myFields := mysql_fetch_fields(_myRes);
Wobei das _myFields sieht so das, dass ich da immer _myFields[key].name angeben muss um an den Namen zu kommen.
Bei _myRow geht es direkt _myRow[key] und habe hier das Value.

nun hätt ich das gerne irgendwie so oder ähnlich verknüpft:

_myErgebnis[_myFields[key]] := _myRow[key];

So dass ich nurnoch
_myErgebnis['id'] angeben muss

oki 23. Okt 2003 11:05

Hi Sentinal,

du kannst natürlich ein zweidimensionales Array (möglichst dynamisch) oder auch eine Stringliste verwenden.

Bei der Stringliste hast du natürlich das Problem, dass dein zweiter zuspeichernder Wert ein Typ TObject sein muß. Das kannst du aber einfach mit einer Zeigervariable lösen.

Üblicherweise schreibe ich mir für sowas eine kleine neue Klasse abgeleitet von TStringList um die Umwandlung in deinen Value-Wert nicht in der "Hauptanwendung" machen zu müssen.

Das sieht dann ansatzweise so aus:

Delphi-Quellcode:

type
  TKeyValueList = class(TStringList)
  public
    procedure AddKeyValue(Key, Value: String);
    function GetValue(Key : String) : String;
end;

procedure TKeyValueList.AddKeyValue(Key, Value:String);
var
  PValue : PChar;
begin
  // Value in PChar wandeln
  AddObjects(Key, TObject(PValue));
end;

function TKeyValueList .GetValue(Key, String):String;
var
  PValue : PChar;
  Index : Integer;
begin
  Result := '';
  try
    IF Find(Key, Index) then begin
   PValue := PChar(Object[Index]);
      // PValue in String und Result zuweisen
      end;
  except end;
end;
So kannst du dann den Rückgabewert von GetValue zum Key als deinen Value verarbeiten.

Gruß oki

oki 23. Okt 2003 11:08

Hi, irgentwie ist mein Edit-Key nicht zu sehen.

Da war ein Schreibfehler!

in der Function GetValue muß es für
Delphi-Quellcode:
   PValue := PChar(Object[Index]);
so sein
Delphi-Quellcode:
   PValue := PChar(Objects[Index]);
Gruß oki

sentinal 23. Okt 2003 11:30

Re: Assoziatives Array oder ähnliches
 
Hallo,
werd ich dann wohl irgendwie so machen müssen, weil es ja anscheinend nichts direkters in Delphi gibt.

Ich sage mal Danke und werde dieses Thema als beantwortet markieren.

Ghostwalker 23. Okt 2003 12:12

Re: Assoziatives Array oder ähnliches
 
Da sowohl Key als auch Value vom Typ String sind kannst du einfach eine Stringliste verwenden.

Code:
var
  KeyValue : TStrings;
  erg : String;
 
begin
  //Stringlist erstellen und Key/Value durch ein = trennen;
  KeyValue := TStringlist.create;
  keyvalue.NameValueSeperator := '=';
 
  //Befüllen
  keyvalue.append(key+'='+value);

  //Suchen mit key
  erg := keyvalue.Value[Key];

  //Irgendwann wenns nimmer gebraucht wird freigeben
  KeyValue.free;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:59 Uhr.
Seite 1 von 3  1 23      

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