![]() |
Variable nicht "leer"?
Moin
Ich habe folgenden Code:
Delphi-Quellcode:
Ich rufe die procedure einmal auf. Wenn ich sie ein 2.mal aufrufe sind die Daten von dem vorigen aufruf noch drin!
var sl_tmp : TStringlist;
s : string; begin sl_tmp := TStringlist.Create; while not(eof(datei)) do begin Readln(datei, s); sl_tmp.Add(s); end; FreeAndNil(sl_tmp); end; Wie ist das möglich? Wird nicht bei FreeAndNil auch der Speicher freigegeben und geleert? |
Re: Variable nicht "leer"?
liest Du nicht jedes Mal die Strings aus der Datei neu ein?
Und wo bleiben denn die Daten, bevor Sl_Tmp gefreet wird? |
Re: Variable nicht "leer"?
vielleicht habe ich mich etwas umständlich ausgedrückt.
Ich lese natürlich nicht immer die gleiche datei ein. Ich wollte euch blos etwas Code ersparen. Ich hab da halt ne Abfrage die auf andere Dateien dann verweist. Die Daten von sl_tmp werden auf eine andere Stringlist übertragen bevor sie "geFreet" wird. Aber wie gesagt nachdem ich den Code nochmal aufrufe ist die Stringliste sl_tmp nicht leer sondern die Daten von dem vorherigen Aufruf noch drin, dh jedesmal wenn ich die procedure aufrufe werden immer mehr daten angehängt. Jetzt etwas verständlicher? PS: Ich hab das oben noch ergänzt.(sl_tmp.add(s)) |
Re: Variable nicht "leer"?
und wie es, wenn du nur sl_tmp.Free benutzt?
|
Re: Variable nicht "leer"?
hä :gruebel: :wiejetzt: ?
Ich verstehe nicht was du mit deiner letzten Aussage sagen willst??? |
Re: Variable nicht "leer"?
Zitat:
FreeAndNil und .Free geben den Speicher der Instanz nur wieder frei. Der Speicher wird nicht gelöscht. Der Unterschied zwichen FreeAndNil und .Free ist "nur" das im ersten Fall der Variablen (die ja nur ein Pointer auf eine Instanz ist) der Wert NIL zugewiesen wird. Dies ist nützlich um im Programm abfragen zu können ob die "Variable" noch gültig ist. z.B.:
Delphi-Quellcode:
Warum bei dir noch Daten vorhanden sind ist aber nicht normal. Kannst Du etwas mehr Code zeigen?
procedure TForm1.Button1Click(Sender: TObject);
var sl1 : TStringList; sl2 : TStringList; begin sl1 := TStringList.Create; sl1.Free; sl2 := TStringList.Create; FreeAndNil (sl2); if Assigned(sl1) then begin ShowMessage ('SL1 verweisst noch auf eine Adresse'); end else begin ShowMessage ('SL1 verweisst nicht auf eine Adresse'); end; if Assigned(sl2) then begin ShowMessage ('SL2 verweisst noch auf eine Adresse'); end else begin ShowMessage ('SL2 verweisst nicht auf eine Adresse'); end; end; |
Re: Variable nicht "leer"?
Delphi-Quellcode:
Das ist schon der ganze Code. :gruebel:
var d_graph : Textfile;
d_ini : TIniFile; s : string; sl_tmp : TStringlist; begin sl_tmp := TStringlist.Create; assignfile(d_graph,{irgendeine datei}); reset(d_graph); while not(eof(d_graph)) do begin Readln(d_graph, s); sl_tmp.Add(s); end; closefile(d_graph); sMain.DrawData.AddStrings(sl_tmp);//sMain.DrawData ist eine Stringliste end; Keine Ahnung was ich da falsch gemacht haben könnte |
Re: Variable nicht "leer"?
Hai LoL,
und {irgendeine datei} ist beim zweiten Aufruf der Procedure eine Datei mit einem anderen Inhalt? Hmmm... Als Workaround könntest Du nach dem Erzeugen der TStingList einmal sl_tmp.Clear aufrufen um die SL zu leeren. BTW: Warum lädst Du die Datei mit der While-Do Schleife und nicht mit .LoadFromFile? |
Re: Variable nicht "leer"?
Und wo ist FreeAndNil()? :gruebel:
|
Re: Variable nicht "leer"?
1. jo ich leere sie halt jetzt mit clear wollte halt nur wissen woher der fehler kommt.
2. Weil ich in der einzelne Zeilen der Datei noch verändern muss bevor ich sie auf die Stringliste übertrage Hab ich jetzt vergessen kommt bei mir ganz unten da das eine 100 Zeilen procudure ist |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:41 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