(*********************************************************************
 *
 *  :Program.    WindowInOut.mod
 *  :Author.     Ingo Goldak
 *  :Address.    Hohenzollerndamm 8
 *  :Address.    1000 Berlin 31
 *  :Copyright.  PD
 *  :Language.   Modula-II
 *  :Translator. M2Amiga V3.3d
 *  :Imports.    MemSystem (at least V1.2)
 *  :Contents.   PROCEDUREn zur Ein-/Ausgabe in Windows
 *  :ModHistory. V1.0 [Ingo Goldak] ??.??.89
 *  :ModHistory. V1.2 [Ingo Goldak] 30.03.90 (Compiler Version 3.3d;
 *                     neue VARiable input; keine Fehlermeldungen)
 *
 *********************************************************************)

IMPLEMENTATION MODULE WindowInOut;

FROM SYSTEM IMPORT
     CAST,ADDRESS,ADR;
FROM Intuition IMPORT
     WindowPtr,ModifyIDCMP,
     IDCMPFlagSet,IDCMPFlags,IntuiMessagePtr;
FROM Exec IMPORT
     GetMsg,ReplyMsg;
FROM Conversions IMPORT
     ValToStr,StrToVal;
FROM Graphics IMPORT
     Move,Text;
FROM Strings IMPORT
     Compare,Length;


CONST WIDTH = 8;   (* Size of the  *)
      HEIGHT = 10; (* default Font *)

      CR = CHR(13);      (* Special - *)
      BS = CHR(8);
      MINUS = CHR(45);
      BLANK = CHR(32);
      CURSOR = CHR(127); (* Key Codes *)


PROCEDURE WriteWindowChar (Window : WindowPtr;
                           line,column : CARDINAL;
                           Zeichen : CHAR);

VAR RastPort : ADDRESS;                                (* Pointer to RastPort *)

BEGIN
   IF Window#NIL
   THEN
      RastPort:=Window^.rPort;
      Move(RastPort,column*WIDTH,(line+1)*HEIGHT-3);  (* Cursor positionieren *)
      Text(RastPort,ADR(Zeichen),1)
   END; (* IF Window *)
END WriteWindowChar;


PROCEDURE WriteWindowString (Window : WindowPtr;
                             line,column : CARDINAL;
                             String : ARRAY OF CHAR);

VAR RastPort : ADDRESS;                                (* Pointer to RastPort *)

BEGIN
   IF Window#NIL
   THEN
      RastPort:=Window^.rPort;
      Move(RastPort,column*WIDTH,(line+1)*HEIGHT-3);  (* Cursor positionieren *)
      Text(RastPort,ADR(String),Length(String))
   END; (* IF Window *)
END WriteWindowString;


PROCEDURE WriteWindowCard (Window : WindowPtr;
                           line,column : CARDINAL;
                           Number : LONGCARD;
                           Width : CARDINAL);

VAR RastPort : ADDRESS;                                (* Pointer to RastPort *)
    Zahl : LONGINT;                                     (* für die Umwandlung *)
    String : ARRAY [0..10] OF CHAR;                         (* Ausgabe-String *)
    Vorzeichen,fehler : BOOLEAN;

BEGIN
   IF Window#NIL
   THEN
      RastPort:=Window^.rPort;
      Vorzeichen:=FALSE;
      Zahl:=CAST(LONGINT,Number);                         (* Typen-Umwandlung *)
      Move(RastPort,column*WIDTH,(line+1)*HEIGHT-3);  (* Cursor positionieren *)
      ValToStr(Zahl,Vorzeichen,String,10,Width,' ',fehler);
      IF NOT (fehler OR Vorzeichen)
      THEN Text(RastPort,ADR(String),Length(String))
      END (* IF *)
   END; (* IF Window *)
END WriteWindowCard;


PROCEDURE WriteWindowInt (Window : WindowPtr;
                          line,column : CARDINAL;
                          Number : LONGINT;
                          Width : CARDINAL);

VAR RastPort : ADDRESS;                                (* Pointer to RastPort *)
    String : ARRAY [0..10] OF CHAR;                         (* Ausgabe-String *)
    Vorzeichen,fehler : BOOLEAN;

BEGIN
   IF Window#NIL
   THEN
      RastPort:=Window^.rPort;
      Move(RastPort,column*WIDTH,(line+1)*HEIGHT-3);  (* Cursor positionieren *)
      ValToStr(Number,Vorzeichen,String,10,Width,' ',fehler);
      IF NOT fehler
      THEN Text(RastPort,ADR(String),Length(String))
      END (* IF *)
   END; (* IF Window *)
END WriteWindowInt;


PROCEDURE GetKey (Window : WindowPtr) : CARDINAL;

VAR OldFlags,NewFlags,Class : IDCMPFlagSet;
    IntuiMsg : IntuiMessagePtr;
    Zeichen : CARDINAL;                              (* das Funktionsergebnis *)
    Code : CARDINAL;

BEGIN
   IF Window#NIL
   THEN
      OldFlags:=Window^.idcmpFlags;                      (* alte Flags retten *)
      NewFlags:=IDCMPFlagSet{rawKey};                  (* nur rawKey abfragen *)
      ModifyIDCMP(Window,NewFlags);
      LOOP
         IntuiMsg:=GetMsg(Window^.userPort);               (* Intiution lesen *)
         WHILE IntuiMsg#NIL DO
            Class:=IntuiMsg^.class;
            Code:=IntuiMsg^.code;
            ReplyMsg(IntuiMsg);
            IF (rawKey IN Class)                       (* nur rawKey abfragen *)
            THEN
               Zeichen:=Code;
               EXIT                          (* Abbruch, wenn Zeichen gelesen *)
            END; (* IF *)
            IntuiMsg:=GetMsg(Window^.userPort)         (* Intuition neu lesen *)
         END (* WHILE *)
      END; (* LOOP *)
      ModifyIDCMP(Window,OldFlags);            (* alte Flags wiederherstellen *)
      RETURN Zeichen
   ELSE (* Window nicht definiert *)
      RETURN 0
   END; (* IF Window *)
END GetKey;


PROCEDURE GetChar (Window : WindowPtr) : CHAR;

VAR OldFlags,NewFlags,Class : IDCMPFlagSet;
    IntuiMsg : IntuiMessagePtr;
    Zeichen : CHAR;                                  (* das Funktionsergebnis *)
    Code : CARDINAL;

BEGIN
   IF Window#NIL
   THEN
      OldFlags:=Window^.idcmpFlags;                      (* alte Flags retten *)
      NewFlags:=IDCMPFlagSet{vanillaKey};          (* nur vanillaKey abfragen *)
      ModifyIDCMP(Window,NewFlags);
      LOOP
         IntuiMsg:=GetMsg(Window^.userPort);               (* Intuition lesen *)
         WHILE IntuiMsg#NIL DO
            Class:=IntuiMsg^.class;
            Code:=IntuiMsg^.code;
            ReplyMsg(IntuiMsg);
            IF (vanillaKey IN Class)               (* nur vanillaKey abfragen *)
            THEN
               Zeichen:=CHR(Code);
               EXIT                          (* Abbruch, wenn Zeichen gelesen *)
            END; (* IF *)
            IntuiMsg:=GetMsg(Window^.userPort)         (* Intuition neu lesen *)
         END (* WHILE *)
      END; (* LOOP *)
      ModifyIDCMP(Window,OldFlags);            (* alte Flags wiederherstellen *)
      RETURN Zeichen
   ELSE (* Window nicht definiert *)
      RETURN CHR(0)
   END; (* IF Window *)
END GetChar;


PROCEDURE ReadWindowString (Window : WindowPtr;
                            line,column : CARDINAL;
                            VAR String : ARRAY OF CHAR);

VAR Laenge,Zaehler,Spalte : CARDINAL;
    Zeichen : CHAR;

BEGIN
   input:=FALSE;
   IF Window#NIL
   THEN

      (* Initialisierungen *)
      Laenge:=HIGH(String);
      Zaehler:=0;
      Spalte:=column;

      (* String einlesen *)
      WriteWindowChar(Window,line,Spalte,CURSOR);            (* Cursor setzen *)
      REPEAT (* bis CR eingegeben wird *)
         REPEAT
            Zeichen:=GetChar(Window)
         UNTIL (Zeichen=CR) OR (Zeichen=BS)
               OR ((Zeichen>CHR(31)) AND (Zeichen<CHR(127)))
               OR (Zeichen>CHR(159));         (* Control-Zeichen ausschließen *)
         IF (Zeichen#CR) AND (Zaehler<Laenge)
         THEN                                           (* Eingabe darstellen *)
            IF Zeichen#BS
            THEN             (* Zeichen eintragen und auf dem Window ausgeben *)
               String[Zaehler]:=Zeichen;
               WriteWindowChar(Window,line,Spalte,Zeichen);
               WriteWindowChar(Window,line,Spalte+1,CURSOR);
               INC(Spalte);
               INC(Zaehler)
            ELSIF Zaehler>0
            THEN   (* vorheriges Zeichen im String und auf dem Window löschen *)
               DEC(Spalte);
               WriteWindowChar(Window,line,Spalte,CURSOR);
               WriteWindowChar(Window,line,Spalte+1,BLANK);
               DEC(Zaehler);
               String[Zaehler]:=BLANK
            END (* IF *)
         ELSIF Zeichen=BS
         THEN      (* vorheriges Zeichen im String und auf dem Window löschen *)
            DEC(Spalte);
            WriteWindowChar(Window,line,Spalte,CURSOR);
            WriteWindowChar(Window,line,Spalte+1,BLANK);
            DEC(Zaehler);
            String[Zaehler]:=BLANK
         END (* IF *)
      UNTIL Zeichen=CR;
      WriteWindowChar(Window,line,Spalte,BLANK);
      IF Zaehler>0
      THEN
         input:=TRUE
      END; (* IF *)

      (* CHR(0) als Abschluß anhängen *)
      IF Zaehler<Laenge
      THEN String[Zaehler]:=CHR(0)
      ELSE String[Laenge]:=CHR(0)
      END (* IF *)
   ELSE (* Window nicht definiert *)
      String[0]:=CHR(0)
   END; (* IF Window *)
END ReadWindowString;


PROCEDURE ReadWindowCard (Window : WindowPtr;
                          line,column : CARDINAL;
                          VAR Number : CARDINAL);

VAR Laenge,Zaehler,Spalte : CARDINAL;
    String : ARRAY [0..5] OF CHAR;                          (* Eingabe-String *)
    Vorzeichen,fehler,Erfolg : BOOLEAN;
    Zahl : LONGINT;
    Zeichen : CHAR;

BEGIN
   input:=FALSE;
   IF Window#NIL
   THEN
      REPEAT                                           (* bis gültige Eingabe *)

         (* Initialisierungen *)
         Vorzeichen:=FALSE;
         Laenge:=5;
         Zaehler:=0;
         Spalte:=column;

         (* String einlesen *)
         WriteWindowChar(Window,line,Spalte,CURSOR);  (* Cursor positionieren *)
         REPEAT                                     (* bis CR eingegeben wird *)
            REPEAT
               Zeichen:=GetChar(Window)
            UNTIL (Zeichen=CR) OR (Zeichen=BS)
                  OR ((Zeichen>CHR(47)) AND (Zeichen<CHR(58)));   (* nur Ziffern
                                              als gültige Zeichen akzeptieren *)
            IF (Zeichen#CR) AND (Zaehler<Laenge)
            THEN                                        (* Eingabe darstellen *)
               IF Zeichen#BS
               THEN          (* Zeichen eintragen und auf dem Window ausgeben *)
                  String[Zaehler]:=Zeichen;
                  WriteWindowChar(Window,line,Spalte,Zeichen);
                  WriteWindowChar(Window,line,Spalte+1,CURSOR);
                  INC(Spalte);
                  INC(Zaehler)
               ELSIF Zaehler>0
               THEN(* vorheriges Zeichen im String und auf dem Window löschen *)
                  DEC(Spalte);
                  WriteWindowChar(Window,line,Spalte,CURSOR);
                  WriteWindowChar(Window,line,Spalte+1,BLANK);
                  DEC(Zaehler);
                  String[Zaehler]:=BLANK
               END (* IF *)
            ELSIF Zeichen=BS
            THEN   (* vorheriges Zeichen im String und auf dem Window löschen *)
               DEC(Spalte);
               WriteWindowChar(Window,line,Spalte,CURSOR);
               WriteWindowChar(Window,line,Spalte+1,BLANK);
               DEC(Zaehler);
               String[Zaehler]:=BLANK
            END (* IF *)
         UNTIL Zeichen=CR;
         WriteWindowChar(Window,line,Spalte,BLANK);
         IF Zaehler>0
         THEN
            input:=TRUE
         END; (* IF *)

         (* CHR(0) als Abschluß anhängen *)
         IF Zaehler<Laenge
         THEN String[Zaehler]:=CHR(0)
         ELSE String[Laenge]:=CHR(0)
         END; (* IF *)

         (* String in Zahl wandeln *)
         StrToVal(String,Zahl,Vorzeichen,10,fehler);
         Number:=0;

         (* Bereichs- und Fehlerkontrolle *)
         IF fehler OR Vorzeichen
         THEN
            Erfolg:=FALSE;
         ELSIF Zahl<=65535 (* MAXCARD *)
         THEN
            Erfolg:=TRUE;
            Number:=Zahl;
         ELSE
            Erfolg:=FALSE;
         END; (* IF *)
      UNTIL Erfolg;
   ELSE (* Window nicht definiert *)
      Number:=0
   END; (* IF Window *)
END ReadWindowCard;


PROCEDURE ReadWindowLongCard (Window : WindowPtr;
                              line,column : CARDINAL;
                              VAR Number : LONGCARD);

VAR Laenge,Zaehler,Spalte : CARDINAL;
    String : ARRAY [0..10] OF CHAR;                         (* Eingabe-String *)
    Vorzeichen,fehler,Erfolg : BOOLEAN;
    Zahl : LONGINT;
    Zeichen : CHAR;

BEGIN
   input:=FALSE;
   IF Window#NIL
   THEN
      REPEAT                                           (* bis gültige Eingabe *)

         (* Initialisierungen *)
         Vorzeichen:=FALSE;
         Laenge:=10;
         Zaehler:=0;
         Spalte:=column;

         (* String einlesen *)
         WriteWindowChar(Window,line,Spalte,CURSOR);  (* Cursor positionieren *)
         REPEAT (* bis CR eingegeben wird *)
            REPEAT
               Zeichen:=GetChar(Window)
            UNTIL (Zeichen=CR) OR (Zeichen=BS)
                  OR ((Zeichen>CHR(47)) AND (Zeichen<CHR(58)));   (* nur Ziffern
                                              als gültige Zeichen akzeptieren *)
            IF (Zeichen#CR) AND (Zaehler<Laenge)
            THEN                                        (* Eingabe darstellen *)
               IF Zeichen#BS
               THEN          (* Zeichen eintragen und auf dem Window ausgeben *)
                  String[Zaehler]:=Zeichen;
                  WriteWindowChar(Window,line,Spalte,Zeichen);
                  WriteWindowChar(Window,line,Spalte+1,CURSOR);
                  INC(Spalte);
                  INC(Zaehler)
               ELSIF Zaehler>0
               THEN(* vorheriges Zeichen im String und auf dem Window löschen *)
                  DEC(Spalte);
                  WriteWindowChar(Window,line,Spalte,CURSOR);
                  WriteWindowChar(Window,line,Spalte+1,BLANK);
                  DEC(Zaehler);
                  String[Zaehler]:=BLANK
               END (* IF *)
            ELSIF Zeichen=BS
            THEN   (* vorheriges Zeichen im String und auf dem Window löschen *)
               DEC(Spalte);
               WriteWindowChar(Window,line,Spalte,CURSOR);
               WriteWindowChar(Window,line,Spalte+1,BLANK);
               DEC(Zaehler);
               String[Zaehler]:=BLANK
            END (* IF *)
         UNTIL Zeichen=CR;
         WriteWindowChar(Window,line,Spalte,BLANK);
         IF Zaehler>0
         THEN
            input:=TRUE
         END; (* IF *)

         (* CHR(0) als Abschluß anhängen *)
         IF Zaehler<Laenge
         THEN String[Zaehler]:=CHR(0)
         ELSE String[Laenge]:=CHR(0)
         END; (* IF *)

         (* Bereichskontrolle *)
         fehler:=FALSE;
         IF Length(String)=10
         THEN
            IF Compare(String,0,10,"4294967295",FALSE)<0
            THEN
               Erfolg:=FALSE;
            ELSE
               Erfolg:=TRUE;
               StrToVal(String,Zahl,Vorzeichen,10,fehler);
            END (* IF *)
         ELSE
            Erfolg:=TRUE;
            StrToVal(String,Zahl,Vorzeichen,10,fehler);
         END; (* IF *)

         (* Fehlerkontrolle *)
         IF fehler
         THEN
            Erfolg:=FALSE;
         ELSE
            Number:=CAST(LONGCARD,Zahl)                      (* Typenwandlung *)
         END; (* IF *)
      UNTIL Erfolg;
   ELSE (* Window nicht definiert *)
      Number:=0
   END; (* IF Window *)
END ReadWindowLongCard;


PROCEDURE ReadWindowInt (Window : WindowPtr;
                         line,column : CARDINAL;
                         VAR Number : INTEGER);

VAR Laenge,Zaehler,Spalte : CARDINAL;
    String : ARRAY [0..6] OF CHAR;                          (* Eingabe-String *)
    Vorzeichen,fehler,Erfolg : BOOLEAN;
    Zahl : LONGINT;
    Zeichen : CHAR;

BEGIN
   input:=FALSE;
   IF Window#NIL
   THEN
      REPEAT                                           (* bis gültige Eingabe *)

         (* Initialisierungen *)
         Zaehler:=0;
         Spalte:=column;

         (* String einlesen *)
         WriteWindowChar(Window,line,Spalte,CURSOR);  (* Cursor positionieren *)
         REPEAT                                     (* bis CR eingegeben wird *)
            REPEAT
               Zeichen:=GetChar(Window)
            UNTIL (Zeichen=CR) OR (Zeichen=BS)
                   OR ((Zeichen>CHR(47)) AND (Zeichen<CHR(58)))
                   OR (Zeichen=MINUS);      (* nur Ziffern und Minus als gültige
                                                          Zeichen akzeptieren *)

            IF Vorzeichen
            THEN Laenge:=6
            ELSE Laenge:=5
            END; (* IF *)

            IF (Zeichen#CR) AND (Zaehler<Laenge)
            THEN                                        (* Eingabe darstellen *)
               IF (Zaehler>0) AND (Zeichen#MINUS)
               THEN                           (* MINUS nur am Anfang erlauben *)
                  IF Zeichen#BS
                  THEN                                   (* Zeichen eintragen *)
                     String[Zaehler]:=Zeichen;
                     WriteWindowChar(Window,line,Spalte,Zeichen);
                     WriteWindowChar(Window,line,Spalte+1,CURSOR);
                     INC(Spalte);
                     INC(Zaehler)
                  ELSE                          (* vorheriges Zeichen löschen *)
                     DEC(Spalte);
                     WriteWindowChar(Window,line,Spalte,CURSOR);
                     WriteWindowChar(Window,line,Spalte+1,BLANK);
                     DEC(Zaehler);
                     String[Zaehler]:=BLANK
                  END (* IF *)
               ELSIF Zaehler=0
               THEN                  (* alle Zeichen außer CR und BS erlauben *)
                  IF Zeichen#BS
                  THEN                                   (* Zeichen eintragen *)

                     IF Zeichen=MINUS
                     THEN Vorzeichen:=TRUE
                     ELSE Vorzeichen:=FALSE
                     END; (* IF *)

                     String[Zaehler]:=Zeichen;
                     WriteWindowChar(Window,line,Spalte,Zeichen);
                     WriteWindowChar(Window,line,Spalte+1,CURSOR);
                     INC(Spalte);
                     INC(Zaehler)
                  END (* IF *)
               END (* IF *)
            ELSIF Zeichen=BS
            THEN                                (* vorheriges Zeichen löschen *)
               DEC(Spalte);
               WriteWindowChar(Window,line,Spalte,CURSOR);
               WriteWindowChar(Window,line,Spalte+1,BLANK);
               DEC(Zaehler);
               String[Zaehler]:=BLANK
            END (* IF *)
         UNTIL Zeichen=CR;
         WriteWindowChar(Window,line,Spalte,BLANK);
         IF Zaehler>0
         THEN
            input:=TRUE
         END; (* IF *)

         (* CHR(0) als Abschluß anhängen *)
         IF Zaehler<Laenge
         THEN String[Zaehler]:=CHR(0)
         ELSE String[Laenge]:=CHR(0)
         END; (* IF *)

         (* String in Zahl umwandeln *)
         StrToVal(String,Zahl,Vorzeichen,10,fehler);

         (* Fehler- und Bereichskontrolle *)
         IF fehler
         THEN
            Erfolg:=FALSE;
         ELSIF (Zahl<=32767) AND (Zahl>=-32768)
         THEN
            Erfolg:=TRUE;
            Number:=Zahl;
         ELSE
            Erfolg:=FALSE;
         END; (* IF *)
      UNTIL Erfolg;
   ELSE (* Window nicht definiert *)
      Number:=0
   END; (* IF Window *)
END ReadWindowInt;


PROCEDURE ReadWindowLongInt (Window : WindowPtr;
                             line,column : CARDINAL;
                             VAR Number : LONGINT);

VAR Laenge,Zaehler,Spalte : CARDINAL;
    String : ARRAY [0..11] OF CHAR;                         (* Eingabe-String *)
    Vorzeichen,fehler,Vergleich,Erfolg : BOOLEAN;
    Zeichen : CHAR;

BEGIN
   input:=FALSE;
   IF Window#NIL
   THEN
      REPEAT                                           (* bis gültige Eingabe *)

         (* Initialisierungen *)
         Vorzeichen:=FALSE;
         Zaehler:=0;
         Spalte:=column;

         (* String einlesen *)
         WriteWindowChar(Window,line,Spalte,CURSOR);  (* Cursor positionieren *)
         REPEAT                                     (* bis CR eingegeben wird *)
            REPEAT
               Zeichen:=GetChar(Window)
            UNTIL (Zeichen=CR) OR (Zeichen=BS)
                   OR ((Zeichen>CHR(47)) AND (Zeichen<CHR(58)))
                   OR (Zeichen=MINUS);      (* nur Ziffern und Minus als gültige
                                                          Zeichen akzeptieren *)

            IF Vorzeichen
            THEN Laenge:=11
            ELSE Laenge:=10
            END; (* IF *)

            IF (Zeichen#CR) AND (Zaehler<Laenge)
            THEN                                        (* Eingabe darstellen *)
               IF (Zaehler>0) AND (Zeichen#MINUS)
               THEN                           (* MINUS nur am Anfang erlauben *)
                  IF Zeichen#BS
                  THEN                                   (* Zeichen eintragen *)
                     String[Zaehler]:=Zeichen;
                     WriteWindowChar(Window,line,Spalte,Zeichen);
                     WriteWindowChar(Window,line,Spalte+1,CURSOR);
                     INC(Spalte);
                     INC(Zaehler)
                  ELSE                          (* vorheriges Zeichen löschen *)
                     DEC(Spalte);
                     WriteWindowChar(Window,line,Spalte,CURSOR);
                     WriteWindowChar(Window,line,Spalte+1,BLANK);
                     DEC(Zaehler);
                     String[Zaehler]:=BLANK
                  END (* IF *)
               ELSIF Zaehler=0
               THEN                  (* alle Zeichen außer CR und BS erlauben *)
                  IF Zeichen#BS
                  THEN                                   (* Zeichen eintragen *)

                     IF Zeichen=MINUS
                     THEN Vorzeichen:=TRUE
                     ELSE Vorzeichen:=FALSE
                     END; (* IF *)

                     String[Zaehler]:=Zeichen;
                     WriteWindowChar(Window,line,Spalte,Zeichen);
                     WriteWindowChar(Window,line,Spalte+1,CURSOR);
                     INC(Spalte);
                     INC(Zaehler)
                  END (* IF *)
               END (* IF *)
            ELSIF Zeichen=BS
            THEN   (* vorheriges Zeichen im String und auf dem Window löschen *)
               DEC(Spalte);
               WriteWindowChar(Window,line,Spalte,CURSOR);
               WriteWindowChar(Window,line,Spalte+1,BLANK);
               DEC(Zaehler);
               String[Zaehler]:=BLANK
            END (* IF *)
         UNTIL Zeichen=CR;
         WriteWindowChar(Window,line,Spalte,BLANK);
         IF Zaehler>0
         THEN
            input:=TRUE
         END; (* IF *)

         (* CHR(0) als Abschluß anhängen *)
         IF Zaehler<Laenge
         THEN String[Zaehler]:=CHR(0)
         ELSE String[Laenge]:=CHR(0)
         END; (* IF *)

         (* Bereichskontrolle *)
         fehler:=FALSE;
         Vergleich:=FALSE;
         IF Vorzeichen
         THEN
            IF Length(String)=11
            THEN
               Vergleich:=TRUE
            END (* IF *)
         ELSE
            IF Length(String)=10
            THEN
               Vergleich:=TRUE
            END (* IF *)
         END; (* IF *)
         IF Vergleich
         THEN
            IF Vorzeichen
            THEN
               IF Compare(String,1,10,'2147483648',TRUE)<0
               THEN
                  Erfolg:=FALSE;
               ELSE
                  Erfolg:=TRUE;
                  StrToVal(String,Number,Vorzeichen,10,fehler);
               END
            ELSE
               IF Compare(String,0,10,'2147483647',TRUE)<0
               THEN
                  Erfolg:=FALSE;
               ELSE
                  Erfolg:=TRUE;
                  StrToVal(String,Number,Vorzeichen,10,fehler);
               END
            END
         ELSE
            Erfolg:=TRUE;
            StrToVal(String,Number,Vorzeichen,10,fehler)
         END;

         (* Fehlerkontrolle *)
         IF fehler
         THEN
            Erfolg:=FALSE;
         END; (* IF *)
      UNTIL Erfolg;
   ELSE (* Window nicht definiert *)
      Number:=0
   END; (* IF Window *)
END ReadWindowLongInt;


END WindowInOut.
