Einzelnen Beitrag anzeigen

Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#1

Fehlermeldung bei Schreiben nach CSIDL_APPDATA

  Alt 15. Apr 2011, 17:42
Delphi-Version: 5
Die folgende Routine ist Bestandteil eines iniFile Parsers. SaveFile ist gelegentlich (!?) false. Ich suche schon seit Wochen, in den Apps kann ich jedoch keine Fehler entdecken. Dateien vom Typ TStrIniFile werden procdure intern vereinbart, erzeugt und freigegegen. Bei free wird ggf. SaveToFile aufgerufen. Ich bin mir sicher, daß innerhalb von TStrInfile kein Fehler ist.
Delphi-Quellcode:
function TStrIniFile.SaveFile : boolean;
var
  f: TextFile;
  i: integer;
begin
  RESULT:=false;
  AssignFile(f,FileName);
  {$I-} Rewrite(f); {$I+}
  if IoResult=0 then
  begin
    RESULT:=true;
    for i:=0 to Count-1 do
    begin
      if i>0 then
        if posIS[i]<0 then writeln(f);
      writeln(f,item[i]);
    end;
    closeFile(f);
  end;
  sleep(10);
  *** if not RESULT then ***
    MessageDlg(application.ExeName+': '+FileName+' is not ready for WRITE.',mtWarning,[mbOk],0);
end;

procedure TStrIniFile.UpdateFile;
begin
  if FileName<>'then
  begin
    SaveFile;
    IniFileChanged:=false;
  end;
end;

destructor TStrIniFile.Destroy;
begin
  if IniFileChanged then UpdateFile;
  inherited;
end;
Das Verzeichnis der Dateien ist:
verzA:=VerzMitSlash(trim(GetShellFolderPath(CSIDL_APPDATA)))+'Abel\'; Ein Hauptmenu wird mit einem {$R Adminrechte.res} gestartet und ruft die verschiedenen Apps so auf:
Delphi-Quellcode:
rocedure TForm101.ExecuteWinFileAndWait(Prozess: String);
var SI: TStartupInfo;
    PI: TProcessInformation;
begin
  screen.cursor:=crAppStart;
  FillChar(SI, SizeOf(SI), 0);
  SI.cb:= SizeOf(SI);
  SI.wShowWindow:= SW_SHOWNORMAL;
  if not CreateProcess(nil,PChar(Prozess),nil,nil,false,NORMAL_PRIORITY_CLASS,nil,PChar(VerzE),SI,PI) then
  begin
    messagedlg('... kann den Prozess nicht ausführen.',mterror,[mbok],0);
    EscDateiAnlegen;
  end
  else
  Begin
    WaitForSingleObject(PI.hProcess,INFINITE);
  End;
  screen.cursor:=crdefault;
end;
Woran könnte das liegen, daß es ab und zu nicht geht? Alle Ideen sind willkommen. // D2007
  Mit Zitat antworten Zitat