Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Dictionary Probleme (https://www.delphipraxis.net/190648-dictionary-probleme.html)

haentschman 22. Okt 2016 11:53

Delphi-Version: 10 Seattle

Dictionary Probleme
 
Hallöle... :P

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. :gruebel:
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. :P

Uwe Raabe 22. Okt 2016 12:32

AW: Dictionarry Probleme
 
Bin mir nicht sicher, aber das
Delphi-Quellcode:
if Dict.TryGetValue(DataSet.FieldByName('NUMMER').AsString, Objekt) then begin

sieht mir so aus, als fehlt da ein
Delphi-Quellcode:
not
.

haentschman 22. Okt 2016 13:12

AW: Dictionarry Probleme
 
Danke... :P
Das ist ein Copy / Paste Fehler. :oops:

... war ein Test. :P

Korrekt:
Delphi-Quellcode:
if not Dict.TryGetValue(DataSet.FieldByName('NUMMER').AsString, Objekt) then begin
begin
Nachtrag:
Ich habe es jetzt mit dem Iterieren gemacht. Vieleicht hat jemand eine Idee was ich falsch gemacht habe.
Danke an Alle...:P


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