![]() |
Zugriffsverletzung beim Freigeben einer TStringList
Moin. Ich schreibe mir gerade eine Klasse zum einlesen und verarbeiten von csv-Files. Nun kommt es bei einer Testdatei (bei einer anderen tritt der Fehler nicht auf) zu einer Zugriffsverletzung bei "s.Free"
content ist deklariert als ARRAY of TStrings;
Delphi-Quellcode:
Wäre nett wenn mir jemand helfen könnte.
procedure TCsvDB.LoadFromFile(const fname: string);
var s : TStrings; i: Integer; begin try s := TStringList.Create; s.LoadFromFile(fname); Header.Delimiter := ';'; Header.StrictDelimiter := true; Header.DelimitedText := s[0]; headerCount := header.Count; lineCount := s.Count - 1; ShowMessage (IntToStr(linecount)); setlength(Content,lineCount); showmessage ('setlength'); for i := 1 to lineCount do begin Content[i] := TStringList.Create; Content[i].Delimiter := ';'; Header.StrictDelimiter := true; Content[i].DelimitedText := s[i]; end; finally s.Free; end; end; Gruß tr909 |
Re: Zugriffsverletzung beim Freigeben einer TStringList
for i:=0 to linecount-1 do
|
Re: Zugriffsverletzung beim Freigeben einer TStringList
Zitat:
Delphi-Quellcode:
lineCount := s.Count - 1;
|
Re: Zugriffsverletzung beim Freigeben einer TStringList
Zitat:
|
Re: Zugriffsverletzung beim Freigeben einer TStringList
Hi,
Zitat:
[ot] btw: Wenn es 0 Zeilen gibt, dass würde es zu einer anderen Exception kommen. Und für den Fall, dass vorher bereits eine CSV geladen wurde, solltest du die StringLists im Content-Array freigeben. Außerdem würde ich den Delimiter und StrictDelimiter nicht hardcoden, sodass deine Klasse später besser nutzbar wird. [/ot] Bist du sicher, dass das Problem in der Zeile mit s.Free liegt? Oder kommt die AV woanders? Ich sehe keinen Grund für eine AV, außer, dass es bereits ein Problem beim Create gibt. Dann müsstest du das Create vor Try setzen. Mfg FAlter [edit]Tja, dyn. Arrays beginnen aber mit 0, also wars doch nicht so falsch...
Delphi-Quellcode:
[/edit]
for i := 0 to lineCount - 1 do
begin Content[i] := TStringList.Create; Content[i].Delimiter := ';'; Header.StrictDelimiter := true; Content[i].DelimitedText := s[i+1]; end; |
Re: Zugriffsverletzung beim Freigeben einer TStringList
Zitat:
Delphi-Quellcode:
Und beim letzten überschreibt er irgendetwas unvorhersehbares.
setlength(Content,lineCount);
for i := 1 to lineCount do begin Content[i] := ... [Edit]Und wie ich unseren Compiler so kenne liegt nämlich das Array mit den Pointer direkt neben der Instanz von s[/Edit] Zitat:
|
[erl]Re: Zugriffsverletzung beim Freigeben einer TStringList
Jaja, dyn. Arrays beginnen bei 0. :roll:
Nun funktioniert es. Vielen Dank
Delphi-Quellcode:
Gruß
procedure TCsvDB.LoadFromFile(const fname: string);
var s : TStrings; i: Integer; begin try s := TStringList.Create; s.LoadFromFile(fname); Header.Delimiter := Delimiter; Header.StrictDelimiter := StrictDelimiter; Header.DelimitedText := s[0]; headerCount := header.Count; for i := 0 to linecount - 1 do Content[i].Free; lineCount := s.Count - 1; setlength(Content,lineCount); for i := 0 to lineCount-1 do begin Content[i] := TStringList.Create; Content[i].Delimiter := Delimiter; Header.StrictDelimiter := StrictDelimiter; Content[i].DelimitedText := s[i+1]; end; finally s.Free; end; end; tr909 |
Re: Zugriffsverletzung beim Freigeben einer TStringList
Verschiebe das "Try" noch um eine Zeile nach unten, also nach das s := TStringList.Create
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:45 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