(**********************************************************************

    :Program.    VAbfrage.mod
    :Contents.   Abfrageprocedure für das Programm VTrainer
    :Author.     Dieter WILHELM
    :Address.    Albert-Schweitzer-Str.44, 8000 München 83
    :Phone.      089/671693
    :Copyright.  PD
    :Language.   Modula-2
    :Translator. M2Amiga A+L V4.0d
    :Imports.    IntuiStruct1.3 [bne] Amok#3, Lists [bne] Amok#22
    :Imports.    BeamRandom Bernd Preusing Amok#20, VEingabe, VMenue
    :History.    V1.0 Dieter WILHELM 13.Jan.1991
    :History.    V1.1 Dieter WILHELM 29.Sept.1991

**********************************************************************)

IMPLEMENTATION MODULE VAbfrage ;


  FROM BeamRandom  IMPORT RND;
  FROM Conversions IMPORT ValToStr;
  FROM ExecL       IMPORT GetMsg, ReplyMsg, WaitPort;
  FROM GraphicsD   IMPORT jam1;
  FROM GraphicsL   IMPORT Move, RectFill, SetAPen, Text;
  FROM Heap        IMPORT AllocMem, Deallocate ;
  FROM IntuiStruct IMPORT AllocProc,BorderEnd, DeallocProc,
                          StructBorder, StructGadget, StructString,
                          StructText, Rectangle;
  FROM IntuitionD  IMPORT ActivationFlags, ActivationFlagSet, boolGadget,
                          Border, Gadget, GadgetFlags, GadgetFlagSet,
                          GadgetPtr, IDCMPFlags, IDCMPFlagSet,
                          IntuiMessagePtr, IntuiText, strGadget,
                          StringInfo, WindowPtr;
  FROM IntuitionL  IMPORT ActivateGadget, AddGList, AutoRequest,
                          DrawBorder, ModifyIDCMP, PrintIText,
                          RefreshGList, RemoveGList;
  FROM Lists       IMPORT AppendEntryC, CreateList, DeleteEntry,
                          DeleteList, EntriesInList, EntryPtr,
                          FirstEntry, LocateEntryAbs, ReadEntryC,
                          ReplaceEntryC, Successor;
  FROM String      IMPORT Length ;
  FROM SYSTEM      IMPORT ADR, LONGSET ;
  FROM VEingabe    IMPORT Modus, VKopf, Vokabel, Zeile ;
  FROM VMenue      IMPORT attr;


  VAR GPtr1, GPtr2,
      GPtr3                : GadgetPtr ;
      UeGad                : ARRAY [0..4] OF Gadget ;
      VGad                 : Gadget ;
      Buffer, UBuffer      : ARRAY [0..5] OF Zeile ;
      SInfo                : ARRAY [0..5] OF StringInfo ;
      UeBorder             : ARRAY [0..4] OF Border ;
      VBorder, Rand, Rand2 : Border ;
      TGad                 : ARRAY [0..1] OF Gadget ;
      TBorder              : ARRAY [0..1] OF Border ;
      Vok                  : Vokabel ;
      Eintrag              : EntryPtr ;
      m, n                 : CARDINAL ;
      Msg                  : IntuiMessagePtr ;
      class                : IDCMPFlagSet ;
      code                 : CARDINAL ;
      Anz                  : ARRAY [0..3] OF INTEGER ;
      GNr, GNr2, VNr       : CARDINAL ;
      GadPos, k            : INTEGER ;
      aktiv, fehler        : BOOLEAN ;
      Meldung1, Meldung2,
      Pech, Schade         : IntuiText ;
      Zahl                 : ARRAY [0..5] OF CHAR ;
      bruch                : REAL;
      lang                 : INTEGER;


  PROCEDURE Umsortieren(Mod: Modus; VAR Kopf: VKopf; W: WindowPtr):
                        BOOLEAN;
    VAR HKopf   : VKopf ;
        laenge,
        Grup    : CARDINAL ;
        Eintrag : EntryPtr ;
        Vok     : Vokabel ;
        ok,
        fehler  : BOOLEAN ;
    BEGIN
      HKopf.Anzahl := 0 ;
      FOR m := 0 TO 3 DO
        IF NOT CreateList(HKopf.Gruppe[m]) THEN
          fehler := AutoRequest(W, ADR(Meldung1), NIL, ADR(Schade),
                               IDCMPFlagSet{}, IDCMPFlagSet{}, 300, 65);
          FOR n := m - 1 TO 0 DO
            DeleteList(HKopf.Gruppe[n]) ;
          END ;  (* FOR n *)
          RETURN FALSE ;
        END ;  (* IF *)
      END ;  (* FOR *)
      m := 0 ; ok := TRUE ;
      WHILE (m < 4) AND ok DO
        laenge := EntriesInList(Kopf.Gruppe[m]) ;
        Eintrag := FirstEntry(Kopf.Gruppe[m]) ;
        n := 0 ;
        WHILE (n < laenge) AND ok DO
          ReadEntryC(Kopf.Gruppe[m], Eintrag, Vok) ;
          IF Vok.gewusst[Mod] # 0 THEN
            Grup := TRUNC(100.0 * REAL(Vok.gewusst[Mod]) /
                          REAL(Vok.abgefragt[Mod]));
            CASE Grup OF
              0..39   : AppendEntryC(HKopf.Gruppe[0], Vok) |
              40..69  : AppendEntryC(HKopf.Gruppe[1], Vok) |
              70..89  : AppendEntryC(HKopf.Gruppe[2], Vok) |
              90..100 : AppendEntryC(HKopf.Gruppe[3], Vok) |
            END ;  (* CASE *)
          ELSE
            AppendEntryC(HKopf.Gruppe[0], Vok) ;
          END ;  (* IF *)
          INC(HKopf.Anzahl);
          ok := Successor(Eintrag) ; INC(n);
        END ;  (* WHILE n *)
        IF n # laenge THEN
          ok := FALSE ;
        ELSE
          ok := TRUE ;
        END ;  (* IF *)
        INC(m);
      END ;  (* WHILE m *)
      IF NOT ok OR (HKopf.Anzahl # Kopf.Anzahl) THEN
        FOR m := 0 TO 3 DO
          DeleteList(HKopf.Gruppe[m]) ;
        END ;  (* FOR *)
        fehler := AutoRequest(W, ADR(Meldung1), NIL, ADR(Schade),
                             IDCMPFlagSet{}, IDCMPFlagSet{}, 300, 65);
        RETURN FALSE ;
      END ;  (* IF *)
      FOR m := 0 TO 3 DO
        DeleteList(Kopf.Gruppe[m]) ;
        IF NOT CreateList(Kopf.Gruppe[m]) THEN
          fehler := AutoRequest(W, ADR(Meldung2), NIL, ADR(Pech),
                                IDCMPFlagSet{}, IDCMPFlagSet{}, 350, 65);
          FOR n := m - 1 TO 0 DO
            DeleteList(Kopf.Gruppe[n]) ;
          END ;  (* FOR n *)
          FOR n := 0 TO 3 DO
            DeleteList(HKopf.Gruppe[n]) ;
          END ;  (* FOR n *)
          RETURN FALSE ;
        END ;  (* IF *)
      END ;  (* FOR *)
      FOR m := 0 TO 3 DO
        IF EntriesInList(HKopf.Gruppe[m]) # 0 THEN
          Eintrag := FirstEntry(HKopf.Gruppe[m]) ;
          ReadEntryC(HKopf.Gruppe[m], Eintrag, Vok) ;
          AppendEntryC(Kopf.Gruppe[m], Vok) ;
          WHILE Successor(Eintrag) DO
            ReadEntryC(HKopf.Gruppe[m], Eintrag, Vok) ;
            AppendEntryC(Kopf.Gruppe[m], Vok) ;
          END ;  (* WHILE *)
        END ;  (* IF *)
      END ;  (* FOR *)
      Kopf.Anzahl := HKopf.Anzahl ; Kopf.Mod := Mod ;
      FOR m := 0 TO 3 DO
        DeleteList(HKopf.Gruppe[m]) ;
      END ;  (* FOR *)
      RETURN TRUE ;
  END Umsortieren ;


  PROCEDURE Einteilung(gefragt, gewusst: CARDINAL): CARDINAL ;
    VAR h : CARDINAL ;
    BEGIN
      IF gefragt = 0 THEN
        RETURN 0 ;
      ELSE
        h := CARDINAL(100.0 * REAL(gewusst) / REAL(gefragt)) ;
        CASE h OF
          0.. 39  : RETURN 0|
          40..69  : RETURN 1|
          70..89  : RETURN 2|
          90..100 : RETURN 3;
        END ;  (* CASE *)
      END ;  (* IF *)
  END Einteilung ;


  PROCEDURE Auswahl(VAR GNr, VNr: CARDINAL; Anz0, Anz1, Anz2, Anz3:
                    INTEGER);
    BEGIN
      IF (Anz0 # 0) AND (Anz1 # 0) AND (Anz2 # 0) AND (Anz3 # 0) THEN
        CASE RND(100) OF
          0..49  : GNr := 0; VNr := CARDINAL(RND(Anz0))|
          50..74 : GNr := 1; VNr := CARDINAL(RND(Anz1))|
          75..89 : GNr := 2; VNr := CARDINAL(RND(Anz2))|
          90..99 : GNr := 3; VNr := CARDINAL(RND(Anz3));
        END;  (* CASE *)
      ELSIF (Anz0 # 0) AND (Anz1 # 0) AND (Anz2 # 0) THEN
        CASE RND(100) OF
          0..54  : GNr := 0; VNr := CARDINAL(RND(Anz0))|
          55..85 : GNr := 1; VNr := CARDINAL(RND(Anz1))|
          86..99 : GNr := 2; VNr := CARDINAL(RND(Anz2));
        END;  (* CASE *)
      ELSIF (Anz0 # 0) AND (Anz1 # 0) AND (Anz3 # 0) THEN
        CASE RND(100) OF
          0..59  : GNr := 0; VNr := CARDINAL(RND(Anz0))|
          60..89 : GNr := 1; VNr := CARDINAL(RND(Anz1))|
          90..99 : GNr := 3; VNr := CARDINAL(RND(Anz3));
        END;  (* CASE *)
      ELSIF (Anz0 # 0) AND (Anz2 # 0) AND (Anz3 # 0) THEN
        CASE RND(100) OF
          0..64  : GNr := 0; VNr := CARDINAL(RND(Anz0))|
          65..87 : GNr := 2; VNr := CARDINAL(RND(Anz2))|
          88..99 : GNr := 3; VNr := CARDINAL(RND(Anz3));
        END;  (* CASE *)
      ELSIF (Anz0 # 0) AND (Anz1 # 0) THEN
        CASE RND(100) OF
          0..69  : GNr := 0; VNr := CARDINAL(RND(Anz0))|
          70..99 : GNr := 1; VNr := CARDINAL(RND(Anz1));
        END;  (* CASE *)
      ELSIF (Anz0 # 0) AND (Anz2 # 0) THEN
        CASE RND(100) OF
          0..74  : GNr := 0; VNr := CARDINAL(RND(Anz0))|
          75..99 : GNr := 2; VNr := CARDINAL(RND(Anz2));
        END;  (* CASE *)
      ELSIF (Anz0 # 0) AND (Anz3 # 0) THEN
        CASE RND(100) OF
          0..79  : GNr := 0; VNr := CARDINAL(RND(Anz0))|
          80..99 : GNr := 3; VNr := CARDINAL(RND(Anz3));
        END;  (* CASE *)
      ELSIF (Anz0 # 0) THEN
        GNr := 0; VNr := CARDINAL(RND(Anz0));
      ELSIF (Anz1 # 0) AND (Anz2 # 0) AND (Anz3 # 0) THEN
        CASE RND(100) OF
          0..49  : GNr := 1; VNr := CARDINAL(RND(Anz1))|
          50..84 : GNr := 2; VNr := CARDINAL(RND(Anz2))|
          85..99 : GNr := 3; VNr := CARDINAL(RND(Anz3));
        END;  (* CASE *)
      ELSIF (Anz1 # 0) AND (Anz2 # 0) THEN
        CASE RND(100) OF
          0..64  : GNr := 1; VNr := CARDINAL(RND(Anz1))|
          65..99 : GNr := 2; VNr := CARDINAL(RND(Anz2));
        END;  (* CASE *)
      ELSIF (Anz1 # 0) AND (Anz3 # 0) THEN
        CASE RND(100) OF
          0..74  : GNr := 1; VNr := CARDINAL(RND(Anz1))|
          75..99 : GNr := 3; VNr := CARDINAL(RND(Anz3));
        END;  (* CASE *)
      ELSIF (Anz1 # 0) THEN
        GNr := 1; VNr := CARDINAL(RND(Anz1));
      ELSIF (Anz2 # 0) AND (Anz3 # 0) THEN
        CASE RND(100) OF
          0..64  : GNr := 2; VNr := CARDINAL(RND(Anz2))|
          65..99 : GNr := 3; VNr := CARDINAL(RND(Anz3));
        END;  (* CASE *)
      ELSIF (Anz2 # 0) THEN
        GNr := 2; VNr := CARDINAL(RND(Anz2));
      ELSE
        GNr := 3; VNr := CARDINAL(RND(Anz3));
      END;  (* IF *)
  END Auswahl ;


  PROCEDURE AbfrageVUe(VAR Kopf: VKopf; VAR Vok: Vokabel; W: WindowPtr):
                      BOOLEAN ;
    VAR G : GadgetPtr ;
    BEGIN
      SetAPen(W^.rPort, 0);
      RectFill(W^.rPort, 0, 15, W^.width, W^.height);
      GadPos := AddGList(W, GPtr3, -1, 2, NIL) ;
      RefreshGList(GPtr3, W, NIL, 2) ;
      SetAPen(W^.rPort, 3);
      Move(W^.rPort, 131, 218) ; Text(W^.rPort, ADR("ABBRUCH"), 7) ;
      Move(W^.rPort, 131, 234) ; Text(W^.rPort, ADR("   F1"), 5) ;
      Move(W^.rPort, 496, 218) ; Text(W^.rPort, ADR("   OK"), 5) ;
      Move(W^.rPort, 496, 234) ; Text(W^.rPort, ADR("  F10"), 5) ;
      SetAPen(W^.rPort, 1);
      Move(W^.rPort, 80, 38); Text(W^.rPort, ADR("abgefragt : "), 11);
      ValToStr(LONGINT(Vok.abgefragt[v]), FALSE, Zahl, 10, 5, " ",
               fehler);
      Text(W^.rPort, ADR(Zahl), Length(Zahl));
      Move(W^.rPort, 260, 38); Text(W^.rPort, ADR("gewußt : "), 9);
      ValToStr(LONGINT(Vok.gewusst[v]), FALSE, Zahl, 10, 5, " ",
               fehler);
      Text(W^.rPort, ADR(Zahl), Length(Zahl));
      DrawBorder(W^.rPort, ADR(Rand2), 430, 30) ;
      SetAPen(W^.rPort, 3) ;
      IF Vok.abgefragt[v] # 0 THEN
        bruch := REAL(Vok.gewusst[v]) / REAL(Vok.abgefragt[v]);
        lang := 431 + INTEGER(150.0 * bruch);
        RectFill(W^.rPort, 431, 31, lang, 40);
      END ;  (* IF *)
      DrawBorder(W^.rPort, ADR(Rand), 235, 72) ;
      Move(W^.rPort, 240, 80) ;
      Text(W^.rPort, ADR(Vok.Wort), Length(Vok.Wort)) ;
      FOR m := 1 TO 5 DO
        Buffer[m] := "" ; UBuffer[m] := "" ;
      END ;  (* FOR *)
      RefreshGList(GPtr1, W, NIL, 5) ;
      aktiv := ActivateGadget(ADR(UeGad[0]), W, NIL) ;
      LOOP
        WaitPort(W^.userPort) ;
        Msg := GetMsg(W^.userPort) ;
        WHILE Msg # NIL DO
          class := Msg^.class ;
          code := Msg^.code ;
          G := Msg^.iAddress ;
          ReplyMsg(Msg) ;
          IF (rawKey IN class) THEN
            IF code = 89 THEN
              EXIT ;
            ELSIF code = 80 THEN
              GadPos := RemoveGList(W, GPtr3, 2) ;
              RETURN FALSE ;
            END ;  (* IF code *)
          END ;  (* IF rawKey *)
          IF gadgetUp IN class THEN
            CASE G^.gadgetID OF
               1 : aktiv := ActivateGadget(ADR(UeGad[1]), W, NIL) |
               2 : aktiv := ActivateGadget(ADR(UeGad[2]), W, NIL) |
               3 : aktiv := ActivateGadget(ADR(UeGad[3]), W, NIL) |
               4 : aktiv := ActivateGadget(ADR(UeGad[4]), W, NIL) |
               5 : |
              10 : GadPos := RemoveGList(W, GPtr3, 2) ;
                   RETURN FALSE|
              11 : EXIT|
              ELSE;
            END ;  (* CASE *)
          END ;  (* IF *)
          Msg := GetMsg(W^.userPort) ;
        END ;  (* WHILE *)
      END ;  (* LOOP *)
      SetAPen(W^.rPort, 0) ;
      RectFill(W^.rPort, 10, 197, W^.width, 222) ;
      RefreshGList(GPtr3, W, NIL, 2) ;
      SetAPen(W^.rPort, 3) ;
      Move(W^.rPort, 131, 218) ; Text(W^.rPort, ADR(" Falsch"), 7) ;
      Move(W^.rPort, 496, 218) ; Text(W^.rPort, ADR("Richtig"), 7) ;
      FOR k := 0 TO 4 DO
        DrawBorder(W^.rPort, ADR(Rand), 337, 98 + 20 * k) ;
      END ;  (* FOR *)
      SetAPen(W^.rPort, 3) ;
      FOR m := 0 TO 4 DO
        Move(W^.rPort, 342, 108 + 20 * m) ;
        Text(W^.rPort, ADR(Vok.Uebersetzung[m]),
             Length(Vok.Uebersetzung[m]));
      END ;  (* FOR *)
      LOOP
        WaitPort(W^.userPort) ;
        Msg := GetMsg(W^.userPort) ;
        WHILE Msg # NIL DO
          class := Msg^.class ;
          G := Msg^.iAddress ;
          code := Msg^.code ;
          ReplyMsg(Msg) ;
          IF rawKey IN class THEN
            IF code = 80 THEN
              INC(Vok.abgefragt[v]) ;
              INC(Kopf.gefragtV) ;
              EXIT ;
            ELSIF code = 89 THEN
              INC(Vok.abgefragt[v]) ;
              INC(Vok.gewusst[v]) ;
              INC(Kopf.gefragtV) ;
              INC(Kopf.gewusstV) ;
              EXIT ;
            END ;  (* IF code *)
          END ;  (* IF rawKey *)
          IF gadgetUp IN class THEN
            CASE G^.gadgetID OF
              10 : INC(Vok.abgefragt[v]) ;
                   INC(Kopf.gefragtV) ;
                   EXIT |
              11 : INC(Vok.abgefragt[v]) ;
                   INC(Vok.gewusst[v]) ;
                   INC(Kopf.gefragtV) ;
                   INC(Kopf.gewusstV) ;
                   EXIT|
              ELSE;
            END ;  (* CASE *)
          END ;  (* IF *)
          Msg := GetMsg(W^.userPort) ;
        END ;  (* WHILE *)
      END ;  (* LOOP *)
      GadPos := RemoveGList(W, GPtr3, 2) ;
      SetAPen(W^.rPort, 0) ;
      RectFill(W^.rPort, 330, 10, W^.width, 200) ;
      RETURN TRUE ;
  END AbfrageVUe ;


  PROCEDURE AbfrageUeV(VAR Kopf: VKopf; VAR Vok: Vokabel; W: WindowPtr):
                      BOOLEAN ;
    VAR G : GadgetPtr ;
    BEGIN
      SetAPen(W^.rPort, 0);
      RectFill(W^.rPort, 0, 15, W^.width, W^.height);
      GadPos := AddGList(W, GPtr3, -1, 2, NIL) ;
      RefreshGList(GPtr3, W, NIL, 2) ;
      SetAPen(W^.rPort, 3) ;
      Move(W^.rPort, 131, 218) ; Text(W^.rPort, ADR("ABBRUCH"), 7) ;
      Move(W^.rPort, 131, 234) ; Text(W^.rPort, ADR("   F1"), 5) ;
      Move(W^.rPort, 496, 218) ; Text(W^.rPort, ADR("   OK"), 5) ;
      Move(W^.rPort, 496, 234) ; Text(W^.rPort, ADR("  F10"), 5) ;
      SetAPen(W^.rPort, 1) ;
      Move(W^.rPort, 80, 38) ; Text(W^.rPort, ADR("abgefragt : "), 11);
      ValToStr(LONGINT(Vok.abgefragt[ue]), FALSE, Zahl, 10, 5, " ",
               fehler);
      Text(W^.rPort, ADR(Zahl), 5) ;
      Move(W^.rPort, 260, 38) ; Text(W^.rPort, ADR("gewußt : "), 8) ;
      ValToStr(LONGINT(Vok.gewusst[ue]), FALSE, Zahl, 10, 5, " ",
               fehler);
      Text(W^.rPort, ADR(Zahl), 5) ;
      DrawBorder(W^.rPort, ADR(Rand2), 430, 30) ;
      SetAPen(W^.rPort, 3) ;
      IF Vok.abgefragt[ue] # 0 THEN
        bruch := REAL(Vok.gewusst[ue]) / REAL(Vok.abgefragt[ue]);
        lang := 431 + INTEGER(150.0 * bruch);
        RectFill(W^.rPort, 431, 31, lang, 40);
      END ;  (* IF *)
      FOR k := 0 TO 4 DO
        DrawBorder(W^.rPort, ADR(Rand), 103, 78 + 20 * k) ;
      END ;  (* FOR *)
      FOR m := 0 TO 4 DO
        Move(W^.rPort, 108, 86 + m * 20) ;
        Text(W^.rPort, ADR(Vok.Uebersetzung[m]),
             Length(Vok.Uebersetzung[m]));
      END ;  (* FOR *)
      Buffer[0] := "" ; UBuffer[0] := "" ;
      RefreshGList(GPtr2, W, NIL, 1) ;
      aktiv := ActivateGadget(GPtr2, W, NIL) ;
      LOOP
        WaitPort(W^.userPort) ;
        Msg := GetMsg(W^.userPort) ;
        WHILE Msg # NIL DO
          class := Msg^.class ;
          G := Msg^.iAddress ;
          code := Msg^.code ;
          ReplyMsg(Msg) ;
          IF (rawKey IN class) THEN
            IF code = 89 THEN
              EXIT ;
            ELSIF code = 80 THEN
              GadPos := RemoveGList(W, GPtr3, 2) ;
              RETURN FALSE ;
            END ;  (* IF code *)
          END ;  (* IF rawKey *)
          IF gadgetUp IN class THEN
            CASE G^.gadgetID OF
              10 : GadPos := RemoveGList(W, GPtr3, 2) ;
                   RETURN FALSE |
              11 : EXIT |
              ELSE ;
            END ;  (* CASE *)
          END ;  (* IF *)
          Msg := GetMsg(W^.userPort) ;
        END ;  (* WHILE *)
      END ;  (* LOOP *)
      SetAPen(W^.rPort, 0) ;
      RectFill(W^.rPort, 10, 190, W^.width, 222) ;
      RefreshGList(GPtr3, W, NIL, 2) ;
      SetAPen(W^.rPort, 3) ;
      Move(W^.rPort, 131, 218) ; Text(W^.rPort, ADR(" Falsch"), 7) ;
      Move(W^.rPort, 496, 218) ; Text(W^.rPort, ADR("Richtig"), 7) ;
      DrawBorder(W^.rPort, ADR(Rand), 350, 137) ;
      Move(W^.rPort, 355, 146) ;
      Text(W^.rPort, ADR(Vok.Wort), Length(Vok.Wort)) ;
      LOOP
        WaitPort(W^.userPort) ;
        Msg := GetMsg(W^.userPort) ;
        WHILE Msg # NIL DO
          class := Msg^.class ;
          G := Msg^.iAddress ;
          code := Msg^.code ;
          ReplyMsg(Msg) ;
          IF rawKey IN class THEN
            IF code = 80 THEN
              INC(Vok.abgefragt[ue]) ;
              INC(Kopf.gefragtU) ;
              EXIT ;
            ELSIF code = 89 THEN
              INC(Vok.abgefragt[ue]) ;
              INC(Vok.gewusst[ue]) ;
              INC(Kopf.gefragtU) ;
              INC(Kopf.gewusstU) ;
              EXIT ;
            END ;  (* IF code *)
          END ;  (* IF rawKey *)
          IF gadgetUp IN class THEN
            CASE G^.gadgetID OF
              10 : INC(Vok.abgefragt[ue]) ;
                   INC(Kopf.gefragtU) ;
                   EXIT |
              11 : INC(Vok.abgefragt[ue]) ;
                   INC(Vok.gewusst[ue]) ;
                   INC(Kopf.gefragtU) ;
                   INC(Kopf.gewusstU) ;
                   EXIT|
              ELSE;
            END ;  (* CASE *)
          END ;  (* IF *)
          Msg := GetMsg(W^.userPort) ;
        END ;  (* WHILE *)
      END ;  (* LOOP *)
      GadPos := RemoveGList(W, GPtr3, 2) ;
      SetAPen(W^.rPort, 0) ;
      RectFill(W^.rPort, 330, 130, W^.width, 170) ;
      RETURN TRUE ;
  END AbfrageUeV ;



  PROCEDURE Abfrage(W: WindowPtr; VAR Kopf: VKopf; Mod: Modus): BOOLEAN;
    VAR abgefragt,
        dummy      : BOOLEAN ;
    BEGIN
      abgefragt := FALSE ;
      IF Mod # Kopf.Mod THEN
        IF NOT Umsortieren(Mod, Kopf, W) THEN
          RETURN FALSE ;
        END ;  (* IF NOT *)
      END ;  (* IF Mod *)
      FOR m := 0 TO 3 DO
        Anz[m] := INTEGER(EntriesInList(Kopf.Gruppe[m])) ;
      END ;  (* FOR *)
      Auswahl(GNr, VNr, Anz[0], Anz[1], Anz[2], Anz[3]) ;
      INCL(W^.idcmpFlags, gadgetUp) ;
      INCL(W^.idcmpFlags, rawKey) ;
      ModifyIDCMP(W, W^.idcmpFlags) ;
      SetAPen(W^.rPort, 0) ; RectFill(W^.rPort, 10, 10, 630, 246) ;
      IF Kopf.Mod = v THEN
        GadPos := AddGList(W, GPtr1, -1, 5, NIL) ;
        Eintrag := LocateEntryAbs(Kopf.Gruppe[GNr], VNr) ;
        ReadEntryC(Kopf.Gruppe[GNr], Eintrag, Vok) ;
        WHILE AbfrageVUe(Kopf, Vok, W) DO
          GNr2 := Einteilung(Vok.abgefragt[v], Vok.gewusst[v]) ;
          IF GNr2 = GNr THEN
            ReplaceEntryC(Kopf.Gruppe[GNr], Eintrag, Vok) ;
          ELSE
            DeleteEntry(Kopf.Gruppe[GNr], Eintrag) ;
            AppendEntryC(Kopf.Gruppe[GNr2], Vok) ;
            INC(Anz[GNr2]) ; DEC(Anz[GNr]) ;
          END ;  (* IF GNr *)
          Auswahl(GNr, VNr, Anz[0], Anz[1], Anz[2], Anz[3]) ;
          Eintrag := LocateEntryAbs(Kopf.Gruppe[GNr], VNr) ;
          ReadEntryC(Kopf.Gruppe[GNr], Eintrag, Vok) ;
          abgefragt := TRUE ;
        END ;  (* WHILE *)
        GadPos := RemoveGList(W, GPtr1, 5) ;
      ELSE
        GadPos := AddGList(W, GPtr2, -1, 1, NIL) ;
        Eintrag := LocateEntryAbs(Kopf.Gruppe[GNr], VNr) ;
        ReadEntryC(Kopf.Gruppe[GNr], Eintrag, Vok) ;
        WHILE AbfrageUeV(Kopf, Vok, W) DO
          GNr2 := Einteilung(Vok.abgefragt[ue], Vok.gewusst[ue]) ;
          IF GNr2 = GNr THEN
            ReplaceEntryC(Kopf.Gruppe[GNr], Eintrag, Vok) ;
          ELSE
            DeleteEntry(Kopf.Gruppe[GNr], Eintrag) ;
            AppendEntryC(Kopf.Gruppe[GNr2], Vok) ;
            INC(Anz[GNr2]) ; DEC(Anz[GNr]) ;
          END ;  (* IF GNr *)
          Auswahl(GNr, VNr, Anz[0], Anz[1], Anz[2], Anz[3]) ;
          Eintrag := LocateEntryAbs(Kopf.Gruppe[GNr], VNr) ;
          ReadEntryC(Kopf.Gruppe[GNr], Eintrag, Vok) ;
          abgefragt := TRUE ;
        END ;  (* WHILE *)
        GadPos := RemoveGList(W, GPtr2, 1) ;
      END ;  (* IF Kopf.Mod *)
      EXCL(W^.idcmpFlags, gadgetUp) ;
      EXCL(W^.idcmpFlags, rawKey) ;
      ModifyIDCMP(W, W^.idcmpFlags) ;
      SetAPen(W^.rPort, 0) ;
      RectFill(W^.rPort, 10, 10, W^.width, W^.height);
      IF abgefragt THEN
        RETURN TRUE ;
      ELSE
        RETURN FALSE ;
      END ;  (* IF abgefragt *)
  END Abfrage ;


  BEGIN    (* VAbfrage *)
    AllocProc := AllocMem ; DeallocProc := Deallocate ;
    FOR m := 0 TO 5 DO
      Buffer[m] := "" ; UBuffer[m] := "" ;
      StructString(SInfo[m], Buffer[m], UBuffer[m]) ;
    END ;  (* FOR *)
    StructBorder(VBorder, -8, -4, 1, jam1, 4, NIL) ;
    Rectangle(215, 15) ;
    BorderEnd ;
    StructGadget(VGad, 350, 100, 200, 10, GadgetFlagSet{},
                 ActivationFlagSet{relVerify}, strGadget, ADR(VBorder),
                 NIL, LONGSET{}, 0, NIL) ;
    VGad.specialInfo := ADR(SInfo[0]) ;
    FOR m := 0 TO 4 DO
      StructBorder(UeBorder[m], -8, -4, 1, jam1, 4, NIL) ;
      Rectangle(215, 15) ;
      BorderEnd ;
      StructGadget(UeGad[m], 105, 100 + 20 * m, 200, 10, GadgetFlagSet{},
                   ActivationFlagSet{relVerify}, strGadget,
                   ADR(UeBorder[m]), NIL, LONGSET{}, 1 + m, NIL) ;
      UeGad[m].specialInfo := ADR(SInfo[m + 1]) ;
    END ;  (* FOR *)
    FOR m := 0 TO 3 DO
      UeGad[m].nextGadget := ADR(UeGad[m + 1]) ;
    END ;  (* FOR *)
    FOR m := 0 TO 1 DO
      StructBorder(TBorder[m], -2, -2, 3, jam1, 4, NIL) ;
      Rectangle(85, 16) ;
      BorderEnd ;
      StructGadget(TGad[m], 117 + m * 365, 210, 80, 12, GadgetFlagSet{},
                   ActivationFlagSet{gadgImmediate, relVerify},
                   boolGadget, ADR(TBorder[m]), NIL, LONGSET{}, 10 + m,
                   NIL);
    END ;  (* FOR *)
    TGad[0].nextGadget := ADR(TGad[1]) ;
    GPtr1 := ADR(UeGad[0]) ; GPtr2 := ADR(VGad) ;
    GPtr3 := ADR(TGad[0]) ;
    StructBorder(Rand, -2, -2, 1, jam1, 4, NIL) ;
    Rectangle(205, 15) ;
    BorderEnd ;
    StructBorder(Rand2, 0, 0, 1, jam1, 4, NIL) ;
    Rectangle(153, 12) ;
    BorderEnd ;
    WITH Meldung1 DO
      frontPen := 3 ; backPen := 1 ; drawMode := jam1 ;
      leftEdge := 15 ; topEdge := 15 ;
      iTextFont := ADR(attr);
      iText := ADR("Konnte Datei nicht umsortieren");
      nextText := NIL ;
    END ;  (* WITH *)
    WITH Meldung2 DO
      frontPen := 3 ; backPen := 1 ; drawMode := jam1 ;
      leftEdge := 15 ; topEdge := 15 ;
      iTextFont := ADR(attr);
      iText := ADR("Fehler beim umsortieren : Datei kaput");
      nextText := NIL ;
    END ;  (* WITH *)
    WITH Schade DO
      frontPen := 3 ; backPen := 1 ; drawMode := jam1 ;
      leftEdge := 5 ; topEdge := 4 ;
      iTextFont := ADR(attr); iText := ADR("Schade") ;
      nextText := NIL ;
    END ;  (* WITH *)
    WITH Pech DO
      frontPen := 3 ; backPen := 1 ; drawMode := jam1 ;
      leftEdge := 5 ; topEdge := 4 ;
      iTextFont := ADR(attr); iText := ADR("Pech") ;
      nextText := NIL ;
    END ;  (* WITH *)


END VAbfrage.
