Entwickler-Ecke
Dateizugriff - File Access Error
sacharja - Do 02.02.06 01:18
Titel: File Access Error
Hallo,
ich bekomme besagte Fehlermeldung beil folgendem Code:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| if (Checkbox1.Checked) and (FileExists(ExtractFilePath(ParamStr(0)) + 'settings.ini')) then begin for i := 0 to Memo1.Lines.count - 1 do begin Memobox := Memo1.Lines[i]; if Memobox <> 'asdf' then Memobox := '<a href="' + Memobox + '">' + Memobox + '</a><br>'; end; Ini:=TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'settings.ini'); AssignFile(F, Ini.ReadString('Save', 'LastSavePath', '')); Append(F); WriteLn(F, Memo1.Lines.Text); CloseFile(F); end; |
Hat jemand eine Idee?
Narses - Do 02.02.06 01:23
Moin und :welcome: im Forum!
Du verwendest die Methoden des TIniFile-Klasse nicht korrekt. Leider geht aus deinem Quelltext nicht hervor, was du da eigentlich machen willst. Sag doch mal, was denn genau passieren soll, dann können wir dir mit dem Code helfen.
Aktuell vermischst du INI-Dateien mit "normalen" Textdateien. :wink:
cu
Narses
sacharja - Do 02.02.06 02:04
Also das Programm dient grundsätzlich dazu etwas in ein Memo einzugeben, was dann gespeichert wird und sich den bisherigen Speicherort merkt um dann beim nächsten automatisch etwas an das gespeicherte Memo zu hängen.
Die Ini ist also schon korrekt erstellt und beim nächsten Programm Aufruf sollte er jetzt den Code ausführen den ich gepostet habe, was dann zu dem Fehler führt.
Er soll eigentlich nur den Dateinamen aus der Ini auslesen und dann an die gewonnene Datei etwas anhängen.
Vielleicht stimmt etwas mit meinen Append nicht?
Neidhard von Reuental - Do 02.02.06 08:44
mir fallen da 3 sachen auf.
1.
Delphi-Quelltext
1: 2: 3:
| Memobox := Memo1.Lines[i]; if Memobox <> 'asdf' then Memobox := '<a href="' + Memobox + '">' + Memobox + '</a><br>'; |
du liest im Memobox den inhalt einer zeile von Memo1 ein, prüfst ob in der zeile "asdf" steht und wenn dies nicht der fall ist veränderst du Memobox und wiederholst das ganze solange bis alle zeilen von Memo1 abgearbeitet sind.
dabei wird Memobox aber ständig wieder überschrieben und die ganze arbeit ist um sonst. keine ahnung was du damit erreichen willst.
2.
Delphi-Quelltext
1:
| AssignFile(F, Ini.ReadString('Save', 'LastSavePath', '')); |
hier versuchst du aus der ini einen dateinamen zu holen der sich in sektion "Save" und schlüssel "LastSavePath" befindet. Das sollte funktionieren,aber nur wenn da auch ein dateiname enthalten ist. ansonsten wird ein leerer string zurück gegeben und versucht damit zu öffnen.das könnte dein problem sein. versuch den datei namen aus der ini erst mal in eine variable zu schieben und zu überprüfen ob die datei überhaupt exestiert (FileExists).
Delphi-Quelltext
1: 2: 3:
| Append(F); WriteLn(F, Memo1.Lines.Text); CloseFile(F); |
das sollte klappen solange die datei F auch existiert.
3.
du hast vergessen die ini-datei wieder frei zu geben ;) ( INI.Free; )
sacharja - Do 02.02.06 18:55
1. und 2. sind korrekt (Membox ist nur die Variable Memobox := Memo1.Lines[i];), aber 3. hat zumindest eine Veränderung gebracht. Ich habe also nach "Ini:=TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'settings.ini');", "Ini.Free;" geschrieben.
Jetzt hat sich der Fehler aber in folgende Fehlermeldung verwandelt:
"Access violation at address E88EB00E. Read of address E88EB00E."
Muss ich denn zuerst TIniFile.Create benützen, auch wenn ich nur einen String aus der Ini lesen will?
JayK - Do 02.02.06 19:04
Du darfst die ini natürlich erst nach deinen Operationen damit wieder freigeben, sonst zeigt der Bezeichner Ini ja "ins leere" ;)
Und ein allgemeiner aber wichtiger Hinweis: packe deine Ini-Dateien nie ins Programmverzeichnis. Benutze stattdessen den Anwendungsdaten-Ordner des Benutzers (--> Suche). Zum testen bei dir ist es noch in Ordnung, aber denke daran, falls du dein Prog veröffentlichst ;)
sacharja - Do 02.02.06 19:26
Zitat: |
Du darfst die ini natürlich erst nach deinen Operationen damit wieder freigeben, sonst zeigt der Bezeichner Ini ja "ins leere" ;) |
Jetzt habe ich sie ganz ans Ende getan und es taucht wiederum der Fehler "File Access denied." auf. Ich poste mal die ganze Procedure:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39:
| procedure TForm1.Button1Click(Sender: TObject); var i: integer; Memobox: string; Ini: TIniFile; F: Textfile; begin if (Checkbox1.Checked) and (FileExists(ExtractFilePath(ParamStr(0)) + 'settings.ini')) then begin for i := 0 to Memo1.Lines.count - 1 do begin Memobox := Memo1.Lines[i]; if pos('<a',Memobox) = 0 then Memobox := '<a href="' + Memobox + '">' + Memobox + '</a><br>'; end; Ini:=TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'settings.ini'); AssignFile(F, Ini.ReadString('Save', 'LastSavePath', '')); Append(F); WriteLn(F, Memo1.Lines.Text); CloseFile(F); end; if SaveDialog1.Execute then begin for i := 0 to Memo1.Lines.count - 1 do begin Memobox := Memo1.Lines[i]; if pos('<a',Memobox) = 0 then Memobox := '<a href="' + Memobox + '">' + Memobox + '</a><br>'; end; if (Checkbox1.Checked) then begin Ini:=TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'settings.ini'); Ini.WriteString('Save','LastSavePath',ExtractFileDir(SaveDialog1.FileName)); Memo1.lines.Savetofile(SaveDialog1.FileName); end else Memo1.lines.Savetofile(SaveDialog1.FileName); end; Ini.Free; end; |
Zitat: |
Und ein allgemeiner aber wichtiger Hinweis: |
Das Programm ist nur für mich gedacht ;) Außerdem gehör ich noch der alten Schule an und bin nur wegen Hardwareproblemen auf WinXP umgestiegen, bei Win9x hat die Benutzerverwaltung ja auch nie eine Rolle gespielt.
Neidhard von Reuental - Do 02.02.06 20:47
ist ganz schön verwirrend. da gibts einige stellen die für mich sehr durcheinander wirken. um das alles auseinander zu pflücken und zu kommentieren fehlt mir die lust ;)
habe aber deinen code überarbeitet und er läuft nun bei mir fehlerfrei. schau ihn dir an und ich hoffe du verstehst was ich geändert habe.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39:
| procedure TForm1.Button1Click(Sender: TObject); var i: integer; Memobox: string; Ini: TIniFile; F: Textfile; FN:string; begin Ini:=TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'settings.ini'); if (Checkbox1.Checked) then begin for i := 0 to Memo1.Lines.count - 1 do begin Memobox := Memo1.Lines[i]; if pos('<a',Memobox) = 0 then Memobox := '<a href="' + Memobox + '">' + Memobox + '</a><br>'; end; FN:=Ini.ReadString('Save', 'LastSavePath', ''); if FileExists(FN) then begin AssignFile(F,FN ); Append(F); WriteLn(F, Memo1.Lines.Text); CloseFile(F); end; end else if SaveDialog1.Execute then begin for i := 0 to Memo1.Lines.count - 1 do begin Memobox := Memo1.Lines[i]; if pos('<a',Memobox) = 0 then Memobox := '<a href="' + Memobox + '">' + Memobox + '</a><br>'; end; Ini.WriteString('Save','LastSavePath',SaveDialog1.FileName); Memo1.lines.Savetofile(SaveDialog1.FileName); end; Ini.Free; end; |
galagher - Do 02.02.06 20:57
Hallo! Zumindest dann, wenn - wie schon gesagt wurde - ein leerer String zurückgegeben wird, kommt es zu einem Fehler. Daher weise doch erstmal den Dateinamen einer Variablen zu und prüfe dann, ob sie leer ist. Wenn nein, weiter. Habe den Code allerdings nicht getestet.
Ach ja, ExtractFilePath(ParamStr(0)) + 'settings.ini' wird bei XP zu Problemen führen, wenn du in diese Datei als User mit eingeschränkten Rechten schreiben willst!
sacharja hat folgendes geschrieben: |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50:
| procedure TForm1.Button1Click(Sender: TObject); var i: integer; FName, Memobox: string; Ini: TIniFile; F: Textfile; begin if (Checkbox1.Checked) and (FileExists(ExtractFilePath(ParamStr(0)) + 'settings.ini')) then begin for i := 0 to Memo1.Lines.count - 1 do begin Memobox := Memo1.Lines[i]; if pos('<a',Memobox) = 0 then Memobox := '<a href="' + Memobox + '">' + Memobox + '</a><br>'; end; Ini:=TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'settings.ini');
FName := Ini.ReadString('Save', 'LastSavePath', '')
if FName = '' then begin exit; end;
AssignFile(F, FName); Append(F); WriteLn(F, Memo1.Lines.Text); CloseFile(F); end; if SaveDialog1.Execute then begin for i := 0 to Memo1.Lines.count - 1 do begin Memobox := Memo1.Lines[i]; if pos('<a',Memobox) = 0 then Memobox := '<a href="' + Memobox + '">' + Memobox + '</a><br>'; end; if (Checkbox1.Checked) then begin Ini:=TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'settings.ini'); Ini.WriteString('Save','LastSavePath',ExtractFileDir(SaveDialog1.FileName)); Memo1.lines.Savetofile(SaveDialog1.FileName); end else Memo1.lines.Savetofile(SaveDialog1.FileName); end; Ini.Free; end; |
|
sacharja - Fr 03.02.06 00:16
Super es funktioniert ;)
Vielen Dank für eure Hilfe und die super Kommentare. Hat mir wirklich weitergeholfen, zumal ich gerade erst mit Delphi anfange.
galagher - Fr 03.02.06 20:53
sacharja hat folgendes geschrieben: |
Super es funktioniert ;) |
Ich habe etwas vergessen - du musst die Ini-Datei freigeben:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| FName := Ini.ReadString('Save', 'LastSavePath', '')
if FName = '' then begin Ini.Free; exit; end; |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!