![]() |
Delphi-Version: 5
Fehlermeldung bei Schreiben nach CSIDL_APPDATA
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:
Das Verzeichnis der Dateien ist:
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;
Delphi-Quellcode:
Ein Hauptmenu wird mit einem {$R Adminrechte.res} gestartet und ruft die verschiedenen Apps so auf:
verzA:=VerzMitSlash(trim(GetShellFolderPath(CSIDL_APPDATA)))+'Abel\';
Delphi-Quellcode:
Woran könnte das liegen, daß es ab und zu nicht geht? Alle Ideen sind willkommen. // D2007
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; |
AW: Fehlermeldung bei Schreiben nach CSIDL_APPDATA
Hallo,
es wäre dann vielleicht hilfreich den ErrorCode von IOResult zu erfahren. Habe deswegen einige Änderungen im Code vorgenommen.
Delphi-Quellcode:
function TStrIniFile.SaveFile : boolean;
var f: TextFile; i: integer; errorCode : Integer; begin RESULT:=false; AssignFile(f,FileName); {$I-} Rewrite(f); {$I+} errorCode := IOResult; if errorCode=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 ['+sysErrorMessage(errorCode)+'].',mtWarning,[mbOk],0); end; Grüße Klaus |
AW: Fehlermeldung bei Schreiben nach CSIDL_APPDATA
Hi Klaus,
Exception.create bringt: Kann die Datei nicht öffnen. Was mir aber eben einfällt, was passiert denn, wenn die gleiche Datei von zwei Instanzen gleichzeitig geöffnet ist und im Destroy der Form beide sozusagen gleichzeitig geschrieben werden sollen. Gibt es da eine queue oder dann die Fehlermeldung? Ist mir eben eingefallen. Kann man ein Textdatei sharen wie einen Stream? Gruß Thomas |
AW: Fehlermeldung bei Schreiben nach CSIDL_APPDATA
Hallo,
rewrite öffnet die Datei exclusiv. Was bezweckst Du denn damit das zwei Instanzen die Datei bearbeiten dürfen? Die Configurationeinstellungen würde ich zentral bearbeiten (lesen und schreiben) und dann nur von einer Instanz (eine ![]() Grüße Klaus |
AW: Fehlermeldung bei Schreiben nach CSIDL_APPDATA
Liste der Anhänge anzeigen (Anzahl: 1)
Anlage errorCode
|
AW: Fehlermeldung bei Schreiben nach CSIDL_APPDATA
Zitat:
Grüße Klaus |
AW: Fehlermeldung bei Schreiben nach CSIDL_APPDATA
Stimmt, eigentlich ja, ist historisch begründet. Die Datei wird an 100-200 Stellen in der Software gelesen und/oder geschrieben, in der Form, in anderen Units, in mehreren Komponenten usw.. Ich werde die Datei jetzt global EINMAL in der Unit in initialization erzeugen und in finalization freigeben. Müsste doch funktionieren?
|
AW: Fehlermeldung bei Schreiben nach CSIDL_APPDATA
[OT]Mal was anderes: Was soll das
Delphi-Quellcode:
?[/OT]
Sleep(10);
|
AW: Fehlermeldung bei Schreiben nach CSIDL_APPDATA
Zitat:
und darin auch die Daten änderst. Grüße Klaus |
AW: Fehlermeldung bei Schreiben nach CSIDL_APPDATA
Hi Philip, war eine Verzweiflungstat für Give another Process a chance.
Klaus, funktioniert das auch noch bei Komponenten, die werden u.U. zur Laufzeit schon free und benutzen das selbe initialization/finalization wie die Formulare. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz