Autor Beitrag
sacharja
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Do 02.02.06 01:18 
Hallo,
ich bekomme besagte Fehlermeldung beil folgendem Code:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 268

XP
BDS 2006 Prof
BeitragVerfasst: Do 02.02.06 08:44 
mir fallen da 3 sachen auf.
1.
ausblenden 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.
ausblenden 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).
ausblenden Delphi-Quelltext
1:
2:
3:
    Append(F);  
    WriteLn(F, Memo1.Lines.Text);  
    CloseFile(F);

das sollte klappen solange die datei F auch existiert.

3.
ausblenden Delphi-Quelltext
1:
end;					

du hast vergessen die ini-datei wieder frei zu geben ;) ( INI.Free; )
sacharja Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1013



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: 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:
ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 268

XP
BDS 2006 Prof
BeitragVerfasst: 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.
ausblenden volle Höhe 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;   // string der dateinamen enthalten soll
begin
  Ini:=TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'settings.ini'); // die ini öffnen wir gleich am anfang
  if (Checkbox1.Checked) then     // hier die fehlerhafte abfrage weg -> (and (FileExists(ExtractFilePath(ParamStr(0)) + 'settings.ini'))
  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'''); // dateiname in FN speichern
    if FileExists(FN) then    //hier prüfen ob die datei existiert
    begin
      AssignFile(F,FN );
      Append(F);
      WriteLn(F, Memo1.Lines.Text);
      CloseFile(F);
    end;
  end else      // savedialog nur ausführen wenn checkbox1 false ist
  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); // warum willst du den dateinamen weglassen? ohne ihn findet er die datei nicht. also weg mit "ExtractFileDir"
    Memo1.lines.Savetofile(SaveDialog1.FileName);
  end;    //hier auch die überflüssige anweisung weg -> "else Memo1.lines.Savetofile(SaveDialog1.FileName);"
  Ini.Free;  // so wie die ini am anfang geöffnet wurde wird sie am ende geschlossen
end;
galagher
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2556
Erhaltene Danke: 45

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: 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!

user profile iconsacharja hat folgendes geschrieben:

ausblenden volle Höhe 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');

    //Erstmal Dateiname auslesen
    FName := Ini.ReadString('Save''LastSavePath''')

    if FName = '' then
    begin
     //Eventuell eine Fehlermeldung
     exit;
    end;

    //Dann hier weiter
    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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2556
Erhaltene Danke: 45

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Fr 03.02.06 20:53 
user profile iconsacharja hat folgendes geschrieben:
Super es funktioniert ;)

Ich habe etwas vergessen - du musst die Ini-Datei freigeben:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
    //Erstmal Dateiname auslesen
    FName := Ini.ReadString('Save''LastSavePath''')

    if FName = '' then
    begin
     Ini.Free;
     //Eventuell eine Fehlermeldung
     exit;
    end;

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!