Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TIniFile - Zugriffverletzung?? (https://www.delphipraxis.net/65113-tinifile-zugriffverletzung.html)

robinWie 12. Mär 2006 16:15


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:
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;
Um die eine Datei wieder in mehrere Dateien "aufzuspalten" habe ich mir folgende Möglichkeit überlegt, bei der aber eine Zugriffverletzung auftritt.
Delphi-Quellcode:
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;
[edit] ich habe mich mit den Code abschnitten vertan. :oops: :oops: :oops: :oops: :oops: [/edit]

kann mir jemand Helfen?
Danke im Voraus

Luckie 12. Mär 2006 16:16

Re: TIniFile - Zugriffverletzung??
 
Delphi-Quellcode:
for i:=0 to F.ReadInteger('Count','Files',0) - 1 do
Du läufst mit deiner Schleife vermutlich zu weit.

KingIR 12. Mär 2006 16:44

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;

robinWie 12. Mär 2006 16:48

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

marabu 12. Mär 2006 17:04

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