![]() |
AW: Fehlermeldung bei AssignFile
An alle: DANKE!
Jetzt haben wir (zumindest ich) mir den Abend mit so einem blöden Fehler versaut... @Sir Rufo: Wo habe ich nicht das gemacht, was Du wolltest? |
AW: Fehlermeldung bei AssignFile
Dir die 'listing.txt' angeschaut! Dann hättest Du es selbst gesehen :wink:
Gruss alfold |
AW: Fehlermeldung bei AssignFile
LOL
Aber wenn mans ganz genau nimmt, hat niemand gesagt, dass ich die mir durchlesen soll... :p |
AW: Fehlermeldung bei AssignFile
Uns auch nicht xD
|
AW: Fehlermeldung bei AssignFile
Zitat:
Zitat:
|
AW: Fehlermeldung bei AssignFile
Schon aus Neugierde würde ich mir sowas anschauen, nur um zu verstehen was @Sir Rufo mir da gesagt hat und was passiert ist, mit dieser Anweisung!
Er hätte Dir auch ein del geben können 8-) Gruss alfold |
AW: Fehlermeldung bei AssignFile
Zitat:
Gebt mir ein E Gebt mir ein L Gebt mir ein Fluchtwagen :mrgreen: |
AW: Fehlermeldung bei AssignFile
Ich benutze Delphi 2010 Pro.
Das Problem mit AssignFile und Reset gibt es auf allen Windows 7 x64 Distributionen.:sad: Hier ein Stück Code:
Delphi-Quellcode:
Reset bricht ab, IOResult liefert "0" als Funktionsergebnis und zeigt trotzdem die Message "Problem beim Lesen..".:shock:
type
myfile = RECORD name : string[100]; email : string[40]; end; var meinedatei : File Of myfile; begin if FileExists('myfile.dat') then begin AssignFile(meinedatei,'myfile.dat'); {$I-} Reset(meinedatei); {$I+} if IOResult <> 0 then ShowMessage('Problem beim Lesen von myfile.dat! Fehler: ' + IntToStr(IOResult)); CloseFile(meinedatei); end; end. Wenn ich allerdings den gleichen Code mit dem alten Delphi 3 Client/Server Compiler ausführbar mache, dann läuft es problemlos auf allen Windows Varianten egal ob es ein 32- oder 64-Bit Betriebssystem ist. Hat jemand eine Idee? |
AW: Fehlermeldung bei AssignFile
Delphi-Quellcode:
Ähm, wo soll er die Datei finden? Ich gehe mal davon aus, du hast auf deinem Computer mehr als einen Ordner.
FileExists('myfile.dat')
|
AW: Fehlermeldung bei AssignFile
Das mit dem "ich will keinen Pfad angeben" ist schon grenzwertig ... erklärt aber den Fehler soweit noch nicht.
Welchen Fehler bekommst du denn jetzt bei ShowMessage?
Delphi-Quellcode:
type
MyRec = record name : string[100]; email : string[40]; end; var MeineDatei : File Of MyRec; tmpIOResult : integer; begin if FileExists( 'myfile.dat' ) then begin AssignFile( MeineDatei, 'myfile.dat' ); {$I-} Reset( MeineDatei ); {$I+} tmpIOResult := IOResult; if tmpIOResult <> 0 then ShowMessage( 'Problem beim Lesen von myfile.dat! Fehler: ' + IntToStr( tmpIOResult ) ); CloseFile( MeineDatei ); end; end. |
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; |
AW: Fehlermeldung bei AssignFile
Vielen Dank Sir Rufo.
Wegen der Schutzmechanismen von Windows 7 bleibe ich doch noch bei dem Delphi 3 Compiler, mit dem ich im beliebigen Verzeichnis Dateien anlegen, verändern und löschen kann. Der ganze neueste Windows-Systemordnerschutz ist gegen den alten "Opa" wehrlos. Kurios, nicht wahr? Mal gucken wie lange. Viele Grüße MSerror |
AW: Fehlermeldung bei AssignFile
Das möchte ich erst sehen ... Lade doch mal ein kompiliertes Projekt hoch, was einfach so in den geschützten Ordnern schreiben kann.
Ich probiere das gerne aus um den Gegenbeweis anzutreten. Ich habe da so eine Vermutung, aber mach mal ;) Ach ja, wenn es klappt, dann stifte ich ein Fass Bier |
AW: Fehlermeldung bei AssignFile
Liste der Anhänge anzeigen (Anzahl: 1)
Viel Spass
|
AW: Fehlermeldung bei AssignFile
Liste der Anhänge anzeigen (Anzahl: 1)
Das war ein Satz mit X
Man muss halt genau schauen, wo die Datei hinwandert ;) Somit lässt sich Delphi 3 vera****** und Delphi 2010 bekommt das mit ;) |
AW: Fehlermeldung bei AssignFile
Zitat:
|
AW: Fehlermeldung bei AssignFile
Dass Windows 7 trickst und die Dateien umlenkt ist klar.
Der Unterschied liegt darin, dass ich mit sämtlichen FileSave-Komponenten von Delphi 3 ohne großen Aufwand in den sog. "System-Verzeichnissen" speichern kann auch ganz ohne Dialog-Fenster, was ich bei Delphi 2010 nicht geschafft habe. Viele Grüße MSerror |
AW: Fehlermeldung bei AssignFile
Zitat:
|
AW: Fehlermeldung bei AssignFile
Zitat:
|
AW: Fehlermeldung bei AssignFile
Zitat:
|
AW: Fehlermeldung bei AssignFile
Einer muss der Spielverderber sein. ;)
|
AW: Fehlermeldung bei AssignFile
Also was nun?
Das alte Delphi3 wurde mit Admin-Rechten gestartet und das neuere Delphi nicht? Und daher der Assi-Ärger? Wenn ich's finden würde, würde ich das Glaskugelsmiley einfügen ;-) MfG |
AW: Fehlermeldung bei AssignFile
:glaskugel:
Code:
;)
:glaskugel:
|
AW: Fehlermeldung bei AssignFile
Zitat:
Ist es denn wirklich schon soweit gekommen: Es kompiliert, also läuft es, daher kann ich es veröffentlichen? Manche Programme verhalten sich nun mal - von der IDE aus gestartet - anders als ohne IDE im Hintergrund... Bitte auf Facebook und Twitter folgen (wo ist der doppeldeutige Übergeben-Smiley?)... :wall: |
AW: Fehlermeldung bei AssignFile
Immerhin wollte er nicht über einen Modemsimulator Mails empfangen :mrgreen:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:21 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