Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi IOResult funktioniert nicht korrekt (https://www.delphipraxis.net/40050-ioresult-funktioniert-nicht-korrekt.html)

wespi 10. Feb 2005 12:49


IOResult funktioniert nicht korrekt
 
Hallo,
ich bin von BP7 auf Delhi7 umgestiegen und versuche nun meine pas-files aus BP7-Zeiten unter Delphi zum Laufen zu kriegen.
Nun steh ich vor einem Fehler, der mich stark nervt :

1 {$I-}
2 assign(f,'fehler.rec');
3 reset(f);
4 ioerror := (IOResult = 0);

Die Datei fehler.rec existiert nicht.
Im Debug-Fenster überwachte Ausdrücke wird nach Abarbeiten von reset(f) IOResult mit Wert 2 angezeigt,
wie sich das bei nicht existierender Datei auch gehört, in ioerror steht jedoch nach Abarbeiten von Zeile 4 der Wert 0, statt 2.

Unter BP7 hat die source einwandfrei funktioniert;

Hat jemand 'ne Lösung ?????

Besten Dank für Eure Hilfe

alcaeus 10. Feb 2005 13:19

Re: IOResult funktioniert nicht korrekt
 
Hallo wespi,

IOResult hat einen Wert <> 0 falls ein Fehler aufgetreten ist. Deshalb müsste (logischerweise) die Zuweisung so lauten:
Delphi-Quellcode:
ioerror := IOResult <> 0;
Ist ioerror nun true, so ist ein Fehler aufgetreten.

Greetz
alcaeus

eddy 10. Feb 2005 13:22

Re: IOResult funktioniert nicht korrekt
 
Hallo wespi,

Deine 4. Programmzeile paßt nicht zu Deiner Erklärung.

ioerror := (IOResult = 0);

liefert entweder wahr oder falsch, dh. ioerror : Boolean;

Sollte Dein ioerror : Integer sein, mußt Du Deine 4. Zeile wandeln in:
Delphi-Quellcode:
  ioerror := IOResult;
  //Auswertungen dann mit:
  if ioerror <> 0 then begin
    //...
  end;
mfg
eddy

Luckie 10. Feb 2005 14:10

Re: IOResult funktioniert nicht korrekt
 
Zitat:

Zitat von wespi
in ioerror steht jedoch nach Abarbeiten von Zeile 4 der Wert 0, statt 2.

ioerror ist laut Zeile vier vom Datentyp Boolean. Wie läßt du dir da einen Integerwert ausgeben? Der Delphi sollte im Debugger True oder False anzeigen. Wobei False gleich null ist und alles andere True entspricht. Ergo stimmt das Ergebnis, was IOResult liefert.

wespi 10. Feb 2005 14:50

Re: IOResult funktioniert nicht korrekt
 
Hallo,
Entschuldigung, ich habe meinen Quelltext falsch wiedergegeben.
IoError ist ein Integer, der Compiler hätte das natürlich sofort angemeckert.

Zeile 4 heisst natürlich : IoError := IoResult;

Was jedoch nichts an der Tatsache ändert, dass nach Abarbeiten von Zeile 3 (reset) das Debugfenster zwar IoResult mit dem Wert 2 (fehlende Datei) meldet, dieser Wert jedoch nach Abarbeiten von Zeile 4 nicht in IoError steht, sondern der Wert 0.

also nochmals 'Tschuldigung, ich hoffe, dass mir trotzdem noch jemand weiterhilft

mfg

wespi

Luckie 10. Feb 2005 14:52

Re: IOResult funktioniert nicht korrekt
 
Wird IOError denn noch mal verwendet? Lass in dir mal mit ShowMessage ausgeben.

wespi 10. Feb 2005 15:36

Re: IOResult funktioniert nicht korrekt
 
Hallo,

nachdem ich Delphi-Neuling bin, musste ich erst mal nachsehen, wie Showmessage funktioniert.
Habe Showmessage jetzt so aufgerufen, ist es das , was Du meinst? :


3 reset(f);
4 Ioerror := ioresult;
5 showmessage(intToStr(ioerror));

Ergebnis ist ein kleines Meldungsfenster mit dem Wert 0.
Das habe ich auch nicht anders erwartet, denn ich sehe das ja auch im Überwachungsfenster des Debuggers, dass IoError den Wert 0 hat. Ich habe auch schon nachgesehen, ob ich IoError womöglich nochmal irgendwo deklariert habe, aber es existiert nur 1 mal und ist in der gleichen Unit deklariert, wo auch der Code steht. (var IoError : integer;)

Wenn ich den Debugger mit F7 in die System-Unit-Funktion Ioresult laufen lasse, wird schon auf dem "begin" im Überwachungs-Fenster des Debuggers der Wert 2 auf Wert 0 gesetzt. Ich hätte das erst nach der Zeile "result := InOutRes;" erwartet, weil ja lt. Definition IoResult nach!! Aufruf der Funktion zurückgesetzt werden soll.

Delphi-Quellcode:
function IOResult: Integer;  // in der Unit System
begin
  Result := InOutRes;
  InOutRes := 0;
end;
also, ich begreif's nicht

mfg wespi

[edit=Luckie]Benutz bitte das nächste mal Delphi-Tags. Danke. Mfg, Luckie[/edit]

NicoDE 10. Feb 2005 15:48

Re: IOResult funktioniert nicht korrekt
 
Vielleicht rufst Du nicht die erwarteten Funktionen auf... (wer weiss, denn der obige Code funktioniert erwartungsgemäß).
Schreib zur Sicherheit / zum Testen den Namensraum (Unitname) vor die Variablen und Funktionen:
Delphi-Quellcode:
{$I-}
  System.AssignFile(F, '?invalid?');
  System.Reset(F);
  IoError := System.IOResult;
{$I+}

wespi 10. Feb 2005 16:05

Re: IOResult funktioniert nicht korrekt
 
Hab's gerade probiert :

system.assignFile(f,'fehler.rec');
system.reset(f);
Ioerror := system.ioresult;
showmessage(intToStr(ioerror));


----> das gleiche Ergebnis.

Und das auf zwei unterschiedlichen PC's mit unterschiedlichen OS (WinXP und Win2000) und mit Delphi 5 und Delphi 7.
Immer die gleiche Sch....

wenn das so weitergeht, mach ich wieder Turbo-Pascal !!! , da funktionierts problemlos


mfg wespi

schöni 10. Feb 2005 16:19

Re: IOResult funktioniert nicht korrekt
 
Hallo wespi!

Hab grad bissl gestöbert und Deinen Beitrag gefunden und ein kleines Testprogramm geschrieben.

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var F: file; IoError: Integer;
begin
{$I-}
  System.AssignFile(F, '?invalid?');
  System.Reset(F);
  IoError := System.IOResult;
{$I+}
  ShowMessage('Fehlernummer: ' + IntToStr(IoError));
end;
In Delphi: Meuü: Datei->Neu->Anewndung (Delphi3 -> Datei->Neue Anwendung)

DoppelClick auf Form1 -> FormCreate-Methode wird erzeugt. Dort schreibst Du obigen Text rein. Nicht vergessen: var F: File; IOERror: Integer; Sonst beschwert sich der Compiler.

Viel Erfolg

schöni

wespi 10. Feb 2005 16:49

Re: IOResult funktioniert nicht korrekt
 
hab's probiert -------------> funktioniert, ergibt Fehlerfenster mit Fehler 123

Nur nützt mir das recht wenig, weil Ziel meines Programms nicht das das Darstellen eines Fehlerfensterchens ist, sondern gefälligst 'n bischen mehr.

Auf jeden Fall zeigt es, dass Delphi auch ordentlich laufen kann, wenn nicht irgendwelche ???? Umstände eintreten.

Ich hab' unter BP7 schon alles mögliche programmiert, das hatte jedenfalls nie zur Folge, dass IoResult nicht mehr funktionierte.

Vielleicht hängt es mit dem Einbinden von HighResTimer (eine microsec-genaue Timerkomponente) oder mit dem Verwenden von IO.dll (erlaubt Portzugriffe unter XP) zusammen.

Dass sich aber Delphi dadurch so durcheinander bringen lässt ????!!!!!, dass IoResult nicht mehr funktioniert, macht mich nicht gerade froh.


mfg wespi

franktron 10. Feb 2005 16:59

Re: IOResult funktioniert nicht korrekt
 
Mal ne ganz doofe Frage warum fragste nicht einfach mit fileexists('fehler'.rec') ab ob die File da ist dann brauchste keine IOResult mehr.

wespi 10. Feb 2005 17:08

Re: IOResult funktioniert nicht korrekt
 
Berechtigte Frage, aber es geht ja beim Aufruf von IoResult nicht immer nur darum, ob ein file existiert, sondern um alle möglichen Dateifehler (read,write,eof......)

und wenn die funktion bei reset nicht korrekt läuft, wie soll ich mich dann in allen möglichen Situationen darauf verlassen können ?

Also das hilft auch nicht so recht weiter, trotzdem vielen Dank, dass Ihr Euch um meine Probleme schert.

mfg wespi

roderich 10. Feb 2005 17:47

Re: IOResult funktioniert nicht korrekt
 
mal ne dumme(?) Idee:
Wie man weiß, wird der Wert von IOResult nach dessen Abfrage (IOResult ist nämlich eine Funktion !) wieder auf 0 gesetzt.
Kann es sein, daß durch die Anzeige von IOResult im Watch-Fenster genau dies passiert ? Probier's mal ohne IOResult im Watch-Fenster aus !

Gruß
Roderich

wespi 10. Feb 2005 18:09

Re: IOResult funktioniert nicht korrekt
 
Danke für den Tip, hatte ich aber auch schon mal probiert und hat nichts gebracht(schon bevor ich um Hilfe gebeten habe).
Ausserdem dürfte es dann mit dem kleinen Prögrämmchen von weiter oben auch nicht funktionieren, da war's aber auch mit watchfenster ok.



mfg wespi

franktron 10. Feb 2005 18:38

Re: IOResult funktioniert nicht korrekt
 
Wird IOResult überhaupt noch supportet oder ist das nur noch aus Kompalität da.

wespi 10. Feb 2005 19:21

Re: IOResult funktioniert nicht korrekt
 
Weiss ich nicht, aber das was Borland (oder Inprise?) an "Funktionen" anbietet, sollte doch auch "funktionieren", oder?
Sonst sollten die gleich sagen -- wird aus dem Sprachumfang gestrichen !
mfg wespi

Luckie 10. Feb 2005 21:55

Re: IOResult funktioniert nicht korrekt
 
Du musst irgendwo einen Fehler in deinem Code haben. Ich habe diese Funktion schon tausende Male benutzt und es hat bisher immer geklappt. Rufst du vielleicht IOResult zwei mal auf? Dass es dann beim zweiten mal 0 ist wenn keine Aus- und Eingabeoperationen stattgefunden haben, ist ja dann klar.

Delphi-Quellcode:
function IOResult: Integer;  // in der Unit System
begin
  Result := InOutRes;
  InOutRes := 0;
end;
Und hier wird nicht der Rückgabewert der Funktion auf Null gesetzt, sondern die gloable Variable InOutRes, damit sie für den nächsten Aufrufer wieder mit null initialisiert ist.

schöni 10. Feb 2005 22:05

Re: IOResult funktioniert nicht korrekt
 
Hallo Wespi!

Dann nimm doch Exceptions.

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var F: file;
begin
  try
    System.AssignFile(F, '?invalid?');
    System.Reset(F);
  except
    On EInOutError do ShowMessage('Fehlernummer: ' + IntToStr(IoError));
    //Ich glaub, es war EInOutError bei Dateifehler
  end;
end;
Schau Dir also mal die Exceptions an.

Viel Erfolg wünscht

schöni

wespi 11. Feb 2005 00:32

Re: IOResult funktioniert nicht korrekt
 
Try .. except .. end ist mir als "Pascaler" noch etwas fremd, habe aber jetzt auch das probiert.
Bei mir wird der except .. end code-teil nicht durchlaufen, obwohl definitif ein Dateifehler auftreten muss, denn es existiert ja kein file 'fehler.rec'.

Delphi-Quellcode:
1 try
2   system.assignFile(f,'fehler.rec');
3   system.reset(f);
4 except
5   Ioerror := system.ioresult;
6   showmessage(intToStr(ioerror));
7 end;
8 if (IoError = 0) then
9 begin
10  //Anweisungen
11 end;
Nach system.reset(f) springt der debugger auf Zeile 8, als gäbe es keinen Io-Fehler.

Ich gewinne immer mehr den Eindruck, dass die installierte Komponente "HighResTimer.pas" oder die verwendete "IO.DLL", die ich beide aus dem Internet habe und die beide recht hardwarenah programmiert sind, dieses seltsame Verhalten auslösen.
Vielleicht auch mein Umgang mit diesen, die Xp oder Win2000 ja in einer Form überlisten sollen, die Bill gar nicht so zulassen wollte.
Denn Zugriffe auf Ports oder die Verwendung der internen Timer ist ja eigentlich seit NT nicht mehr zulässig.

Mein Ziel ist es (oder war, wenn's nicht funktioniert) jedenfalls, mein unter DOS in BP7 geschriebenes Programm, das mithilfe einer selbstgebauten ISA-Karte und der zugehörigen Steuerkiste imstande war, die Betriebsmoment-Kennlinien und Start-Stop-Kenlinien von Schrittmotoren zu ermessen und zu dokumentieren, nach Delphi zu portieren.
Ich habe, nachdem ich im Netz diese beiden Programme (IO.DLL und HighresTimer) entdeckt habe, die Möglichkeit gesehen, ohne allzu grossen Aufwand, genau das zu verwirklichen.

Unter DOS und BP7 hat das wunderbar geklappt.

Teiber unter WinXP oder Win2000 zu programmieren ist mir zu aufwendig (vielleicht bin ich auch zu blöd dazu).

Ich werde also noch ein bischen selbst probieren, die Probleme unter Delphi zu beseitigen und bedanke mich auf's schärfste bei allen, die nicht Zeit und Mühe gescheut haben, mir zu helfen, wenn auch ohne Erfolg.

Vielleicht findet sich ja auch noch jemand, der bereits Erfahrung mit den vorgenannten Programmen hat, und diese Probleme bereits erschlagen hat.

Jedenfalls besten Dank an alle

mfg wespi

p.s. ich hätte allerdings nicht angenommen, dass Delphi sich in seine Funktionen pfuschen lässt, egal wie die verwendeten Komponenten oder DLL's programmiert sind.
Na ja unter DOS war halt alles etwas übersichtlicher und einfacher --- auch für Borland-Programmierer.

d-a2005 11. Feb 2005 07:56

Re: IOResult funktioniert nicht korrekt
 
Unter TP gabs mal FileMode, damit konnte man angeben, ob eine Datei nur zum Lesen, zum Schreiben oder für beides geöffnet werden soll.

Werte für FileMode waren 0,1, und 2, soweit ich weiß.

Vielleicht hilft dir das.

d-a2005 11. Feb 2005 09:06

Re: IOResult funktioniert nicht korrekt
 
Ach ja, muß es nicht überhaupt so heißen:

1 {$I-}
2 assign(f,'fehler.rec');
3 reset(f);
4 {$I+}
5 ioerror := (IOResult = 0);


also erst {$I+} wieder einschalten?

alcaeus 11. Feb 2005 09:10

Re: IOResult funktioniert nicht korrekt
 
Zitat:

Zitat von d-a2005
Ach ja, muß es nicht überhaupt so heißen:

1 {$I-}
2 assign(f,'fehler.rec');
3 reset(f);
4 {$I+}
5 ioerror := (IOResult = 0);


also erst {$I+} wieder einschalten?

das hab ich mir auch schon gedacht, und in der Delphi-OH ist es auch so drin:
Delphi-Quellcode:
var
  F: file of Byte;
begin
  if OpenDialog1.Execute then
  begin
    AssignFile(F, OpenDialog1.FileName);
    {$I-}
    Reset(F);
    {$I+}
    if IOResult = 0 then
    begin
      MessageDlg('File size in bytes: ' + IntToStr(FileSize(F)),
        mtInformation, [mbOk], 0);
      CloseFile(F);
    end
    else
      MessageDlg('File access error', mtWarning, [mbOk], 0);
  end;
end;
AFAIR war das auch schon bei TP7 so, dass vor dem Abfragen von IOResult erstmal {$I+} ausgeführt werden mussste...

Greetz
alcaeus

eddy 11. Feb 2005 09:33

Re: IOResult funktioniert nicht korrekt
 
Hallo wespi,

Dein Fehler ist kaum nachvollziehbar (siehe Luckis Beitrag).

Hier nochmal der Standardaufbau, den ich dann jeweils bei Bedarf anpasse.

Delphi-Quellcode:
uses
  System;  

var
  ioerr : integer;

begin
    {$I-}
    AssignFile(f, lw_path_und_filename);
    Reset(f); // für Lesen oder
    Append(f); // für Anhängen
    if IOResult <> 0 then begin // Fehler beim Öffnen
      Rewrite(f);
      ioerr := IOResult;
      if ioerr <> 0 then begin
        ShowMessage('Datei konnte nicht angelegt werden' + chr($0A)+chr($0D) + 
                    'Fehler-Nummer: ' + IntToStr(ioerr));
        exit;
      end;
    end;
    Append(f);
    Writeln(f, 'irgendwas');
    Flush(f); // Sicherstellen, daß der Text tatsächlich in die Datei geschrieben wird.
    CloseFile(f);
    {$I+}
end;
{$I-} bzw. {$I+} muß nicht ständig umgeswitcht werden.

Wegen so einem Fehler wieder auf TP umsteigen, ich würd's mir noch mal überlegen. Es gibt nunmal gelegentlich Fehler, wo man einen halben Tag sucht, nur um festzustellen, daß die Logik von Delphi nicht kompatibel ist mit der Logik des Programmierers.

Zum Glück sind die meisten Programmierer lernfähig!!

mfg
eddy


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:50 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-2025 by Thomas Breitkreuz