Rewrite und 'Datei nicht gefunden'

Ich möchte beim Beenden meines Programmes die Einstellungen
speichern. Nun kommt immer wenn ich ein bestimmtes MDI-Child
Formular geöffnet hatte der Fehler „Datei nicht gefunden“ bei
der Speichern-Prozedur.
Ich habe verschiedene Sachen ausprobiert. Ich habe filemode
schon auf 1 und 2 geschalten, habe die Compileranweisung {$I-}
usw darumgeschrieben und auch einen kompletten Pfad mit
angegeben.
Es hilft alles nichts und wieso kommt der Fehler nur wenn ich
das eine Formular geöffnet hatte?
Also ich weiss jetzt nicht mehr weiter.

Danke
Mario

Ein Codesegment, welches das Speichern ausführt wäre hier hilfreich. Alle anderen Tipps kämen „Kaffeesatz-Lesen“ gleich.
Ein Tipp aus dieser Rubrik:
Stelle sicher, dass das Zielverzeichnis der Datei existiert. Dies ermöglicht die Prozedur „ForceDirectories(Dir: string)“.

Gruss
Uwe

Also ich speichere die Einstellungsdatei ins
Anwendungsverzeichnis.

procedure speichern;
var f : textfile;

begin
assignfile(f,
extractfilepath(application.exename)+‚einstellungen.dat‘);

{$I-}
rewrite(f);
{$I+}
if ioresult 0 then

closefile(f);
end;

…weitere Ansätze:
* gibt es im Gültigkeitsbereich bereits eine geöffnete Datei-Variable „F“? -das ist nicht erlaubt
* was zeigt der Debugger (F8-Einzelschritt) für „ExtractFilePath(Application.Exename)…“ an?
* Tritt der Fehler schon bei Rewrite(F) auf oder später (Debugger: F8-Einzelschritt)
* Ich empfehle nur {$I+} zu benutzen, und Fehler durch „Try…Except…End“-Blöcke abzufangen. Benutzt man {$I-}mit Abfrage von IOResult, so „schleppen“ sich I/O-Fehler bis zum nächsten Aufruf von IOResult weiter, auch wenn die letzte Dateioperation erfolgreich war! Kurz gesagt, wenn man {$I-} verwendet, dann sollte jede Dateioperation in der Applikation mit Aufruf von IOResult beendet werden. Das Ganze ist unübersichtlich und damit eher unbequem zu handhaben.
einfaches Beispiel für einen Schutzblock:


System.AssignFile(f,FileName);
try {try-except-Block}
System.Rewrite(F)
…// do anything
except
on E:Exception do
begin
//handle error
ShowMessage(‚Error :‘+E.Message)
end;
end;