Thema: Delphi Dictionary Probleme

Einzelnen Beitrag anzeigen

Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.387 Beiträge
 
Delphi 12 Athens
 
#1

Dictionary Probleme

  Alt 22. Okt 2016, 12:53
Delphi-Version: 10 Seattle
Hallöle...

Ich bin am Modernisieren eines D5 Codes. Das bedeutet das ich viele Codenstellen erst in Generics austauschen muß. Das nimmt mir die Sichtbarkeit einer TObjectList z.B... Das Ergebnis ist eine TObjectliste mit Objekten die in der Schleife des Datasets produziert werden.

Gegeben ein Dataset (Query) unsortiert (fragt nicht warum... anders geht es nicht...sonst hätte ich die Probleme nicht) mit einer NUMMER(Feldname) (kann mehrfach vorkommen) und DETAILDATEN(Feldname).
Bsp:
NUMMER DETAILDATEN
1 1
1 2
2 2
1 3

Auf Grund der NICHT bestehen Sortierung wollte ich die Objekte anders zusammen setzen.
Prinzip:
1. Existiert das Objekt mit der NUMMER gehe zu 3. ansonsten erzeuge das Objekt bei 2.
2. Erzeuge das Objekt -> merken im Dictionary + in die Ergebnisliste
3. Detaildaten erzeugen (Liste)
4. Dictionary wegwerfen da alle Objekte in der Liste sind
Delphi-Quellcode:
Dict := TDictionary<string, Objekt>.Create;
.
.
while not DataSet.Eof do begin // ! unabhängig von der SQL Sortierung
  if Dict.TryGetValue(DataSet.FieldByName('NUMMER').AsString, Objekt) then begin
     // neues Objekt bei Änderung Nummer, ansonsten das Objekt aus dem Dictionary für die Detaildaten
    Objekt:= TObjekt.Create;
    Objekt.Number:= DataSet.FieldByName('NUMMER').AsString;
    ErgebnisListe.Add(Objekt); // sollte mit dem Pointer aus der Liste übereinstimmen ?
    Dict.Add(Objekt.Number, Objekt); // sollte mit dem Pointer aus der Liste übereinstimmen ?
  end;
  if DataSet.FieldByName('DETAILDATEN').AsString > '') then begin
    Detail:= TDetail.Create;
    Detail.Number:= Object.Number;
    Detail.Detaildaten := DataSet.FieldByName('DETAILDATEN').AsString;
    Objekt.DetailListe.Add(Detail); // Objekt sollte mit dem Pointer aus dem Dict übereinstimmen ?
  end;
  DataSet.Next;
end;
.
.
Dict.Free;
Es sieht danach aus das die Detailobjekte im Dictionary aktualisiert werden aber die Objekte in der Liste nicht. Wenn ich das ,temporäre' Dict wegwerfe das ist nur noch die Liste mit den Detaildaten.
Die Preisfrage ist ob die Objekte im Dict und der Liste den gleichen Pointer haben...

PS: Wenn ich das Dict weglasse sind zwar die Detaildaten da aber auch die Duplikate.(NUMMER)
PS: Die Ergebnisliste zu sortieren bringt nix da eigentlich nur eindeutige Objekte (NUMMER) enthalten sind.

PS: Sonst bleibt nur der Klassiker über die Suche in der Ergeblisliste und dem Iterieren;

Bitte erhellt mich.

Geändert von haentschman (22. Okt 2016 um 18:03 Uhr)
  Mit Zitat antworten Zitat