AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Zugriffsverletzung beim Freigeben einer TStringList
Thema durchsuchen
Ansicht
Themen-Optionen

Zugriffsverletzung beim Freigeben einer TStringList

Ein Thema von tr909 · begonnen am 20. Jul 2007 · letzter Beitrag vom 20. Jul 2007
Antwort Antwort
tr909

Registriert seit: 5. Nov 2004
193 Beiträge
 
Turbo Delphi für Win32
 
#1

Zugriffsverletzung beim Freigeben einer TStringList

  Alt 20. Jul 2007, 09:55
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:
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;
Wäre nett wenn mir jemand helfen könnte.

Gruß
tr909
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Zugriffsverletzung beim Freigeben einer TStringList

  Alt 20. Jul 2007, 10:01
for i:=0 to linecount-1 do
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.201 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Zugriffsverletzung beim Freigeben einer TStringList

  Alt 20. Jul 2007, 10:04
Zitat von sirius:
for i:=0 to linecount-1 do
nee:
lineCount := s.Count - 1;
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Zugriffsverletzung beim Freigeben einer TStringList

  Alt 20. Jul 2007, 10:06
Zitat von Bernhard Geyer:
Zitat von sirius:
for i:=0 to linecount-1 do
nee:
lineCount := s.Count - 1;
Genau, und Dadurch wird die Größe von Content 1 zu klein
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von FAlter
FAlter

Registriert seit: 21. Jul 2004
Ort: Ostfildern
1.096 Beiträge
 
FreePascal / Lazarus
 
#5

Re: Zugriffsverletzung beim Freigeben einer TStringList

  Alt 20. Jul 2007, 10:08
Hi,

Zitat von sirius:
for i:=0 to linecount-1 do
Nein, dass ist es nicht - Linecount := s.Count - 1 und Zeile 0 ist der Header.

[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:
  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;
[/edit]
Felix Alter
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Zugriffsverletzung beim Freigeben einer TStringList

  Alt 20. Jul 2007, 10:11
Zitat von Bernhard Geyer:
Zitat von sirius:
for i:=0 to linecount-1 do
nee:
lineCount := s.Count - 1;
Doch:
Delphi-Quellcode:
setlength(Content,lineCount);
for i := 1 to lineCount do
begin
  Content[i] := ...
Und beim letzten überschreibt er irgendetwas unvorhersehbares.
[Edit]Und wie ich unseren Compiler so kenne liegt nämlich das Array mit den Pointer direkt neben der Instanz von s[/Edit]


Zitat von SirThornberry:
Genau, und Dadurch wird die Größe von Content 1 zu klein
Ja, das auch. Aber das hätte er sicherlich noch bemerkt. Zumal ich vermute, dass es ähnlich wie die showmessages (mehr oder weniger) wirres rumprobiere ohne Ziel war um den Fehler zu finden und demnächst eh wieder rausfliegt.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
tr909

Registriert seit: 5. Nov 2004
193 Beiträge
 
Turbo Delphi für Win32
 
#7

[erl]Re: Zugriffsverletzung beim Freigeben einer TStringList

  Alt 20. Jul 2007, 10:37
Jaja, dyn. Arrays beginnen bei 0.
Nun funktioniert es. Vielen Dank

Delphi-Quellcode:
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;
Gruß
tr909
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#8

Re: Zugriffsverletzung beim Freigeben einer TStringList

  Alt 20. Jul 2007, 10:43
Verschiebe das "Try" noch um eine Zeile nach unten, also nach das s := TStringList.Create
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:13 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz