Delphi-PRAXiS
Seite 2 von 2     12   

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)

dersunny 19. Jan 2011 22:22

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?

alfold 19. Jan 2011 22:25

AW: Fehlermeldung bei AssignFile
 
Dir die 'listing.txt' angeschaut! Dann hättest Du es selbst gesehen :wink:

Gruss alfold

dersunny 19. Jan 2011 22:26

AW: Fehlermeldung bei AssignFile
 
LOL
Aber wenn mans ganz genau nimmt, hat niemand gesagt, dass ich die mir durchlesen soll... :p

Aphton 19. Jan 2011 22:28

AW: Fehlermeldung bei AssignFile
 
Uns auch nicht xD

Sir Rufo 19. Jan 2011 22:30

AW: Fehlermeldung bei AssignFile
 
Zitat:

Zitat von dersunny (Beitrag 1075949)
@Sir Rufo:
Wo habe ich nicht das gemacht, was Du wolltest?

Lies es nochmal durch:
Zitat:

Zitat von Sir Rufo (Beitrag 1075934)
Öffne bitte mal eine Eingabeaufforderung in dem Verzeichnis, wo die Anwendung liegt.
Dort führst du mal diesen Befehl aus:
Code:
dir /s >listing.txt
Die Datei
Code:
listing.txt
schieb dann mal hier hoch, dann sehen wir, wo die Datei steckt

Du hast dir in dem Verzeichnis ausgeführt, wo die Daten-Datei liegt! ;)

alfold 19. Jan 2011 22:31

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

Sir Rufo 19. Jan 2011 22:32

AW: Fehlermeldung bei AssignFile
 
Zitat:

Zitat von alfold (Beitrag 1075956)
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

Gebt mir ein D
Gebt mir ein E
Gebt mir ein L
Gebt mir ein Fluchtwagen :mrgreen:

MSerror 11. Feb 2011 00:16

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:
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.
Reset bricht ab, IOResult liefert "0" als Funktionsergebnis und zeigt trotzdem die Message "Problem beim Lesen..".:shock:
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?

Luckie 11. Feb 2011 00:27

AW: Fehlermeldung bei AssignFile
 
Delphi-Quellcode:
FileExists('myfile.dat')
Ähm, wo soll er die Datei finden? Ich gehe mal davon aus, du hast auf deinem Computer mehr als einen Ordner.

Sir Rufo 11. Feb 2011 02:07

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.

Luckie 11. Feb 2011 03: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 08: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 09: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 11: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 20: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 20: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 21: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 21:38

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

MSerror 11. Feb 2011 21:50

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

Sir Rufo 11. Feb 2011 22: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.

MSerror 12. Feb 2011 00:50

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

Sir Rufo 12. Feb 2011 01:01

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

MSerror 12. Feb 2011 01:10

AW: Fehlermeldung bei AssignFile
 
Liste der Anhänge anzeigen (Anzahl: 1)
Viel Spass

Sir Rufo 12. Feb 2011 01:24

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 ;)

Luckie 12. Feb 2011 01:46

AW: Fehlermeldung bei AssignFile
 
Zitat:

Zitat von MSerror (Beitrag 1081160)
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.

Das soll wohl ein Witz sein? Wie soll ein Compiler die Rechteverwaltung von Windows umgehen können?

MSerror 12. Feb 2011 01:48

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

Sir Rufo 12. Feb 2011 01:49

AW: Fehlermeldung bei AssignFile
 
Zitat:

Zitat von Luckie (Beitrag 1081167)
Zitat:

Zitat von MSerror (Beitrag 1081160)
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.

Das soll wohl ein Witz sein? Wie soll ein Compiler die Rechteverwaltung von Windows umgehen können?

Darum konnte ich über das ausgelobte Fass Bier ja auch lachen :mrgreen:

Luckie 12. Feb 2011 01:59

AW: Fehlermeldung bei AssignFile
 
Zitat:

Zitat von MSerror (Beitrag 1081168)
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.

Das tust du bestimmt nicht! Guck dir den Screenshot von SirRufo an und guck mal, wo die Dateien in Wirklichkeit laden. Davon abgesehen, dass die VCL, egal ob von D3 oder D2010, auch nur den Windows Dialog kapselt. Oder startest du D3 etwas mit Administratorenrechten und D2010 nicht? Dann ist es wieder was ganz anderes.

Sir Rufo 12. Feb 2011 02:04

AW: Fehlermeldung bei AssignFile
 
Zitat:

Zitat von Luckie (Beitrag 1081171)
Zitat:

Zitat von MSerror (Beitrag 1081168)
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.

Das tust du bestimmt nicht! Guck dir den Screenshot von SirRufo an und guck mal, wo die Dateien in Wirklichkeit laden. Davon abgesehen, dass die VCL, egal ob von D3 oder D2010, auch nur den Windows Dialog kapselt. Oder startest du D3 etwas mit Administratorenrechten und D2010 nicht? Dann ist es wieder was ganz anderes.

Da nimmt er mal wieder die Pointe vorweg ;)

Luckie 12. Feb 2011 02:17

AW: Fehlermeldung bei AssignFile
 
Einer muss der Spielverderber sein. ;)

vergessen 13. Feb 2011 02:39

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

Luckie 13. Feb 2011 02:49

AW: Fehlermeldung bei AssignFile
 
:glaskugel:
Code:
:glaskugel:
;)

vergessen 13. Feb 2011 03:14

AW: Fehlermeldung bei AssignFile
 
Zitat:

Zitat von Luckie (Beitrag 1081343)
:glaskugel:
Code:
:glaskugel:
;)

Danke!

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:

Sir Rufo 13. Feb 2011 03:27

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.
Seite 2 von 2     12   

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