home *** CD-ROM | disk | FTP | other *** search
/ Fifty: Elektronik / FIFTY Elektronik (PS_Computer_Vertrieb).iso / ps8 / fty1017 / gepackt.exe / DISK2 / PLOTSRC.EXE / INPUT.IMP < prev    next >
Encoding:
Text File  |  1993-11-10  |  16.4 KB  |  641 lines

  1. type  Buttons = Record
  2.                    Knopf1,Knopf2,Knopf3 :Boolean;
  3.                  End;
  4. Const Uses_Maus :Boolean=false;
  5.       MausDx    :Integer=0;
  6.       MausDy    :Integer=0;
  7.  
  8. Var   Knoepfealt,Knoepfeneu :Buttons;
  9.  
  10. CONST  HlpWinCol   :Byte =Crt.White+16*Crt.Lightgray;
  11.        HlpNorCol   :Byte =Crt.blue+16*Crt.Lightgray;
  12.        HlpHeadCol  :Byte =Crt.White+16*Crt.green;
  13.        HelpActive  :Boolean=false;
  14.        DiaWinCol   :Byte =blue+16*green;
  15.        DiaHeadCol  :Byte =White+16*green;
  16.  
  17. Const  Helptable   :Array['A'..'Z'] of Byte =
  18.                     (1,2,4,10,15,16,19,24,31,38,42,45,52,57,
  19.                     59,64,69,70,71,74,81,86,96,104,106,111);
  20.  
  21.  
  22. VAR    Help_Wok      : INTEGER;
  23.        Help_Win      : WindowType;
  24.        Helpfile      : HelpF;
  25.  
  26.  
  27.  
  28. PROCEDURE SetCursor (C:Word);       { Cursorform setzen }
  29. VAR Regs  : Registers;
  30. BEGIN
  31.      WITH Regs DO BEGIN
  32.           AX := $0100;        { Set Cursor }
  33.           cx := C;
  34.           intr ($10,Regs);  { Video Interrupt }
  35.        END;
  36. END;  { Cursor }
  37.  
  38. PROCEDURE GetCursor (VAR C:Word);   { Cursorform lesen }
  39. VAR Regs  : Registers;
  40. BEGIN
  41.      WITH Regs DO BEGIN
  42.           AX := $0300;        { Read Cursor }
  43.           intr ($10,Regs);  { Video interrupt }
  44.           C := cx;          { CX enhält Cursorzeilen }
  45.        END;
  46. END;
  47.  
  48.  
  49. Procedure Beep;
  50. begin
  51.   Sound(2000);Delay(30);Nosound;
  52. end;
  53.  
  54. procedure Maus(var M1,M2,M3,M4 : Integer);
  55. var Regs : Registers;
  56. begin
  57.   with Regs do begin
  58.     AX := M1;  BX := M2;
  59.     CX := M3;  DX := M4
  60.   end;
  61.   Intr(51,Regs);             (* Interrupt 51 aufrufen *)
  62.   with Regs do begin
  63.     M1 := AX;  M2 := BX;
  64.     M3 := CX;  M4 := DX
  65.   end;
  66. end;
  67.  
  68. Procedure ResetMouseDelta;
  69. Var M1,M2 :Integer;
  70. begin
  71.   MausDx:=0;
  72.   MausDy:=0;
  73.   If Uses_Maus then
  74.     begin
  75.       M1:=11; Maus(M1,M2,M2,M2);
  76.     end;
  77. end;
  78.  
  79. Procedure MausInit;
  80. Var M1,M2,M3,M4 :Integer;
  81.     P           :Pointer;
  82. Begin
  83.   GetIntVec(51,P);
  84.   Uses_Maus:=P<>nil;
  85.   If Uses_Maus then
  86.   begin
  87.     M1:=0;M2:=0;M3:=0;M4:=0;
  88.     Maus(M1,M2,M3,M4);
  89.     Uses_Maus:=M1=-1;
  90.     If Uses_Maus then
  91.     begin
  92.       M1:=15;M2:=0;M3:=2;
  93.       Maus(M1,M2,M3,M3);
  94.     end;
  95.   end;
  96.   ResetMouseDelta;
  97.   With Knoepfealt Do
  98.     begin
  99.       Knopf1:=false;
  100.       Knopf2:=false;
  101.       Knopf3:=false;
  102.     end;
  103.     KnoepfeNeu:=Knoepfealt;
  104. End;
  105.  
  106. Procedure GetMaus(Var Knoepfe : Buttons);
  107. Var M1,M2,M3,M4 :Integer;
  108. Const OldMausRatio:Word=0;
  109. Begin
  110.  If Uses_Maus then
  111.   begin
  112.     If OldMausRatio<>Maus_Ratio then
  113.     begin
  114.       Maus_Ratio:=Maus_Ratio and $0F;
  115.       M1:=15;M2:=0;M3:=16-Maus_Ratio;M4:=M3;
  116.       Maus(M1,M2,M3,M4);
  117.       OldMausRatio:=Maus_Ratio;
  118.     end;
  119.     M1:=3;M2:=0;M3:=0;M4:=0;
  120.     Maus(M1,M2,M3,M4);
  121.     Delay(10);
  122.     With KnoepfeNeu Do
  123.     Begin
  124.       M2:=M2 and 7;
  125.       Knopf1:=M2=1;
  126.       Knopf2:=M2=2;
  127.       Knopf3:=(M2 = 4) or (M2=3);
  128.      End;
  129.     With Knoepfe Do
  130.     Begin
  131.       Knopf1:=Not(Knoepfealt.Knopf1) and Knoepfeneu.Knopf1;
  132.       Knopf2:=Not(Knoepfealt.Knopf2) and Knoepfeneu.Knopf2;
  133.       Knopf3:=Not(Knoepfealt.Knopf3) and Knoepfeneu.Knopf3;
  134.      End;
  135.      KnoepfeAlt:=Knoepfeneu;
  136.    end;
  137. End;
  138.  
  139. PROCEDURE FlushKbd;                    { Löscht den Tastaturpuffer }
  140. VAR CH  : Char;
  141. BEGIN
  142.   While Crt.Keypressed do Ch:=crt.ReadKey;
  143. END;
  144.  
  145.  
  146. Procedure MausKey(Var Ch :Char;Var Valid :Boolean);
  147. Var Knob        :Buttons;
  148.     Dx,Dy,M1,M2 :Integer;
  149. Begin
  150.  If Uses_Maus then
  151.  begin
  152.    GetMaus(Knob);
  153.    With Knob Do
  154.     If Knopf1 or Knopf2 or Knopf3 Then
  155.      Begin
  156.        Delay(50);
  157.        Valid:=true;
  158.        If Knopf1 Then Ch:=Mouse_Left
  159.          else If Knopf2 Then Ch:=Mouse_Right
  160.            else If Knopf3 Then CH:=Mouse_Mid;
  161.      End;
  162.    M1:=11; Maus(M1,M2,Dx,Dy);
  163.    Inc(MausDx,Dx );
  164.    Dec(MausDy,Dy );
  165.    If Abs(MausDx)>32*(16-Maus_ratio) then
  166.      begin
  167.        Valid:=True;
  168.        If MausDx>0  then CH:=^D else CH:=^S;
  169.        MausDx:=0;
  170.       end;
  171.    If Abs(MausDy)>16*(16-Maus_Ratio) then
  172.      begin
  173.        Valid:=True;
  174.        If MausDy>0  then CH:=^E else CH:=^X;
  175.        MausDy:=0;
  176.       end;
  177.  end;
  178. End;
  179.  
  180. Function Keypressed:Boolean;
  181. CONST ALT          = 8;
  182.       AltLeftShift =10;
  183. VAR   KbFlag       : INTEGER ABSOLUTE $40:$17;
  184.       { Status (ALT,CTRL,CAPS,SHIFT) }
  185.       Ch           : Char;
  186.       IsHelp,
  187.       Taste,
  188.       AltLeft      : Boolean;
  189.       REG          :Registers;
  190. BEGIN  { Keypressed}
  191.   Taste:=Crt.Keypressed;
  192.   AltLeft:=(AltLeftShift and KBFlag) =10;
  193.   If Taste or AltLeft then
  194.   begin
  195.     With REG Do
  196.     begin
  197.       AH:=1;
  198.       Intr($16,REG);
  199.       IsHelp:=((Flags and Fzero) = 0) and (AH=35) and (AL =0);
  200.     end;
  201.     { Hilfe-System auf ALT-H}
  202.     If Ishelp or AltLeft Then
  203.       If HelpActive Then Beep else
  204.         begin
  205.           FlushKbd;
  206.           Dohelp;
  207.           Taste:=false;
  208.         end;
  209.   end;
  210.   Keypressed:=Taste;
  211. END; { Keypressed }
  212.  
  213. Procedure LeseTastatur(Var Ch :Char;Var F:Integer;Var Valid :Boolean);
  214. Var Zweiter  :Char;
  215. begin
  216.  Ch:=ReadKey;
  217.  F:=-1;
  218.  Valid:=true;
  219.  If (Ch=Nul) and keypressed then
  220.    begin
  221.      Zweiter:=ReadKey;
  222.      Case Zweiter of
  223.        #75 :Ch:=^S;  { Pfeil links  }
  224.        #77 :Ch:=^D;  { Pfeil rechts }
  225.        #72 :Ch:=^E;  { Pfeil rauf   }
  226.        #80 :Ch:=^X;  { Pfeil runter }
  227.        #71 :Ch:=^A;  { Anfang       }
  228.        #79 :Ch:=^F;  { ende         }
  229.        #83 :Ch:=^G;  { Löschen      }
  230.        #82 :Ch:=^V;  { Einfügen     }
  231.        #81 :Ch:=^Q;  { Page-down    }
  232.        #73 :CH:=^Z;  { Page-up      }
  233.      else
  234.        begin
  235.          Ch:=#0;
  236.          F:=Ord(Zweiter)+1000;
  237.        end;
  238.      end;
  239.    end;
  240.    If F=-1 then F:=Ord(Upcase(Ch));
  241.  end;
  242.  
  243.  
  244. Function ReadKbd(Var Ch:Char):Integer;
  245.  
  246. Var    F,X,Y   :Integer;
  247.        Valid       :Boolean;
  248. begin
  249.  F:=0;
  250.  Valid:=false;
  251.  Repeat
  252.    If Keypressed then Lesetastatur(Ch,F,Valid)
  253.     else Mauskey(Ch,Valid);
  254.  Until Valid;
  255.  ReadKbd:=F;
  256. end;
  257.  
  258. Procedure InputKbd(var S     : Str80;      (*Eingabestring*)
  259.                        L,X,Y : Integer;    (* L= max. Länge,XY=Schirmpos.*)
  260.                        Term  : CharSet;    (* Menge der Terminierungszeichen*)
  261.                        OkSet : CharSet;    (* zulässige Eingabezeichen *)
  262.                    var TC    : Char    );  (* Terminierungszeichen*)
  263. (* Narrensichere String-eingabe mit vollen Editiermöglichkeiten *)
  264. var
  265.   P,Dummy : Integer;
  266.   SaveCursor:Word;
  267.   SaveTxtCol:Byte;
  268.   Ch : Char;
  269.   ErasePossible:Boolean;
  270.  
  271. begin
  272.   FlushKbd;
  273.   ErasePossible:=Auto_ClrInp;
  274.   SaveTxtCol:=TextAttr;
  275.   GetCursor(SaveCursor);
  276.   SetCursor(CursorInital);
  277.   TextColor(Editforeground);
  278.   TextBackground(Editbackground);
  279.   GotoXY(X,Y); Write(S,ConstStr(FuellChar,L - Length(S)));
  280.   P := 0;
  281.   repeat
  282.     GotoXY(X + P,Y); Dummy:=ReadKbd(Ch);
  283.     If Ch in Okset then
  284.      begin
  285.        If ErasePossible then
  286.         begin
  287.          GotoXY(X,Y);
  288.          Write(ConstStr(FuellChar,Length(S)));
  289.          S:='';
  290.          GotoXY(X,Y);
  291.         end;
  292.        if P < L then
  293.           begin
  294.             P := P + 1;
  295.             If Overwrite then
  296.               begin Insert(Ch,S,P);Delete(S,P+1,1); end
  297.             else
  298.               begin
  299.                 if Length(S) = L then Delete(S,L,1);
  300.                 Insert(Ch,S,P);
  301.               end;
  302.             Write(Copy(S,P,L));
  303.           end else Beep
  304.      end
  305.    else
  306.      case Ch of
  307.         ^V        : OverWrite:=Not(OverWrite);
  308.         ^S        : if P > 0 then
  309.                       P := P - 1
  310.                     else Beep;
  311.         ^D        : if P < Length(S) then
  312.                       P := P + 1
  313.                     else Beep;
  314.         ^A        : P := 0;
  315.         ^F        : P := Length(S);
  316.         ^G        : if P < Length(S) then
  317.                     begin
  318.                       Delete(S,P + 1,1);
  319.                       Write(Copy(S,P + 1,L),FuellChar);
  320.                     end;
  321.         ^H,#127   : if P > 0 then
  322.                     begin
  323.                       Delete(S,P,1);
  324.                       Write(^H,Copy(S,P,L),FuellChar);
  325.                       P := P - 1;
  326.                     end
  327.                     else Beep;
  328.         ^Y        : begin
  329.                       Write(ConstStr(FuellChar,Length(S) - P));
  330.                       Delete(S,P + 1,L);
  331.                     end;
  332.       else
  333.         if not (Ch in Term) then Beep;
  334.       end;  {of case}
  335.     ErasePossible:=False;
  336.   until Ch in Term;
  337.   TextAttr:=SaveTxtCol;
  338.   P := Length(S);
  339.   GotoXY(X,Y);Write(S);
  340.   GotoXY(X + P,Y);
  341.   Write('':L - P);
  342.   TC := Ch;
  343.   SetCursor(SaveCursor);
  344. end;
  345.  
  346. Function LeseInt(I, L,X,Y,Min,Max :Integer;Var TC  :Char): Integer;
  347. (* Narrensichere Integereingabe mit vollen Editiermöglichkeiten *)
  348. (* Min,Max : Maximaler Zahlenbereich, sonst wie InputKbd *)
  349. Var Result,Wert: Integer;
  350.     Ok :Boolean;
  351. begin
  352.   Result:=0;Wert:=0;Ok:=true;
  353.   LeseInt:=I;
  354.   Str(I,OutString);
  355.   Repeat
  356.     If result <>0 then
  357.     Delete(Outstring,Result,Length(Outstring)-Result+1)
  358.     else  Str(I,OutString);
  359.     InputKbd(OutString,L,X,Y,Term,['-','0'..'9'],TC);
  360.     Val(OutString,Wert,Result);
  361.     Ok:=(Result=0) and (Wert<=Max) and (Wert>=Min);
  362.     If Not(Ok ) then Beep;
  363.   Until Ok;
  364.   LeseInt:=Wert;
  365. end;
  366.  
  367. Function Cardinal(X:Integer):Real;
  368. (* Wandelt Integer in Real (0..65535) um *)
  369. Var  Z:Word absolute X;
  370. Begin
  371.   Cardinal:=Z;
  372. end;
  373.  
  374. Procedure RealStr(X:Real;L: Integer; Var S :Str80);
  375. (* Wandelt Reals in String um,L gültige Ziffern, entfernt Blanks und 0*)
  376.   begin
  377.     Str(X:13:7,S);
  378.     While S[1]=' ' Do Delete(S,1,1);
  379.     While (S[Length(S)]='0') and Not(S[Length(S)-1] ='.') Do
  380.       Delete(S,Length(S),1);
  381.     Delete(S,L+1,Length(S)-L);
  382.   end;
  383.  
  384. Function LeseReal(Zahl:Real; L,X,Y :Integer;Min,Max :Real ;
  385.                   Var TC  :Char): Real;
  386. (* L = Anzahl gueltiger Ziffern +2 (Punkt,Vorzeichen) *)
  387. (* Narrensichere Realeingabe mit vollen Editiermöglichkeiten *)
  388. (* Min,Max : Maximaler Zahlenbereich, sonst wie InputKbd *)
  389. Var Result: Integer;
  390.     Wert :Real;
  391.     Ok   :Boolean;
  392.     I:Byte;
  393. begin
  394.   Result:=0;Wert:=0;
  395.   LeseReal:=Zahl;
  396.   RealStr(Zahl,L,OutString);
  397.   If max>0 then
  398.    Max:=Max*1.00000001
  399.   else
  400.    Max:=Max*0.99999999;
  401.   If min>0 then
  402.    Min:=Min*0.99999999
  403.   else
  404.    Min:=Min*1.00000001;
  405.   Repeat
  406.     If result <>0 then
  407.     Delete(Outstring,Result,Length(Outstring)-Result+1)
  408.     else  RealStr(Zahl,L,OutString);
  409.     InputKbd(OutString,L,X,Y,Term,[',','.','-','0'..'9'],TC);
  410.     For I:=1 to Byte(OutString[0]) do
  411.       If OutString[I]=',' then OutString[I]:='.';
  412.     Val(OutString,Wert,Result);
  413.     Ok :=(Result=0) and (Wert<=Max) and (Wert>=Min);
  414.     If Not(Ok) then Beep;
  415.   Until Ok;
  416.   LeseReal:=Wert;
  417. end;
  418.  
  419. Procedure Select(    Prompt : Str80;
  420.                      Term   : CharSet;
  421.                  var TC     : Char    );
  422. (* Behandlung von Ein-Zeichen Abfragen *)
  423. var
  424.   Ch : Char;
  425.   Dummy :Integer;
  426. begin
  427.   Write(Prompt ); ClrEol;
  428.   repeat
  429.     Dummy:=ReadKbd(Ch);
  430.     TC := Upcase(Ch);
  431.     if not (TC in Term) then
  432.       Beep;
  433.   until TC in Term;
  434.   If TC in [' '..#127] then Write(TC);
  435. end;
  436.  
  437. Function Menueende(Var L :Integer;Max,Genug :Integer;TC :Char) :Boolean;
  438. (* Wird in Menüs als Abbruchkriterium gebraucht   *)
  439. begin
  440.   If (TC = ^I) or (TC = ^M) or (TC = ^X) or (TC=^Q) then
  441.       if L = Max then
  442.         L := 1
  443.       else L := L + 1
  444.     else
  445.       if TC = ^E then
  446.         if L = 1 then
  447.           L := Max
  448.         else L := L - 1;
  449.    Menueende:=((TC = ^M) and (L = 1))or ((TC=^Q) and (L=Genug))
  450.               or (TC = ^Z) or (TC=Esc);
  451. end;
  452.  
  453. Procedure LeseFname(Var S :Str10;X,Y :Integer;Var TC:Char);
  454. Var L  :Integer;
  455.     Key :Char;
  456.     Gut :Boolean;
  457. Const Buchstaben :Charset = ['A'..'Z','a'..'z','0'..'9'];
  458. begin
  459.   s:='';
  460.   GotoXY(X,Y);Write('Dateiname :');
  461.   L:=1;
  462.   Repeat
  463.     InputKbd(S,8,X+12,Y,Term,Buchstaben,TC);
  464.     Gut:=(Length(S)>0) or (TC=ESc);
  465.   Until Menueende(L,1,1,TC) and Gut;
  466.   S:=UpcaseStr(S);
  467. end;
  468.  
  469.  
  470. Procedure WaitonKey;
  471. Var Ch :Char;
  472. Begin
  473.   If Keypressed Then Ch:=ReadKey;
  474.   Repeat Until Keypressed;
  475.   Ch:=ReadKey;
  476. End;
  477.  
  478. Function LoadHelpScreen(Var S:HelpScreen):Boolean;
  479. begin
  480.   {$I-}
  481.   LoadHelpscreen:=false;
  482.   Assign(Helpfile,SearchFile(Helpfilename));
  483.   Reset(Helpfile);
  484.   MaxHelpNr:=Pred(FileSize(HelpFile));
  485.   If IOresult=0 then
  486.   begin
  487.     If MaxHelpNr=-1 Then
  488.     begin
  489.       MaxHelpNr:=FileSize(HelpFile);
  490.       HelpAvailable:=MaxHelpNr>0;
  491.       MaxHelpNr:=Pred(MaxHelpNr);
  492.     end;
  493.     If ActualHelp>MaxHelpNr Then ActualHelp:=0;
  494.     Seek(Helpfile,ActualHelp);
  495.     If IOresult=0 then
  496.     begin
  497.       Read(Helpfile,S);
  498.       LoadHelpscreen:=Ioresult=0;
  499.     end;
  500.     Close(Helpfile);
  501.   end else Helpavailable:=false;
  502.   {$I+}
  503. end;
  504.  
  505. PROCEDURE Crea_Help;
  506. Var S:Helpscreen;
  507.   BEGIN
  508.     If Not(ModeCO80) then
  509.     begin
  510.       HlpWinCol  :=CalcAttr(Crt.black,Crt.lightgray);
  511.       HlpNorCol  :=CalcAttr(Crt.black,Crt.lightgray);
  512.       HlpHeadCol :=CalcAttr(Crt.White,Crt.black);
  513.     end;
  514.     HelpAvailable:=LoadHelpScreen(S);
  515.     If HelpAvailable Then
  516.     begin
  517.       MakeWindow (Help_Win,6,6,68,16,HlpWinCol,Help_Wok);
  518.       HelpAvailable:=Help_Wok=0;
  519.     end;
  520.   END;
  521.  
  522. Procedure MakeHelp(Var HelpScr:HelpScreen);
  523.   Var I:Integer;
  524.       S:Str80;
  525.   begin
  526.     FillChar(S,Sizeof(S),32);
  527.     S[0]:=#66;
  528.     For I:=2 to 15 do
  529.     begin
  530.       WritetoWindow(Help_Win,2,I,HlpNorCol,S);
  531.       WritetoWindow(Help_Win,3,I,HlpNorCol,HelpScr[I]);
  532.      end;
  533.   end;
  534.  
  535. Procedure Dohelp;
  536. Var SaveCursor :Word;
  537.     OK,First  :Boolean;
  538.     Help:HelpScreen;
  539.     P0  :Integer;
  540.     KeyF:Integer;
  541.     Key :Char;
  542.     Prev:Integer;
  543. BEGIN
  544.   If HelpAvailable and Not(HelpActive) Then
  545.   begin
  546.     HelpActive:=true;
  547.     Ok:=LoadHelpScreen(Help);
  548.     If Ok Then
  549.      begin
  550.        First:=True;
  551.        GetCursor(SaveCursor);
  552.        SetCursor($2020);
  553.        Repeat
  554.          MakeFrame(Help_Win,HlpWinCol,2);
  555.          WriteToWindow(Help_Win,10,16,HlpHeadCol,
  556.                        ' <PgUp>,<PgDn> - ALT-R:Register - <ESC>:Ende ');
  557.          If Ok Then
  558.            begin
  559.             P0:=(66-Length(Help[1])) shr 1;
  560.             WritetoWindow(Help_Win,P0,1,HlpHeadCol,' '+Help[1]+' ');
  561.             MakeHelp(Help);
  562.            end
  563.            else
  564.              WritetoWindow(Help_Win,16,1,HlpHeadCol,' Fehler in Hilfe-Datei ');
  565.          If First Then PutWindow (Help_Win,Help_Wok)
  566.          else ShowWindow(Help_Win);                   { Hilfe anzeigen }
  567.          First:=false;
  568.          If Help_Wok=0 then
  569.          begin
  570.            KeyF:=ReadKbd(Key);
  571.            Prev:=ActualHelp;
  572.            Case Key of
  573.              ^Q :Inc(ActualHelp,1);
  574.              ^Z :Dec(ActualHelp,1);
  575.              else
  576.               begin
  577.                 If KeyF=1019 then ActualHelp:=0 else
  578.                 begin
  579.                   Key:=Upcase(Key);
  580.                   If (Ord(Key)>=Ord('A')) and (Ord(Key)<=Ord('Z')) then
  581.                    ActualHelp:=HelpTable[Key];
  582.                 end;
  583.               end;
  584.             end;
  585.             If ActualHelp<0 Then ActualHelp:=0;
  586.             If ActualHelp>MaxHelpNr Then ActualHelp:=MaxHelpNr;
  587.             If Prev<>ActualHelp Then
  588.                 Ok:=LoadHelpScreen(Help);
  589.            end else Key:=Esc;
  590.        UNTIL Key =Esc;
  591.        FlushKbd;
  592.        RestoreWindow (Help_Win,Help_Wok);            { Hintergrund anzeigen }
  593.        SetCursor(SaveCursor);
  594.       end;
  595.    end;
  596.    HelpActive:=false;
  597. END;
  598.  
  599. Function SelectError(Msg,Head:Str80;OkSet:Charset):Char;
  600. Var TC:Char;
  601.     L:Integer;
  602.     Wind_err:WindowType;
  603.     Wok     :Integer;
  604. begin
  605.   If Length(Msg)>76 then Msg:=Copy(Msg,1,76);
  606.   If Length(Head)>74 then Head:=Copy(Head,1,74);
  607.   L:=Length(Msg)+4;
  608.   If L<Length(Head) then L:=Length(Head)+6;
  609.   If L>80 then L:=80;
  610.   MakeWindow (wind_err,(80-L+1) div 2,17,L,3,ErrWinCol,wok);
  611.   MakeFrame(wind_err,ErrWinCol,2);
  612.   If Head<>'' then WriteToWindow(wind_err,3,1,ErrHeadCol,' '+Head+' ');
  613.   WritetoWindow(wind_err,3,2,ErrwinCol,Msg);
  614.   PutWindow(Wind_err,Wok);
  615.   While Crt.Keypressed do TC:=Crt.ReadKey;
  616.   Repeat
  617.     TC:=Upcase(Crt.ReadKey);
  618.   until TC in OkSet;
  619.   SelectError:=TC;
  620.   RestoreWindow(Wind_err,wok);
  621.   DeleteWindow(Wind_err);
  622. end;
  623.  
  624. Procedure  Message(Msg:Str80);
  625. Var L:Integer;
  626.     Wind_err:WindowType;
  627.     Wok     :Integer;
  628. begin
  629.   If Length(Msg)>76 then Msg:=Copy(Msg,1,76);
  630.   L:=Length(Msg)+4;
  631.   If L>80 then L:=80;
  632.   MakeWindow (wind_err,(80-L+1) div 2,14,L,3,DiaWinCol,wok);
  633.   MakeFrame(wind_err,DiaWinCol,2);
  634.   WriteToWindow(wind_err,3,3,DiaWinCol,' <irgendeine Taste> ');
  635.   WritetoWindow(wind_err,3,2,DiaHeadCol,Msg);
  636.   PutWindow(Wind_err,Wok);
  637.   WaitonKey;
  638.   RestoreWindow(Wind_err,wok);
  639.   DeleteWindow(Wind_err);
  640. end;
  641.