![]() |
TIniFile - Zugriffverletzung??
Hallo,
ich habe mir für ein Musik Programm ein System ausgedacht um eine art Datenbank zu erstellen. Da wird für jeden Eintrag eine Datei geschrieben (Basierent auf TIniFile). Nun habe ich nach der möglickeit gesucht beim Exportieren dieser "Datenbank" alle information in einer Inifile zu schrieben. Da geht auch
Delphi-Quellcode:
Um die eine Datei wieder in mehrere Dateien "aufzuspalten" habe ich mir folgende Möglichkeit überlegt, bei der aber eine Zugriffverletzung auftritt.
procedure ExportBase(From,FileName: string; Files: TFileListBox);
var F,F2: TiniFile; i,i2: integer; Sec: string; begin Files.Mask:='*.'; F:=TIniFile.Create(FileName); F.WriteInteger('Count','Files',Files.Items.Count-1); for i:=0 to Files.Items.count-1 do begin Files.ItemIndex:=i; F.WriteString('FilesList','File '+IntToStr(i),ExtractFileName(Files.FileName)); end; for i:=0 to Files.Items.Count-1 do begin Files.ItemIndex:=i; F2:=TiniFIle.Create(Files.FileName); Sec:=ExtractFileName(Files.FileName); F.WriteString(Sec,'FileName',F2.ReadString('File','FileName','')); F.WriteString(Sec,'Title',F2.ReadString('ID','Title','')); F.WriteString(Sec,'Artist',F2.ReadString('ID','Artist','')); F.WriteString(Sec,'Album',F2.ReadString('ID','Album','')); F.WriteString(Sec,'Genre',F2.ReadString('ID','Genre','')); F.WriteString(Sec,'Year',F2.ReadString('ID','Year','')); F.WriteInteger(Sec,'Vote',F2.ReadInteger('ID','Vote',0)); F.WriteInteger(Sec,'CCount',F2.ReadInteger('C','Comments',0)); for i2:=0 to F2.ReadInteger('C','Comments',0) do F.WriteString(Sec,'C_Line '+IntToStr(i2),F2.ReadString('Comment','Line '+IntToStr(i2),'')); end; end;
Delphi-Quellcode:
[edit] ich habe mich mit den Code abschnitten vertan. :oops: :oops: :oops: :oops: :oops: [/edit]
var
F,F2: TiniFile; i,i2: integer; Sec: string; begin F:=TiniFile.Create('D:\Programme\Music Discover\files\Export.exp'); for i:=0 to F.ReadInteger('Count','Files',0) do begin Sec:=F.ReadString('FileList','File '+IntToStr(i),''); F2:=TiniFile.Create('D:\Programme\Music Discover\files\'+Sec); F2.WriteString('File','FileName',F.ReadString(Sec,'FileName','')); //Hier tritt die Zugriffsverletzung auf F2.WriteString('ID','Title',F.ReadString(Sec,'Title','')); F2.WriteString('ID','Artist',F.ReadString(Sec,'Artist','')); F2.WriteString('ID','Album',F.ReadString(Sec,'Ablum','')); F2.WriteString('ID','Genre',F.ReadString(Sec,'Genre','')); F2.WriteString('ID','Year',F.ReadString(Sec,'Year','')); F2.WriteInteger('ID','Vote',F.ReadInteger(Sec,'Vote',0)); F2.WriteInteger('C','Comments',F.ReadInteger(Sec,'Comments',0)); for i2:=0 to F.ReadInteger(Sec,'Comments',0) do F2.WriteString('Comment','Line '+IntToStr(i2),F.ReadString(Sec,'Line '+IntToStr(i2),'')); end; end; kann mir jemand Helfen? Danke im Voraus |
Re: TIniFile - Zugriffverletzung??
Delphi-Quellcode:
Du läufst mit deiner Schleife vermutlich zu weit.
for i:=0 to F.ReadInteger('Count','Files',0) - 1 do
|
Re: TIniFile - Zugriffverletzung??
Außerdem scheinst du den Speicher den die TINIFiles belegen, nicht wieder freizugeben. Das führt zu sog. Memory Leaks (der Arbeitsspeicher wird bis zum Programmende mit nicht mehr benötigten Daten vollgeschrieben). Also immer wenn du eine Variable (genauer gesagt eine Objekt-Instanz) nicht mehr brauchst, Variablenname.Free() aufrufen. Für Strings, Integers usw. erledigt Delphi das selber, aber für Objekte musst du dich ums Aufräumen kümmern. ;)
Beispiel für deine erste Prozedur:
Delphi-Quellcode:
procedure ExportBase(From,FileName: string; Files: TFileListBox);
var F,F2: TiniFile; //... begin //... F:=TIniFile.Create(FileName); //... for i:=0 to Files.Items.Count-1 do begin //... F2:=TiniFIle.Create(Files.FileName); //... F2.Free; // <----- Speicher freigeben! end; F.Free; // <----- Speicher freigeben! end; |
Re: TIniFile - Zugriffverletzung??
@ Luckie
Nee ich habe die 1 ja beim Speichern schon abegzogen. Habe ich aber trotzdem mal ausprobiert, geht nicht. Wenn ich das starte, läuft die Schleife nicht mal einmal durch sondern wird sofort beendent. @ KingIR Funzt trotzdem nicht. Das einige Ergebniss was sich zeit ist, dass nich mehr die Stelle angezeigt wird wo die Zugriffverletzung auftriff. Aber trotzdem danke |
Re: TIniFile - Zugriffverletzung??
Hallo Robin,
in der von dir markierten Code-Zeile kann nur ein Fehler auftreten, wenn F2 = nil ist. Setze einen Haltepunkt auf die Stelle und inspiziere F2. Grüße vom marabu |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:24 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 by Thomas Breitkreuz