Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Fehlermeldung EInOut Error (https://www.delphipraxis.net/6759-fehlermeldung-einout-error.html)

thorstenf01 21. Jul 2003 13:21


Fehlermeldung EInOut Error
 
Hallo!
Wer kann mir dabei helfen, den folgenden Fehler in der folgenden Ausgabeprozedur zu
finden, so daß die Ausgabe funktioniert.
Ich erhielt beim compilieren folgende Meldung:
"...Exception der Klasse EInOut Error...Meldung:'E/A-Fehler6'...

Code:
procedure TForm3.Button5Click(Sender: TObject);
var
  jk, jj, ss, kk  : integer;
  min, Sum, Sum1, Dif                       : real;
begin
  with StringGrid1 do
 begin
  StringGrid1.FixedCols:=0; StringGrid1.FixedRows:=1;
  StringGrid1.ColCount:=5; StringGrid1.RowCount:=367;
  StringGrid1.Cells[0,0]:='Tag';
  StringGrid1.Cells[1,0]:='Datum';
  StringGrid1.Cells[2,0]:='Abschattungsbeginn';
  StringGrid1.Cells[3,0]:='Abschattungsende';
  StringGrid1.Cells[4,0]:='Belastungszeit';
  kk:=0;
  for jk:=1 to 366 do
    if gSchatA[jk]>0 then begin
      kk:=kk+1;
      Tag:=jk;
      Deklination(Tag);
      AU(Tag);
      tAnfang:=0.1*SchatA[jk]+0.9*gSchatA[jk];
      Besser(tAnfang);
      Dif:= abs(gSchatA[jk]-gZeit);
      if (Dif < 0.00025) or (gZeit=0) then
        gSchatA[jk]:=gZeit
      else
        repeat
          tAnfang:=gSchatA[jk];
          Besser(tAnfang);
          Dif:=abs(gSchatA[jk]-gZeit);
          gSchatA[jk]:=gZeit;
        until Dif < 0.00025;
      tAnfang:=0.1*SchatE[jk]+0.9*gSchatE[jk];
      Besser(tAnfang);
      Dif:= abs(gSchatE[jk]-gZeit);
      if (Dif < 0.00025) or (gZeit=0) then
        gSchatE[jk]:=gZeit
      else
        repeat
          tAnfang:=gSchatE[jk];
          Besser(tAnfang);
          Dif:=abs(gSchatE[jk]-gZeit);
          gSchatE[jk]:=gZeit;
        until Dif < 0.00025;
      if gSchatA[jk]=0 then
        if gSchatE[jk] >0 then
          gSchatA[jk]:=gSchatE[jk];
      if gSchatE[jk]=0 then
        if gSchatA[jk] >0 then
          gSchatE[jk]:=gSchatA[jk];
      Belastung[jk]:=(SchatE[jk]-SchatA[jk])*60;
      gBela[jk]:=(gSchatE[jk]-gSchatA[jk])*60;

      // Zeitumwandlung in Stunden und Minuten
      ss:=trunc(gSchatA[jk]);
      min:=round((gSchatA[jk]-SS)*60);
      if min=60 then begin
        ss:=ss+1;
        min:=0;
      end;
      gSchatA[jk]:=ss+min/100;
      ss:=trunc(gSchatE[jk]);
      min:=round((gSchatE[jk]-ss)*60);
      if min=60 then begin
        ss:=ss+1;
        min:=0;
      end;
      gSchatE[jk]:=ss+min/100;
      Tag:=jk;
      Datum(Tag);
      jj:=Trunc(kk/20);
      if jj= kk/20 then Readln;
      StringGrid1.Cells[0,jk]:=InttoStr(jk);
      StringGrid1.Cells[1,jk]:=InttoStr(Dat)+' '+Monat;
      StringGrid1.Cells[2,jk]:=FormatFloat('0.00', gSchatA[jk]);
      StringGrid1.Cells[3,jk]:=FormatFloat('0.00', gSchatE[jk]);
      StringGrid1.Cells[4,jk]:=FormatFloat('0.0', gBela[jk]);
      StringGrid1.RowCount:=StringGrid1.RowCount+1;
    end;end;
  Sum:=0;
  Sum1:=0;
  for jk:=1 to 366 do begin
    Sum:=Sum+Belastung[jk];
    Sum1:=Sum1+gBela[jk];
  end;
  Jahrbela:=Sum/60;
  Jahrbe:=Sum1/60;
  StringGrid1.RowCount:=StringGrid1.RowCount+1;
  StringGrid1.Cells[0,StringGrid1.RowCount]:='Jahresbelastung:';
  StringGrid1.Cells[1,StringGrid1.RowCount]:=FormatFloat('0.0', Jahrbe);
  StringGrid1.Cells[2,StringGrid1.RowCount]:=FormatFloat('0.0', Jahrbela);
  readln; // Hier ist die Unterbrechnug des Programmes
end;
Danke für die Hilfe
Gruß
TF

Luckie 21. Jul 2003 13:45

Re: Fehlermeldung EInOut Error
 
Könntest du den Fehler etwas eingrenzen? Ich habe keine Lust das Code-Monster erst zu zerlegen.

HellAngel666 21. Jul 2003 14:17

Re: Fehlermeldung EInOut Error
 
HI!

Hast schon mal probiert, das READLN einfach durch
ein ShowMessage(''); zu ersetzen ???

Sollte dann gehen.... hoffentlich :D

thorstenf01 21. Jul 2003 14:18

Re: Fehlermeldung EInOut Error
 
Hy,
der Pfeil (Fehlermeldung) zeigt auf die vorletzte Zeile.
Gruß
Thorsten

Chewie 21. Jul 2003 14:21

Re: Fehlermeldung EInOut Error
 
Was hat das ReadLn hier zu suchen? Damit liest du von der Standardeingabe. Was hat das in einem GUI-Programm zu suchen?

Christian Seehase 21. Jul 2003 14:26

Re: Fehlermeldung EInOut Error
 
Moin Thorsten,

lass mal das ReadLn weg.
Was soll das überhaupt bewirken?

Da Du ein fensterorientiertes Programm hast, hast Du standardmässig auch keine Konsole, und somit schlägt ein einfacher ReadLn auch fehl.

Error 6 ist ERROR_INVALID_HANDLE, da Dein ReadLn auf ein nicht vorhandenes StdIn Handle zugreifen will.

Oder Du lässt Deinem Programm eine Konsole zuweisen.

Delphi-Quellcode:
  AllocConsole;
  ReadLn;
  FreeConsole;

thorstenf01 21. Jul 2003 15:03

Re: Fehlermeldung EInOut Error
 
Hallo noch einmal,
das 'readln' stammt aus der Übersetzung aus dem Pascal Quellcode.
Ich wusste bisher nicht, mit welchen Delphi Befehl readln ersetzt werden
kann. Vielleicht ist dies auch nicht notwendig, da ja ein stringgrid
verwendet wird.
Wenn er doch ersetzt werden muß, welchen Befehl benötige ich?
Gruß
Thorsten

Luckie 21. Jul 2003 15:09

Re: Fehlermeldung EInOut Error
 
Gar keinen. readln liest eine Eingabe von der Konsole. Wo bekommst du denn deine Eingaben her?

Aber ich habe den Verdacht, dass readln stand da aus einem anderen Grund, nämlich dass sich das Programm nicht gleich beendet und die Konsole geschlossen wird bevor man das Ergebnis gelesen hat. Das readln am Ende erfordert erst noch ein Return. Was auch für meine Theorie spricht, ist die Tatsache, dass die Eingabe nirgens gespeichert wird.

thorstenf01 21. Jul 2003 15:20

Re: Fehlermeldung EInOut Error
 
Hy,
vielleicht gibt der ursprüngliche Pascal Quellcode Aufschluss:
Code:
procedure Ausgabe;
var  jk,jj,ss,kk                                          :integer;
      min, Sum, Sum1, Dif                                  :real;
begin ClrScr;
      writeln; writeln; Write('         ');
      writeln('                Schattenwurfzeiten'); writeln;
      Write('  ');
      writeln(' Tag   Datum Abschattungsbeginn Abschattungsende Belastungszeit');
      Write('   ');
      Writeln('____________________________________________________________________');
      kk:=0;
      for jk:=1 to 366 do begin
      if gSchatA[jk]>0 then begin
      kk:=kk+1;
      Tag:=jk; Deklination(Tag); AU(Tag);
      tAnfang:=0.1*SchatA[jk]+0.9*gSchatA[jk];
               Besser(tAnfang);
               Dif:= abs(gSchatA[jk]-gZeit);
      if (Dif < 0.00025) or (gZeit=0) then gSchatA[jk]:=gZeit else begin
      repeat
               tAnfang:=gSchatA[jk]; Besser(tAnfang);
               Dif:=abs(gSchatA[jk]-gZeit);
               gSchatA[jk]:=gZeit;
      until Dif < 0.00025; end;

      tAnfang:=0.1*SchatE[jk]+0.9*gSchatE[jk];
               Besser(tAnfang);
               Dif:= abs(gSchatE[jk]-gZeit);
      if (Dif < 0.00025) or (gZeit=0) then gSchatE[jk]:=gZeit else begin
      repeat
               tAnfang:=gSchatE[jk]; Besser(tAnfang);
               Dif:=abs(gSchatE[jk]-gZeit);
               gSchatE[jk]:=gZeit;
      until Dif < 0.00025; end;

      if gSchatA[jk]=0 then begin
                       if gSchatE[jk] >0 then gSchatA[jk]:=gSchatE[jk]; end;
      if gSchatE[jk]=0 then begin
                       if gSchatA[jk] >0 then gSchatE[jk]:=gSchatA[jk]; end;
      Belastung[jk]:=(SchatE[jk]-SchatA[jk])*60;
      gBela[jk]:=(gSchatE[jk]-gSchatA[jk])*60;

      {Zeitumwandlung in Stunden und Minuten}
      ss:=trunc(gSchatA[jk]);
      min:=round((gSchatA[jk]-SS)*60);
      if min=60 then begin ss:=ss+1; min:=0; end;
      gSchatA[jk]:=ss+min/100;
      ss:=trunc(gSchatE[jk]);
      min:=round((gSchatE[jk]-ss)*60);
      if min=60 then begin ss:=ss+1; min:=0; end;
      gSchatE[jk]:=ss+min/100;

      Tag:=jk;
      Datum(Tag);

      jj:=Trunc(kk/20);
      if jj= kk/20 then readln;
      Write('   ');
      writeln(jk:4,Dat:6,Monat:5, gSchatA[jk]:10:2,' Uhr', gSchatE[jk]:14:2,' Uhr',
                                             gBela[jk]:13:1,' min');

                                                                    end; end;
      Sum:=0;    Sum1:=0;
      for jk:=1 to 366 do begin
      Sum:=Sum+Belastung[jk];
      Sum1:=Sum1+gBela[jk]; end;
      Jahrbela:=Sum/60;   Jahrbe:=Sum1/60;


      Writeln;Write('    ');
      Writeln('Jahresbelastung:', Jahrbe:8:1,' Stunden', Jahrbela:14:1 );
      readln;
end;
Gruß
Thorsten

Luckie 21. Jul 2003 15:25

Re: Fehlermeldung EInOut Error
 
Sieht so aus, als ob ich Recht hätte.

HellAngel666 22. Jul 2003 06:56

Re: Fehlermeldung EInOut Error
 
OK. Hab mich mal um Dein Problem angenommen.

Als erstes hoste Dir mal die Datei WIN32CRT von
dieser Adresse (Freeware lt. Angeabe)

www.zieglersoft.dk

Damit kannste dann unter Delphi wie mit dem alten
Turbo/Borland Pascal programmieren.

Du mußt also keine READLN/WRITELN etc. in was anderes ummodeln :o)

Hoffe das hilft Dir !!!!

Luckie 22. Jul 2003 07:59

Re: Fehlermeldung EInOut Error
 
Zitat:

Zitat von HellAngel666
Damit kannste dann unter Delphi wie mit dem alten
Turbo/Borland Pascal programmieren.

Du mußt also keine READLN/WRITELN etc. in was anderes ummodeln :o)

Und warum sollte er dann noch Delphi benutzen? Er will ja anscheindend eine GUI Anwendungt raus machen.

HellAngel666 22. Jul 2003 08:48

Re: Fehlermeldung EInOut Error
 
Schätze auch mal, das er irgendwann mal GUI programmieren will,
aber laß ihn doch erst mal GUI-Erfahrung sammeln.

Auf jeden Fall kann er jetzt mal schnell seine Programme portieren
um danach TLabel's und TEdit's oder sonstwas benutzen zu können.

Wollte ja nur helfen, bis er die "Anfangsschwierigkeiten" von
DOS auf Windows überbrücken zu können.

Wenn Du ja schon kritisierts, warum machst Du dann keine
Einführung, wie er es zu machen hat. Dann kannst Du Dir Deine
Kommentare sparen und konstruktiv mitarbeiten.

Schönen Tag noch. :dancer2:

Luckie 22. Jul 2003 08:54

Re: Fehlermeldung EInOut Error
 
Zitat:

Zitat von HellAngel666
Schätze auch mal, das er irgendwann mal GUI programmieren will,
aber laß ihn doch erst mal GUI-Erfahrung sammeln.

Wie soll er das machen, wenn du ihm doch wieder in der Konsole rumfuhrwerken läßt?
Zitat:

Auf jeden Fall kann er jetzt mal schnell seine Programme portieren
um danach TLabel's und TEdit's oder sonstwas benutzen zu können.
Wo ist siesht du da die Portierung?
Zitat:

Wollte ja nur helfen, bis er die "Anfangsschwierigkeiten" von
DOS auf Windows überbrücken zu können.
Ja, ist ja auch in Ordnung.
Zitat:

Wenn Du ja schon kritisierts, warum machst Du dann keine
Einführung, wie er es zu machen hat. Dann kannst Du Dir Deine
Kommentare sparen und konstruktiv mitarbeiten.
Meine kontruktive Kritik bestand darin, zu Ausdruck zu bringen, dass ich es für wenig sinnvoll halte eine TurboPascal/DOS Anwendung auf Delphi/Konsole zu portieren. Und eine Einführung werde ich bestimmt nicht machen, weil ich erstens kein Delphi-Lehrer bin, diese Forum kein Schulungszentrum ist und es hier und da gute Einsteigertutorials gibt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:00 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