![]() |
AW: Fehlermeldung bei AssignFile
Zitat:
|
AW: Fehlermeldung bei AssignFile
Hallo,
die Showmessage liefert folgenden Text "Problem beim Lesen von myfile.dat! Fehler: 0" also "kein Fehler". Und das ganze nur dann, wenn es ein 64-Bit Windows ist und wenn es in Delphi 2010 kompiliert worden ist. Ob man es mit der Pfadangabe oder ohne macht spielt in dem Beispiel keine Rolle, das Ergebnis ist gleich. Es ist ein bitterer Fakt, dass ein uralter Compiler mit neuesten Betriebssystemen besser klarkommt als Delphi 2010. Vieles in der Unit System.pas in Delphi 3 (von der die Prozedur "Reset" kommt) wird in Delphi 3 in Assembler geschrieben, das macht die ganze Sache nach so vielen Jahren so zuverlässig - Hut ab. Wäre für wertvolle Tipps sehr dankbar. |
AW: Fehlermeldung bei AssignFile
Zitat:
Zitat:
Zitat:
|
AW: Fehlermeldung bei AssignFile
Eventuell auch mal GetLastError aufrufen oder das I- weglassen und sich die Exception ausgeben lassen. Und liegt der Fehler wirklich an dieser Stelle?
|
AW: Fehlermeldung bei AssignFile
Ich habe den Code ein bisschen überarbeitet.
Delphi-Quellcode:
Version 1.
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type myfile = RECORD name : string[100]; email : string[40]; end; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; SaveDialog1: TSaveDialog; OpenDialog1: TOpenDialog; procedure Lesen(Sender: TObject); procedure Schreiben(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; meinedatei : File Of myfile; satz : myfile; tmpIOResult : integer; implementation {$R *.dfm} procedure TForm1.Lesen(Sender: TObject); begin if OpenDialog1.Execute then begin OpenDialog1.FileName := ('myfile.dat'); AssignFile(meinedatei, OpenDialog1.FileName); // FileMode := fmShareDenyNone; {$I-} Reset(meinedatei); tmpIOResult := IOResult; {$I+} If IOResult <> 0 Then ShowMessage(OpenDialog1.FileName + ' nicht gefunden!' + #13 + 'Code: ' + IntToStr(tmpIOResult)) Else begin try Seek(meinedatei,0); except ShowMessage('Datensatz nicht gefunden!'); end; try read(meinedatei,satz); ShowMessage(satz.name + #13 + satz.email); except CloseFile(meinedatei); ShowMessage('Datensatz nicht lesbar!'); end; CloseFile(meinedatei); end; end; end; procedure TForm1.Schreiben(Sender: TObject); begin if SaveDialog1.Execute then { Dialog zum Speichern anzeigen } begin SaveDialog1.FileName := 'myfile.dat'; AssignFile(meinedatei, SaveDialog1.FileName); // FileMode := fmShareDenyNone; {$I-} Rewrite(meinedatei); tmpIOResult := IOResult; {$I+} If IOResult <> 0 Then begin ShowMessage('Kann die Datei nicht erstellen! Fehler: ' + IntToStr(tmpIOResult)); end Else begin satz.name := 'Test-Datensatz'; satz.email := 'info@testserver.de'; try write(meinedatei, satz); except on E : Exception do begin ShowMessage('Schreibfehler in myfile.dat!' + #13 + E.ClassName + ', Meldung: ' + E.Message); end; end; CloseFile(meinedatei); ShowMessage('myfile.dat erfogreich erstellt.'); end; end; // von SaveDialog1 end; end. Das Programm ist mit dem Delphi 2010 Compiler erzeugt. Mit der Prozedur "Schreiben" möchte ich zuerst die Datei erzeugen. Bei 32-Bit Windows Versionen (von Windows XP bis Windows 7) überhaupt keine Probleme. Bei Windows 7 Ultimate 64-Bit kommt zuerst "Schreibfehler in myfile.dat! EInOutError, Meldung: Dateizugriff verweigert" und direkt danach "E/A-Fehler 103" Version 2. Das Programm ist mit dem Delphi 3 Client/Server Compiler aus dem Jahr 1997 erzeugt und macht alles sauber von Windows XP bis 7, egal ob 32- oder 64-Bit (auch bei der oben genannten x64 Ultimate). Und was nun? |
AW: Fehlermeldung bei AssignFile
Hallo MSError,
in Deinem Code fallen einige Sachen auf... die beiden wichtigsten: 1. wieso verwendest Du OpenDialog1.Execute, um danach OpenDialog1.FileName im Code wieder zu überschreiben ? Oder soll der OpenDialog1 nur zum Wechseln des Verzeichnisses dienen...? Und wie Luckie bereits erwähnt hat, würde ich den kompletten (absoluten) Pfad zur Datei mit angeben. 2. anstatt
Delphi-Quellcode:
muss es heißen
If IOResult <> 0 Then
Delphi-Quellcode:
denn IOResult ist eine Funktion, die beim ersten Aufruf den letzten I/O-Status liefert, ab dem nächsten Aufruf aber immer 0 zurückliefert.
If tmpIOResult <> 0 Then
Gruß, blauweiss |
AW: Fehlermeldung bei AssignFile
Danke blauweiss für Deine Tipps.
Es ist aber nur eine kleine "Unschärfe" im Programm. tmpIOResult liefert "5" (Zugriff verweigert) also das gleiche, wie die Exception. Selbstverständlich verfüge ich über alle Administrationsrechte. Hier die korrigierte Prozedur:
Delphi-Quellcode:
Es läuft meiner Meinung nach eindeutig auf einen Bug in der System-Unit von Delphi 2010 hinaus.
procedure TForm1.Schreiben(Sender: TObject);
begin if SaveDialog1.Execute then { Dialog zum Speichern anzeigen } begin AssignFile(meinedatei, SaveDialog1.FileName); // FileMode := fmShareDenyNone; {$I-} Rewrite(meinedatei); tmpIOResult := IOResult; {$I+} If tmpIOResult <> 0 Then begin ShowMessage('Kann die Datei nicht erstellen! Fehler: ' + IntToStr(tmpIOResult)); end Else begin satz.name := 'Test-Datensatz'; satz.email := 'info@testserver.de'; try write(meinedatei, satz); except on E : Exception do begin ShowMessage('Schreibfehler in myfile.dat!' + #13 + E.ClassName + ', Meldung: ' + E.Message); end; end; CloseFile(meinedatei); ShowMessage('myfile.dat erfogreich erstellt.'); end; end; // von SaveDialog1 end; Gruß MSerror |
AW: Fehlermeldung bei AssignFile
Welches Verzeichnis wählst du denn aus?
|
AW: Fehlermeldung bei AssignFile
Verschiedene Verzeichnisse z.B. Temp, Eigene Dateien oder ein selbst erstelltes - volle Zugriffsrechte vorhanden.
|
AW: Fehlermeldung bei AssignFile
Das habe ich jetzt gerade mal durch Delphi 2010 auf Win 7 x64 durchlaufen lassen:
Delphi-Quellcode:
Ja und was war das Ergebnis? ..... wen wundert es ... alles super .... kein Murren kein Meckern einfach nur fertig.
type
TMyRec = record name : string[ 100 ]; Email : string[ 40 ]; end; procedure TForm1.FileSaveAs1Accept( Sender : TObject ); var MyFile : file of TMyRec; MyRec : TMyRec; tmpIOResult : Integer; begin AssignFile( MyFile, FileSaveAs1.Dialog.FileName ); {$I-} ReWrite( MyFile ); tmpIOResult := IOResult; {$I+} if tmpIOResult <> 0 then ShowMessage( Format( 'IOResult %d', [ tmpIOResult ] ) ) else try MyRec.name := 'Test'; MyRec.Email := 'Test@test.de'; write( MyFile, MyRec ); finally CloseFile( MyFile ); end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:24 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 by Thomas Breitkreuz