home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / library / dos / multtsk / cpmult / demo / glasstty.inc < prev    next >
Encoding:
Text File  |  1990-04-07  |  11.2 KB  |  431 lines

  1. CONST MaxValues   = 9;   { Maximalanzahl möglicher Auswahlwerte }
  2.       MaxFields   = 5;   { Maximale Feldanzahl }
  3.       MaxCommLen  = 20;  { Maximale Länge einer Feldbezeichnung }
  4.       MaxFieldLen = 30;  { Maximale Länge eines Datums }
  5.       Up          = #72;
  6.       Down        = #80;
  7.       TAB         = #9;
  8.       CR          = #13;
  9.       ESC         = #27;
  10.       BTAB        = #15;
  11.       F1          = #59;
  12.       F2          = #60;
  13.       ExitChars   : SET OF CHAR = [ESC,F1,F2];  { Zeichen, die die Selektions-
  14.                                                   Steuerroutine beenden }
  15.       Ports       : ARRAY[1..2] OF ComType
  16.                   = (Com1,Com2);
  17.       Baudraten   : ARRAY[1..9] OF BaudType
  18.                   = (b110,b150,b300,b600,b1200,b2400,b4800,b9600,b19200);
  19.       Paritaet    : ARRAY[1..5] OF ParityType
  20.                   = (Space,Odd,Mark,Even,None);
  21.       DatenBits   : ARRAY[1..4] OF DataBitsType
  22.                   = (d5,d6,d7,d8);
  23.       StopBits    : ARRAY[1..2] OF StopBitsType
  24.                   = (s1,s2);
  25.  
  26. TYPE  CommentType = STRING[MaxCommLen];
  27.       ValueType   = STRING[MaxFieldLen];
  28.       Str80       = STRING[80];
  29.       FieldType   = RECORD
  30.                       Zeile   : BYTE;         { Bildschirmzeile }
  31.                       Spalte  : BYTE;         { Beginnn der Feldbezeichnung }
  32.                       Comment : CommentType;  { Feldbezeichnung }
  33.                       BarLen  : BYTE;         { Länge des Farbbalkens }
  34.                       Werte   : BYTE;         { Anzahl wählbarer Werte }
  35.                                               { oder BufLen bei Eingabefeldern }
  36.                       Current : BYTE;         { Index auf aktuellen Wert }
  37.                       Eingabe : BOOLEAN;      { Merker für Eingabefelder }
  38.                       Daten   : ARRAY[1..MaxValues] OF ValueType;
  39.                     END;
  40.  
  41. VAR   Selection   : BYTE;                     { Nummer der aktuellen Auswahl }
  42.       Selects     : ARRAY[1..MaxFields] OF FieldType;
  43.       SpecialChar : BOOLEAN;                  { Merker für die DoReadKey }
  44.  
  45. {--------------------------------------------------------------------------}
  46.  
  47. FUNCTION DoReadKey:Char;
  48.  
  49. { Tastatureingabe ohne Blockieren des Multi-Tasking. }
  50.  
  51. VAR  C : Char;
  52.  
  53. BEGIN {DoReadKey}
  54.   REPEAT Sleep(1); UNTIL KeyPressed;
  55.   C := ReadKey;
  56.   IF C = #0
  57.      THEN BEGIN
  58.             C := ReadKey;
  59.             SpecialChar := True;
  60.           END
  61.      ELSE SpecialChar := False;
  62.   DoReadKey := C;
  63. END;  {DoReadKey}
  64.  
  65. {-----------------------------------------------------------------------------}
  66.  
  67. FUNCTION IsColor:BOOLEAN;
  68.  
  69. { Diese Funktion liefert TRUE, falls ein Farbgraphikadapter installiert ist;
  70.   eine Registerstruktur Regs wird benötigt }
  71.  
  72. BEGIN {IsColor}
  73.   WITH Regs DO
  74.   BEGIN
  75.     AH := 15;
  76.     Intr($10,Regs);
  77.     IsColor := (AL <> 7);
  78.   END;
  79. END;  {IsColor}
  80.  
  81. {-----------------------------------------------------------------------------}
  82.  
  83. PROCEDURE CursorOff;
  84.  
  85. { Schaltet den Cursor aus; benötigt die Funktion IsColor }
  86.  
  87. BEGIN {CursorOff}
  88.   WITH Regs DO
  89.   BEGIN
  90.     IF IsColor
  91.        THEN BEGIN
  92.               CH := 9;
  93.               CL := 10;
  94.             END
  95.        ELSE BEGIN
  96.               CH := 31;
  97.               CL := 32;
  98.             END;
  99.     AH := 1;
  100.   END;
  101.   Intr($10,Regs);
  102. END;  {CursorOff}
  103.  
  104. {-----------------------------------------------------------------------------}
  105.  
  106. PROCEDURE CursorOn;
  107.  
  108. { Erzeugt einen normalen Strich-Cursor aus; benötigt die Funktion IsColor }
  109.  
  110. BEGIN {CursorOn}
  111.   WITH Regs DO
  112.   BEGIN
  113.     IF IsColor
  114.        THEN BEGIN
  115.               CH := 6;
  116.               CL := 7;
  117.             END
  118.        ELSE BEGIN
  119.               CH := 11;
  120.               CL := 12;
  121.             END;
  122.     AH := 1;
  123.   END;
  124.   Intr($10,Regs);
  125. END;  {CursorOn}
  126.  
  127. {-----------------------------------------------------------------------------}
  128.  
  129. PROCEDURE ReverseVideo;
  130.  
  131. { Schaltet auf Umkehrdarstellung }
  132.  
  133. BEGIN {ReverseVideo}
  134.   TextColor(0);
  135.   TextBackground(7);
  136. END;  {ReverseVideo}
  137.  
  138. {-----------------------------------------------------------------------------}
  139.  
  140. PROCEDURE DrawBar(SelectNo : BYTE);
  141.  
  142. { Erzeugt einen Farbbalken auf der Bezeichnung für Feld SELECTNO }
  143.  
  144. BEGIN {DrawBar}
  145.   WITH Selects[SelectNo] DO
  146.   BEGIN
  147.     GotoXY(Spalte,Zeile);
  148.     ReverseVideo;
  149.     Write(COPY(Comment,1,BarLen));
  150.     LowVideo;
  151.   END;
  152. END;  {DrawBar}
  153.  
  154. {-----------------------------------------------------------------------------}
  155.  
  156. PROCEDURE HighVideo;
  157.  
  158. BEGIN
  159.   TextColor(15);
  160.   TextBackground(0);
  161. END;
  162.  
  163. {-----------------------------------------------------------------------------}
  164.  
  165. PROCEDURE LowVideo;
  166.  
  167. BEGIN
  168.   TextColor(7);
  169.   TextBackground(0);
  170. END;
  171.  
  172. {-----------------------------------------------------------------------------}
  173.  
  174. PROCEDURE RemoveBar(SelectNo : BYTE);
  175.  
  176. { Löscht den Farbbalken wieder }
  177.  
  178. BEGIN {RemoveBar}
  179.   WITH Selects[SelectNo] DO
  180.   BEGIN
  181.     GotoXY(Spalte,Zeile);
  182.     LowVideo;
  183.     Write(COPY(Comment,1,BarLen));
  184.   END;
  185. END;  {RemoveBar}
  186.  
  187. {-----------------------------------------------------------------------------}
  188.  
  189. PROCEDURE PrintSelection(SelectNo : BYTE);
  190.  
  191. { Ausgabe des aktuell eingestellen Wertes im Feld SELECTNO }
  192.  
  193. BEGIN {PrintSelection}
  194.   WITH Selects[SelectNo] DO
  195.   BEGIN
  196.     GotoXY(Spalte+BYTE(Comment[0]),Zeile);
  197.     HighVideo;
  198.     Write(Daten[Current]);
  199.     LowVideo;
  200.   END;
  201. END;  {PrintSelection}
  202.  
  203. {-----------------------------------------------------------------------------}
  204.  
  205. FUNCTION Replicate(C:CHAR;Count:BYTE):Str80;
  206.  
  207. { benötigt eine Typendeklaration Str80:STRING[80] }
  208.  
  209. VAR   N : BYTE;
  210.       Z : Str80;
  211.  
  212. BEGIN {Replicate}
  213.   Z[0] := CHR(Count);
  214.   FillChar(Z[1],Count,C);
  215.   Replicate := Z;
  216. END;  {Replicate}
  217.  
  218. {-----------------------------------------------------------------------------}
  219.  
  220. PROCEDURE PaddValueArea(SelectNo:BYTE; C:CHAR);
  221.  
  222. { Ausfüllen des Wert-Bereiches für das EINGABE-Feld SELECTNO }
  223.  
  224. BEGIN {PaddValueArea}
  225.   WITH Selects[SelectNo] DO
  226.   BEGIN
  227.     GotoXY(Spalte+BYTE(Comment[0]),Zeile);
  228.     Write(Replicate(C,Werte));
  229.   END;
  230. END;  {PaddValueArea}
  231.  
  232. {-----------------------------------------------------------------------------}
  233.  
  234. PROCEDURE DoInput(SelectNo : BYTE);
  235.  
  236. VAR AuxField : ValueType;
  237.  
  238. BEGIN {DoInput}
  239.   WITH Selects[SelectNo] DO
  240.   BEGIN
  241.     HighVideo;
  242.     PaddValueArea(SelectNo,'.');
  243.     Current := 1;              {zur Sicherheit}
  244.     GotoXY(Spalte+BYTE(Comment[0]),Zeile);
  245.     CursorOn;
  246.     Read(AuxField);
  247.     CursorOff;
  248.     IF BYTE(AuxField[0]) > 0
  249.        THEN Daten[1] := AuxField;
  250.     PaddValueArea(SelectNo,' ');
  251.     LowVideo;
  252.     PrintSelection(SelectNo);
  253.   END;
  254. END;  {DoInput}
  255.  
  256. {-----------------------------------------------------------------------------}
  257.  
  258. PROCEDURE InitSelection;
  259.  
  260. { Voreinstellen der Feldparameter; je Programm unterschiedlich und vom User
  261.   bereitzustellen }
  262.  
  263. BEGIN {InitSelection}
  264.   WITH Selects[1] DO
  265.   BEGIN
  266.     Zeile := 6;
  267.     Spalte := 10;
  268.     Comment := 'Com-Port........:  ';
  269.     BarLen := 17;
  270.     Werte := 2;
  271.     Current := 1;
  272.     Eingabe := FALSE;
  273.     Daten[1] := 'Com1:';
  274.     Daten[2] := 'Com2:';
  275.   END;
  276.  
  277.   WITH Selects[2] DO
  278.   BEGIN
  279.     Zeile := 7;
  280.     Spalte := 10;
  281.     Comment := 'Übertragungsrate:  ';
  282.     BarLen := 17;
  283.     Werte := 9;
  284.     Current := 8;
  285.     Eingabe := FALSE;
  286.     Daten[1] := '110  ';
  287.     Daten[2] := '150  ';
  288.     Daten[3] := '300  ';
  289.     Daten[4] := '600  ';
  290.     Daten[5] := '1200 ';
  291.     Daten[6] := '2400 ';
  292.     Daten[7] := '4800 ';
  293.     Daten[8] := '9600 ';
  294.     Daten[9] := '19200';
  295.   END;
  296.  
  297.   WITH Selects[3] DO
  298.   BEGIN
  299.     Zeile := 8;
  300.     Spalte := 10;
  301.     Comment := 'Parität.........:  ';
  302.     BarLen := 17;
  303.     Werte := 5;
  304.     Current := 5;
  305.     Eingabe := FALSE;
  306.     Daten[1] := 'Space';
  307.     Daten[2] := 'Odd  ';
  308.     Daten[3] := 'Mark ';
  309.     Daten[4] := 'Even ';
  310.     Daten[5] := 'None ';
  311.   END;
  312.  
  313.   WITH Selects[4] DO
  314.   BEGIN
  315.     Zeile := 9;
  316.     Spalte := 10;
  317.     Comment := 'Datenbits.......:  ';
  318.     BarLen := 17;
  319.     Werte := 4;
  320.     Current := 4;
  321.     Eingabe := FALSE;
  322.     Daten[1] := '5';
  323.     Daten[2] := '6';
  324.     Daten[3] := '7';
  325.     Daten[4] := '8';
  326.   END;
  327.  
  328.   WITH Selects[5] DO
  329.   BEGIN
  330.     Zeile := 10;
  331.     Spalte := 10;
  332.     Comment := 'Stopbits........:  ';
  333.     BarLen := 17;
  334.     Werte := 2;
  335.     Current := 1;
  336.     Eingabe := FALSE;
  337.     Daten[1] := '1';
  338.     Daten[2] := '2';
  339.   END;
  340. END;  {InitSelection}
  341.  
  342. {-----------------------------------------------------------------------------}
  343.  
  344. PROCEDURE SetupScreen;
  345.  
  346. { Aufbau der Bildschirmmaske; vom User bereitszustellen }
  347.  
  348. BEGIN {SetupScreen}
  349.   ClrScr;
  350.   GotoXY(15,1);
  351.   Writeln('GlassTty V1.00 (c) Ch. Philipps im März 1989');
  352.   GotoXY(15,2);
  353.   Writeln('============================================');
  354.   FOR Selection := 1 TO MaxFields DO
  355.   BEGIN
  356.     RemoveBar(Selection);
  357.     PrintSelection(Selection);
  358.   END;
  359.   GotoXY(12,21);
  360.   Writeln('Selection der Eingabefelder mit TAB und BACKTAB;');
  361.   GotoXY(12,22);
  362.   Writeln('Auswahl der möglichen Parameter mittels der Cursortasten');
  363.   GotoXY(20,24);
  364.   HighVideo;
  365.   Writeln('F1 = Terminal-Mode  /  ESC = Ende');
  366. END;  {SetupScreen}
  367.  
  368. {-----------------------------------------------------------------------------}
  369.  
  370. FUNCTION DoSelect(Start:BYTE):CHAR;
  371.  
  372. { Beginnt mit der Abarbeitung der Selektionsmaske beim Feld START und liefert
  373.   die Ende-Taste (CR oder ESC) zurück. }
  374.  
  375. VAR   C : CHAR;
  376.  
  377. BEGIN {DoSelect}
  378.   IF Start IN [1..MaxFields]
  379.      THEN Selection := Start
  380.      ELSE Selection := 1;
  381.   CursorOff;
  382.   DrawBar(Selection);
  383.   REPEAT
  384.     C := DoReadKey;
  385.     IF SpecialChar
  386.        THEN CASE C OF
  387.             BTAB: BEGIN
  388.                     RemoveBar(Selection);
  389.                     Selection := PRED(Selection);
  390.                     IF Selection < 1
  391.                        THEN Selection := MaxFields;
  392.                     DrawBar(Selection);
  393.                   END;
  394.             Up:   WITH Selects[Selection] DO
  395.                   IF Eingabe
  396.                      THEN DoInput(selection)
  397.                      ELSE WITH Selects[Selection] DO
  398.                           BEGIN
  399.                             Current := PRED(Current);
  400.                             IF NOT (Current IN [1..Werte])
  401.                                THEN Current := Werte;
  402.                             IF Werte > 1
  403.                                THEN PrintSelection(Selection);
  404.                           END;
  405.             Down: WITH Selects[Selection] DO
  406.                   IF Eingabe
  407.                      THEN DoInput(selection)
  408.                      ELSE WITH Selects[Selection] DO
  409.                           BEGIN
  410.                             Current := SUCC(Current);
  411.                             IF NOT (Current IN [1..Werte])
  412.                                THEN Current := 1;
  413.                             IF Werte > 1
  414.                                THEN PrintSelection(Selection);
  415.                           END;
  416.             END
  417.        ELSE CASE C OF
  418.              TAB: BEGIN
  419.                     RemoveBar(Selection);
  420.                     Selection := SUCC(Selection);
  421.                     IF Selection > MaxFields
  422.                        THEN Selection := 1;
  423.                     DrawBar(Selection);
  424.                   END;
  425.             END;
  426.   UNTIL C IN ExitChars;
  427.   CursorOn;
  428.   DoSelect := C;
  429. END;  {DoSelect}
  430.  
  431.