Autor |
Beitrag |
sacharja
      
Beiträge: 24
|
Verfasst: Do 02.02.06 01:18
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
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 02.02.06 01:23
Moin und  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.
cu
Narses
|
|
sacharja 
      
Beiträge: 24
|
Verfasst: 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
      
Beiträge: 268
XP
BDS 2006 Prof
|
Verfasst: 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.
Delphi-Quelltext
du hast vergessen die ini-datei wieder frei zu geben  ( INI.Free; )
|
|
sacharja 
      
Beiträge: 24
|
Verfasst: 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
      
Beiträge: 1013
|
Verfasst: 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 
      
Beiträge: 24
|
Verfasst: 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:
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
      
Beiträge: 268
XP
BDS 2006 Prof
|
Verfasst: 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. 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
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: 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: |
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; |
|
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
sacharja 
      
Beiträge: 24
|
Verfasst: 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
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Fr 03.02.06 20:53
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
|