Einzelnen Beitrag anzeigen

shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#3

AW: Stringlist und tobject zum Xten mal

  Alt 6. Mai 2011, 17:05
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:
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;
Um ein Speicherleck zu verhinden muss man die Objekte auch wieder freigeben:
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;
Andreas

Geändert von shmia ( 6. Mai 2011 um 17:10 Uhr)
  Mit Zitat antworten Zitat