AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Fehlermeldung bei AssignFile

Ein Thema von dersunny · begonnen am 19. Jan 2011 · letzter Beitrag vom 13. Feb 2011
Antwort Antwort
Seite 6 von 8   « Erste     456 78      
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#51

AW: Fehlermeldung bei AssignFile

  Alt 11. Feb 2011, 02:15
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
MSerror

Registriert seit: 28. Jan 2010
10 Beiträge
 
Delphi 2010 Professional
 
#52

AW: Fehlermeldung bei AssignFile

  Alt 11. Feb 2011, 07:41
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.
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#53

AW: Fehlermeldung bei AssignFile

  Alt 11. Feb 2011, 08:37
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?
Delphi-Quellcode:
{...}
   tmpIOResult := IOResult;
      if tmpIOResult <> 0
      then
        ShowMessage( 'Problem beim Lesen von myfile.dat! Fehler: ' + IntToStr( tmpIOResult ) );
{...}
end.
Zitat von Delphi-Hilfe:
System.IOResult Funktion
Durch den Aufruf von IOResult wird das interne Fehler-Flag gelöscht.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#54

AW: Fehlermeldung bei AssignFile

  Alt 11. Feb 2011, 10:48
Eventuell auch mal GetLastError aufrufen oder das I- weglassen und sich die Exception ausgeben lassen. Und liegt der Fehler wirklich an dieser Stelle?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
MSerror

Registriert seit: 28. Jan 2010
10 Beiträge
 
Delphi 2010 Professional
 
#55

AW: Fehlermeldung bei AssignFile

  Alt 11. Feb 2011, 19:19
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?

Geändert von MSerror (11. Feb 2011 um 19:23 Uhr) Grund: Code-Korrektur
  Mit Zitat antworten Zitat
blauweiss

Registriert seit: 19. Jun 2007
142 Beiträge
 
#56

AW: Fehlermeldung bei AssignFile

  Alt 11. Feb 2011, 19:46
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
If IOResult <> 0 Then muss es heißen
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
  Mit Zitat antworten Zitat
MSerror

Registriert seit: 28. Jan 2010
10 Beiträge
 
Delphi 2010 Professional
 
#57

AW: Fehlermeldung bei AssignFile

  Alt 11. Feb 2011, 20:37
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
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#58

AW: Fehlermeldung bei AssignFile

  Alt 11. Feb 2011, 20:38
Welches Verzeichnis wählst du denn aus?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
MSerror

Registriert seit: 28. Jan 2010
10 Beiträge
 
Delphi 2010 Professional
 
#59

AW: Fehlermeldung bei AssignFile

  Alt 11. Feb 2011, 20:50
Verschiedene Verzeichnisse z.B. Temp, Eigene Dateien oder ein selbst erstelltes - volle Zugriffsrechte vorhanden.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#60

AW: Fehlermeldung bei AssignFile

  Alt 11. Feb 2011, 21:48
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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 6 von 8   « Erste     456 78      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:44 Uhr.
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