![]() |
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 |
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:
Ist ioerror nun true, so ist ein Fehler aufgetreten.
ioerror := IOResult <> 0;
Greetz alcaeus |
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:
mfg
ioerror := IOResult;
//Auswertungen dann mit: if ioerror <> 0 then begin //... end; eddy |
Re: IOResult funktioniert nicht korrekt
Zitat:
|
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 |
Re: IOResult funktioniert nicht korrekt
Wird IOError denn noch mal verwendet? Lass in dir mal mit ShowMessage ausgeben.
|
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:
also, ich begreif's nicht
function IOResult: Integer; // in der Unit System
begin Result := InOutRes; InOutRes := 0; end; mfg wespi [edit=Luckie]Benutz bitte das nächste mal Delphi-Tags. Danke. Mfg, Luckie[/edit] |
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+} |
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 |
Re: IOResult funktioniert nicht korrekt
Hallo wespi!
Hab grad bissl gestöbert und Deinen Beitrag gefunden und ein kleines Testprogramm geschrieben.
Delphi-Quellcode:
In Delphi: Meuü: Datei->Neu->Anewndung (Delphi3 -> Datei->Neue Anwendung)
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; 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 |
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 |
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.
|
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 |
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 |
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 |
Re: IOResult funktioniert nicht korrekt
Wird IOResult überhaupt noch supportet oder ist das nur noch aus Kompalität da.
|
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 |
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:
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.
function IOResult: Integer; // in der Unit System
begin Result := InOutRes; InOutRes := 0; end; |
Re: IOResult funktioniert nicht korrekt
Hallo Wespi!
Dann nimm doch Exceptions.
Delphi-Quellcode:
Schau Dir also mal die Exceptions an.
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; Viel Erfolg wünscht schöni |
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:
Nach system.reset(f) springt der debugger auf Zeile 8, als gäbe es keinen Io-Fehler.
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; 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. |
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. |
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? |
Re: IOResult funktioniert nicht korrekt
Zitat:
Delphi-Quellcode:
AFAIR war das auch schon bei TP7 so, dass vor dem Abfragen von IOResult erstmal {$I+} ausgeführt werden mussste...
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; Greetz alcaeus |
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:
{$I-} bzw. {$I+} muß nicht ständig umgeswitcht werden.
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; 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