Delphi-PRAXiS
Seite 6 von 8   « Erste     456 78      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Fehlermeldung bei AssignFile (https://www.delphipraxis.net/157644-fehlermeldung-bei-assignfile.html)

Luckie 11. Feb 2011 02:15

AW: Fehlermeldung bei AssignFile
 
Zitat:

Zitat von Sir Rufo (Beitrag 1080978)
Das mit dem "ich will keinen Pfad angeben" ist schon grenzwertig ... erklärt aber den Fehler soweit noch nicht.

Aber trotzdem sollte man mögliche Fehlerquellen eliminieren, um den eigentlichen Fehler zu finden, denn wer weiß, was für Auswirkungen andere Fehler haben.

MSerror 11. Feb 2011 07:41

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.

Blup 11. Feb 2011 08:37

AW: Fehlermeldung bei AssignFile
 
Zitat:

Zitat von MSerror (Beitrag 1081002)
die Showmessage liefert folgenden Text "Problem beim Lesen von myfile.dat! Fehler: 0" also "kein Fehler".

Hast du deinen Code wirklich so geändert wie von Sir Rufo vorgeschlagen?
Zitat:

Zitat von Sir Rufo (Beitrag 1080978)
Delphi-Quellcode:
{...}
   tmpIOResult := IOResult;
      if tmpIOResult <> 0 
      then
        ShowMessage( 'Problem beim Lesen von myfile.dat! Fehler: ' + IntToStr( tmpIOResult ) );
{...}
end.

Zitat:

Zitat von Delphi-Hilfe
System.IOResult Funktion
Durch den Aufruf von IOResult wird das interne Fehler-Flag gelöscht.


Luckie 11. Feb 2011 10:48

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?

MSerror 11. Feb 2011 19:19

AW: Fehlermeldung bei AssignFile
 
Ich habe den Code ein bisschen überarbeitet.
Delphi-Quellcode:
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.
Version 1.
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?

blauweiss 11. Feb 2011 19:46

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:
If IOResult <> 0 Then
muss es heißen
Delphi-Quellcode:
If tmpIOResult <> 0 Then
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.

Gruß,
blauweiss

MSerror 11. Feb 2011 20:37

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:
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;
Es läuft meiner Meinung nach eindeutig auf einen Bug in der System-Unit von Delphi 2010 hinaus.

Gruß
MSerror

Luckie 11. Feb 2011 20:38

AW: Fehlermeldung bei AssignFile
 
Welches Verzeichnis wählst du denn aus?

MSerror 11. Feb 2011 20:50

AW: Fehlermeldung bei AssignFile
 
Verschiedene Verzeichnisse z.B. Temp, Eigene Dateien oder ein selbst erstelltes - volle Zugriffsrechte vorhanden.

Sir Rufo 11. Feb 2011 21:48

AW: Fehlermeldung bei AssignFile
 
Das habe ich jetzt gerade mal durch Delphi 2010 auf Win 7 x64 durchlaufen lassen:
Delphi-Quellcode:
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;
Ja und was war das Ergebnis? ..... wen wundert es ... alles super .... kein Murren kein Meckern einfach nur fertig.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:42 Uhr.
Seite 6 von 8   « Erste     456 78      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz