![]() |
Stringlist und tobject zum Xten mal
Liebe Leute,
ich werde echt verrückt, weil ich den Fehler nicht finde:
Delphi-Quellcode:
Gibt Fehler. Kann mir jemand weiterhelfen, warum?!?
Procedure WerteInObject(liste: tstringlist);
var i: integer; Wort: string; Wert: string; templist: tstringlist; begin templist:= tstringlist.create; try templist.assign(Liste); Liste.clear; for i:= 0 to templist.Count-1 do begin Wort:= GibmirBeleg(templist.strings[i]); Wert:= GibmirFStr(templist.strings[i]); Liste.AddObject(Wort, Tobject(Wert)); end; finally templist.free; end; showmessage(liste.strings[5] + string(TObject(liste.objects[5]))); end; Danke und Gruß, frieder |
AW: Stringlist und tobject zum Xten mal
Wieder mal keine Ahnung was Du vorhast, aber denk mal über das nach: Tobject(Wert) bei Wert: string;
|
AW: Stringlist und tobject zum Xten mal
Der Cast von einem String auf TObject ist nicht erlaubt.
Grund: ein String unterliegt der Referenzzählung und wird von Delphi intern verwaltet. Sobald also die Variable Wert in der Schleife überschrieben wird, geht der Referenzzähler auf 0 und der String existiert nicht mehr. Ausweg: ein richtiges Objekt verwenden
Delphi-Quellcode:
Um ein Speicherleck zu verhinden muss man die Objekte auch wieder freigeben:
type
TKeyValueObject = class(TObject) public Key, Value : string; end; ... for i:= 0 to templist.Count-1 do begin keyobj := TKeyValueObject.Create; keyobj.Key := GibmirBeleg(templist.strings[i]); keyobj.Value := GibmirFStr(templist.strings[i]); Liste.AddObject(keyobj.Key, keyobj); end;
Delphi-Quellcode:
procedure StringsFreeObjects(sl: TStrings);
var i: Integer; o: TObject; begin for i := sl.Count-1 downto 0 do begin o := sl.Objects[i]; if Assigned(o) then begin o.Destroy; // spart Zeit gegenüber .Free sl.Objects[i] := nil; end; end; end; |
AW: Stringlist und tobject zum Xten mal
Entschuldigt, meine erste Nachricht war wohl zu emotional :)
Ich habe eine Stringlist mit Daten gefüllt (geladen aus TXT), die ich so umwandeln möchte, dass die zuvor allein als String gespeicherten Variablen aufgeteilt werden in Wort und Wert (beide Strings), wobei der Wert als TObject gespeichert werden soll. Hintergrund: "Wert" beinhaltet eigentlich einen Extended-Wert, für den ich vermeiden wollte, eine extra Klasse schreiben zu müssen, daher der Versuch, als String in TObject zu kapseln. Die Stringlist soll dann später sortiert werden (CustomSort) über den Extended-Wert in TObject. EDIT: @Shmia: Ja, danke, dann muss ich wohl... Gruß, frieder |
AW: Stringlist und tobject zum Xten mal
Wäre es vllt. eine Möglichkeit für "Wert" einen Shortstring zu verwenden?
Soweit ich weiß hat der mit Referenzzählung nichts am Hut!? Gruß K-H |
AW: Stringlist und tobject zum Xten mal
Wieso kapselst du das eigentlich in TObject? Füg' das doch direkt als String an.
|
AW: Stringlist und tobject zum Xten mal
Naja, erstens sieht man es ja dann, was nicht immer gewünscht ist, und Extended sollte IMO auch Extended bleiben.
|
AW: Stringlist und tobject zum Xten mal
Wer am Speichermanagement (von "Wert") rumspielt und keine Ahnung hat was er da macht, wärend er die Referenzzählung umgeht,
der muß halt damit Leben, daß die automatische Speicherverwaltung des Strings ihm einen Strich durch die Rechnung macht. :twisted: |
AW: Stringlist und tobject zum Xten mal
Zitat:
Delphi-Quellcode:
So kleine Klassen lassen sich leicht testen und sind einfach zu verstehen.
type
TKeyValueObject = class(TObject) public Key : string; Value : Extended; // der übergebene String wird in "Key" und "Value" zerlegt procedure Parse(const s:string); // vergleicht das übergebene Objekt mit self // liefert -1, 0 oder +1 zurück procedure CompareByValue(x:TKeyValueObject):Integer; end; Der Code im Formular nimmt ab und die Gesamtqualität wird besser. |
AW: Stringlist und tobject zum Xten mal
MOrgen zusammen,
danke für die Tipps, das (@shmia) werde ich machen. Nur eine Frage im Voraus: ich mache das Ganze eigentlich nur, weil ich meine Liste schneller sortieren muss (schneller, als es z.B. ein ListView macht, in dem die Daten bereits geparst wurden). Frage noch: IST die Arbeit mit einer Stringlist + eigenem Object eine bessere Möglichkeit zum schnellen Sortieren von Key+Value oder gibt es schnellere / einfachere Möglichkeiten (ist zB ein Array schneller als eine Stringlist?)? EDIT: Ich las gerade aaS im Forum, dass Sortierung eigentlich eine Sache der Darstellung, nicht der Daten sei. Dann sag ich vlt. doch genauer wo ich hin will: Ich möchte aus der Liste einfach die n (z.B. n=5) größten Werte herausziehen und ausgeben, ich brauche nicht die komplette Listenreihenfolge. - Vlt. muss ich dafür gar nicht sortieren? Danke und schönes WE, frieder |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:31 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz