AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TIniFile - Zugriffverletzung??

Ein Thema von robinWie · begonnen am 12. Mär 2006 · letzter Beitrag vom 12. Mär 2006
Antwort Antwort
Benutzerbild von robinWie
robinWie

Registriert seit: 26. Okt 2005
Ort: Lippcity
404 Beiträge
 
Delphi 2005 Personal
 
#1

TIniFile - Zugriffverletzung??

  Alt 12. Mär 2006, 15:15
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. [/edit]

kann mir jemand Helfen?
Danke im Voraus
Robin W.
Ein Computer kann (fast) alles.... Man muss es ihm nur beibringen
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: TIniFile - Zugriffverletzung??

  Alt 12. Mär 2006, 15:16
for i:=0 to F.ReadInteger('Count','Files',0) - 1 do Du läufst mit deiner Schleife vermutlich zu weit.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von KingIR
KingIR

Registriert seit: 19. Feb 2006
81 Beiträge
 
Delphi 2006 Professional
 
#3

Re: TIniFile - Zugriffverletzung??

  Alt 12. Mär 2006, 15:44
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;
  Mit Zitat antworten Zitat
Benutzerbild von robinWie
robinWie

Registriert seit: 26. Okt 2005
Ort: Lippcity
404 Beiträge
 
Delphi 2005 Personal
 
#4

Re: TIniFile - Zugriffverletzung??

  Alt 12. Mär 2006, 15:48
@ 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
Robin W.
Ein Computer kann (fast) alles.... Man muss es ihm nur beibringen
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

Re: TIniFile - Zugriffverletzung??

  Alt 12. Mär 2006, 16:04
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
  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 18:06 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