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.