U N I T   G R A P H _ I O
TGM_96: GRAPH.TXT, TGM_97: GRAPH.ARC
Ernst Huber, N86d, #687

Die Unit GRAPH_IO stellt eine Anzahl von Bildschirm-Ein/Ausgabeoperationen im Graphikmodus von TURBO PASCAL 4.0 zur Verfgung.

1) Ausgabe-(Write) Routinen

Die UNIT GRAPH_IO stellt 6 Ausgabe- (Write) Routinen zur Ausgabe von verschiedenen Variablentypen zur Verfgung (STRING, INTEGER, LONGINT, WORD, REAL (Fixkomma), REAL (Floating-Point)). Smtliche Schriftarten, die TURBO PASCAL 4.0 zur Verfgung stellt, werden untersttzt, jedoch soll gleich vorweggenommen werden, da sich Probleme mit den Unterlngen bei den Vektorschriftarten in verschiedenen Gren ergeben. Am besten geeignet ist der sogen. 'DefaultFont', ein (8x8) Pixel Font, auf den man bei normaler Maskenprogrammierung zurckgreifen sollte, da dieser am besten lesbar ist (hier ergeben sich keine Schwierigkeiten mit den Unterlngen (die UNIT wurde hauptschlich fr diesen Font geschrieben), ebenso bei Verwendung des 'SmallFont'). Ein Ausgabestring (vor der Ausgabe wird jede Variable in einen String umgewandelt und dieser ausgegeben) kann mit einer bestimmten Farbe unterlegt werden (dies sollte im Sinne einer bersichtlichen Bildschirmgestaltung fr den Endbenutzer geschehen).

PROCEDURE Wr_String (X, Y, BarCol, Digits, V);
Eingabeparameter: X, Y: WORD  : gibt die Bildschirmposition an, ab der die
                                Textausgabe erfolgen soll;
                  BarCol: WORD: anhand von BarCol wird die Farbe festgelegt,
                                mit der die Ausgabe unterlegt werden soll;
                  Digits: WORD: gibt die Anzahl der Stellen an, die ausge-
                                geben werden sollen;
                  V: STRING   : Stringvariable, die ausgegeben wird;

Hinweis: die Balkenlnge ist ungefhr 1 Digit lnger als in der Variable
         Digits angegeben (vor Textanfang 1/2 Digit, nach Textende 1/2 Digit).

PROCEDURE Wr_Int (X, Y, BarCol, V)
Eingabeparameter: X, Y: WORD  : gibt die Bildschirmposition an, ab der die
                                Textausgabe erfolgen soll;
                  BarCol: WORD: anhand von BarCol wird die Farbe festgelegt,
                                mit der die Ausgabe unterlegt werden soll;
                  V: INTEGER  : Integervariable, die ausgegeben wird;

Hinweis: Die Lnge des Ausgabefeldes bei Integervariablen betrgt immer
         6+1 Stellen (6 Stellen fr die Variable, 1 Stelle wird aufgeteilt
         in: vor Textanfang 1/2 Digit, nach Textende 1/2 Digit).

PROCEDURE Wr_Long (X, Y, BarCol, V)
Eingabeparameter: X, Y: WORD  : gibt die Bildschirmposition an, ab der die
                                Textausgabe erfolgen soll;
                  BarCol: WORD: anhand von BarCol wird die Farbe festgelegt,
                                mit der die Ausgabe unterlegt werden soll;
                  V: LONGINT  : Integervariable, die ausgegeben wird;

Hinweis: Die Lnge des Ausgabefeldes bei LongIntvariablen betrgt immer
         11+1 Stellen (11 Stellen fr die Variable, 1 Stelle wird aufgeteilt
         in: vor Textanfang 1/2 Digit, nach Textende 1/2 Digit).

PROCEDURE Wr_Word (X, Y, BarCol, V)
Eingabeparameter: X, Y: WORD  : gibt die Bildschirmposition an, ab der die
                                Textausgabe erfolgen soll;
                  BarCol: WORD: anhand von BarCol wird die Farbe festgelegt,
                                mit der die Ausgabe unterlegt werden soll;
                  V: WORD     : Wordvariable, die ausgegeben wird;

Hinweis: Die Lnge des Ausgabefeldes bei Wordvariablen betrgt immer
         5+1 Stellen (5 Stellen fr die Variable, 1 Stelle wird aufgeteilt
         in: vor Textanfang 1/2 Digit, nach Textende 1/2 Digit).

PROCEDURE Wr_Floati (X, Y, BarCol, Digits, V)
Eingabeparameter: X, Y: WORD  : gibt die Bildschirmposition an, ab der die
                                Textausgabe erfolgen soll;
                  BarCol: WORD: anhand von BarCol wird die Farbe festgelegt,
                                mit der die Ausgabe unterlegt werden soll;
                  Digits: WORD: gibt die Anzahl der Stellen an, die ausgegeben
                                werden sollen (gesamt); Minimalwert fr
                                Digits: 3/4 bei (+/-) Werten;
                  V: REAL     : Realvariable, die im Floatingpointformat ausge-
                                geben wird;

Hinweis: die Balkenlnge ist ungefhr 1 Digit lnger als in der Variable
         Digits angegeben (vor Textanfang 1/2 Digit, nach Textende 1/2 Digit).

PROCEDURE Wr_Fix (X, Y, BarCol, Digits, V)
Eingabeparameter: X, Y: WORD  : gibt die Bildschirmposition an, ab der die
                                Textausgabe erfolgen soll;
                  BarCol: WORD: anhand von BarCol wird die Farbe festgelegt,
                                mit der die Ausgabe unterlegt werden soll;
                  Digits: WORD: gibt die Anzahl der Stellen an, die ausgegeben
                                werden sollen (gesamt);
                  V: REAL     : Realvariable, die in Fixkommadarstellung ausge-
                                geben wird; Bedingung: V mu im Bereich von
                                1E-11 bis 1E11 oder -1E+11 bis -1E-11 liegen.
                                Ist dies nicht der Fall, wird automatisch
                                Wr_Floati ausgefhrt;

Hinweis: die Balkenlnge ist ungefhr 1 Digit lnger als in der Variable
         Digits angegeben (vor Textanfang 1/2 Digit, nach Textende 1/2 Digit).

2) Eingabe-(Read) Routinen:
---------------------------
Ebenso wie bei den Ausgaberoutinen werden fr die oben angefhrten 6 Variab-
lentypen Eingabe- (Read) Routinen zur Verfgung gestellt.
Smtliche Read-Routinen verlangen eine Variable (Status), in der die jeweils
aufgerufene Prozedur einen Returncode ablegt, der dann weiter ausgewertet
werden kann. Dieser Returncode (Integer) gibt an, ob der Benutzer eine
gltige Eingabe, eine Spezialtaste (Crs, Esc etc.) oder eine (bei numerischen
Anwendungen) Zahl auerhalb des zulssigen Wertebereiches eingegeben hat.
Zur leichteren Auswertung dieser Variablen wurden bereits einige Werte vor-
definiert, die im Punkt 3) nher behandelt werden.
Wie bereits angedeutet, bieten smtliche Read-Routinen, die numerische Werte
einlesen, die Mglichkeit, einen Wertebereich festzulegen, innerhalb dessen die
einzulesende Variable liegen mu (sonst keine gltige Eingabe, der alte
Variablenwert bleibt erhalten). Auch hierfr wurden bereits einige Konstanten
vordefiniert, nheres siehe Punkt 3).

Folgende Tasten werden von den Read-Routinen aktzeptiert und folgendermaen
interpretiert:

<Esc> ....... Die Eingabe wird abgebrochen, der alte Variablenwert bleibt
              erhalten, der Returncode = der Konst. ESC;
<Crs-Down>... Die Eingabe wird abgebrochen, der alte Variablenwert bleibt
              erhalten, der Returncode = der Konst. Crs_Down;
<Crs-Up> .... Die Eingabe wird abgebrochen, der alte Variablenwert bleibt
              erhalten, der Returncode = der Konst. Crs_Up;
<Crs-Left>... Die Eingabe wird abgebrochen, der alte Variablenwert bleibt
              erhalten, der Returncode = der Konst. Crs_Left;
<Crs-Right>.. Die Eingabe wird abgebrochen, der alte Variablenwert bleibt
              erhalten, der Returncode = der Konst. Crs_Right;
<BackStep>... Das zuletzt eingegebene Zeichen wird gelscht, die Routine wartet
              auf weiteren Tastendruck;
<Return>..... Eingabe wird abgeschlossen, eingegebene Variable auf Gltigkeit
              berprft und bei Gltigkeit der angegebenen Variablen zuge-
              wiesen (der Returncode = Konst. Return). Ist die eingegebene
              Variable ungltig (bei numerischer Eingabe), dann wird der alte
              Variablenwert beibehalten. Der Returncode = To_Less/To_Big;

PROCEDURE Rd_String (X, Y, BARCol, Digits, CharSet, Status, V);
Eingabeparameter: X, Y   : Start des Balkens, der als Hintergrund ausgegeben
                           wird;
                  BarCol : Hintergrundfarbe des Balkens fr Stringeingabe;
                  Digits : gibt die Lnge der einzulesenden Variablen an;
                  CharSet: gibt die Menge der gltigen Zeichen an, alle
                           anderen Zeichen werden ignoriert;
Ausgabeparameter: Status : gibt einen Returncode ob eine gltige Eingabe oder
                           eine 'Sondertaste' gedrckt wurde;
                  V      : Stringvariable, die eingelesen werden soll;

Hinweis: die Balkenlnge ist ungefhr 1 Digit lnger als in der Variable
         Digits angegeben (vor Textanfang 1/2 Digit, nach Textende 1/2 Digit).

PROCEDURE Rd_Int (X, Y, BARCol, MinV, MaxV, Status, V);
Eingabeparameter: X, Y   : Start des Balkens, der als Hintergrund ausgegeben
                           wird;
                  BarCol : Hintergrundfarbe des Balkens fr Integereingabe;
                  MinV   : min. zulssiger Wert der Variablen, die eingegeben
                           werden soll;
                  MaxV   : max. zulssiger Wert der Variablen die eingegeben
                           werden soll;
Ausgabeparameter: Status : gibt einen Returncode, ob eine gltige Eingabe oder
                           eine 'Sondertaste' gedrckt wurde;
                  V      : Integervariable, die eingelesen werden soll;

Hinweis: Die Lnge des Eingabefeldes bei Integervariablen betrgt immer
         6+1 Stellen (6 Stellen fr die Variable, 1 Stelle wird aufgeteilt
         in: vor Textanfang 1/2 Digit, nach Textende 1/2 Digit).

PROCEDURE Rd_Long (X, Y, BARCol, MinV, MaxV, Status, V);
Eingabeparameter: X, Y   : Start des Balkens, der als Hintergrund ausgegeben
                           wird;
                  BarCol : Hintergrundfarbe des Balkens fr LongInteingabe;
                  MinV   : min. zulssiger Wert der Variablen, die eingegeben
                           werden soll;
                  MaxV   : max. zulssiger Wert der Variablen, die eingegeben
                           werden soll;
Ausgabeparameter: Status : gibt einen Returncode, ob eine gltige Eingabe oder
                           eine 'Sondertaste' gedrckt wurde;
                  V      : LongIntvariable, die eingelesen werden soll;

Hinweis: Die Lnge des Eingabefeldes bei LongIntvariablen betrgt immer
         11+1 Stellen (11 Stellen fr die Variable, 1 Stelle wird aufgeteilt
         in: vor Textanfang 1/2 Digit, nach Textende 1/2 Digit).

PROCEDURE Rd_Word (X, Y, BARCol, MinV, MaxV, Status, V);
Eingabeparameter: X, Y   : Start des Balkens, der als Hintergrund ausgegeben
                           wird;
                  BarCol : Hintergrundfarbe des Balkens fr Wordeingabe;
                  MinV   : min. zulssiger Wert der Variablen, die eingegeben
                           werden soll;
                  MaxV   : max. zulssiger Wert der Variablen, die eingegeben
                           werden soll;
Ausgabeparameter: Status : gibt einen Returncode, ob eine gltige Eingabe oder
                           eine 'Sondertaste' gedrckt wurde;
                  V      : Variable des Typs WORD, die eingelesen werden soll;

Hinweis: Die Lnge des Eingabefeldes bei Wordvariablen betrgt immer
         5+1 Stellen (5 Stellen fr die Variable, 1 Stelle wird aufgeteilt
         in: vor Textanfang 1/2 Digit, nach Textende 1/2 Digit).

PROCEDURE Rd_Floati (X, Y, BARCol, Digits, MinV, MaxV, Status, V);
Eingabeparameter: X, Y   : Start des Balkens, der als Hintergrund ausgegeben
                           wird;
                  BarCol : Hintergrundfarbe des Balkens fr Realeingabe;
                  Digits : gibt die Lnge der einzulesenden Variable an
                  MinV   : min. zulssiger Wert der Variablen, die eingegeben
                           werden soll;
                  MaxV   : max. zulssiger Wert der Variablen, die eingegeben
                           werden soll;
Ausgabeparameter: Status : gibt einen Returncode, ob eine gltige Eingabe oder
                           eine 'Sondertaste' gedrckt wurde;
                  V      : Variable des Typs REAL, die eingelesen werden soll;

Hinweis: die Balkenlnge ist ungefhr 1 Digit lnger als in der Variable
         Digits angegeben (vor Textanfang 1/2 Digit, nach Textende 1/2 Digit).

PROCEDURE Rd_Fix (X, Y, BARCol, Digits, MinV, MaxV, Status, V);
Eingabeparameter: X, Y   : Start des Balkens, der als Hintergrund ausgegeben
                           wird;
                  BarCol : Hintergrundfarbe des Balkens fr Realeingabe;
                  Digits : gibt die Lnge der einzulesenden Variable an
                  MinV   : min. zulssiger Wert der Variablen, die eingegeben
                           werden soll;
                  MaxV   : max. zulssiger Wert der Variablen, die eingegeben
                           werden soll;
Ausgabeparameter: Status : gibt einen Returncode, ob eine gltige Eingabe oder
                           eine 'Sondertaste' gedrckt wurde;
                  V      : Variable des Typs REAL, die eingelesen werden soll;

Hinweis: die Balkenlnge ist ungefhr 1 Digit lnger als in der Variable
         Digits angegeben (vor Textanfang 1/2 Digit, nach Textende 1/2 Digit).

3) Typ- und Konstantendefinitionen:
-----------------------------------
Zur komfortablen Auswertung der Statusvariable sowie zur Bereichsfestlegung
bei den Read-Routinen wurden einige Konstanten und Typen bereits vordekla-
riert.

3.1) Typendefinitionen:
-----------------------
Whole_Set = SET OF #0..#255; Als Whole_Set wurde eine Menge definiert, die
                             den gesamten ASCII-Zeichenvorrat umfat. Bei
                             ReadString knnen dann Teilmengen bergeben
                             werden. Liegt ein Zeichen, da eingegeben wurde,
                             nicht in der ang. Menge, so wird es ignoriert.

3.2) Konstantendefinitionen:
----------------------------
Der Returncode der Statusvariablen kann folgende Werte annehmen:

To_Less  : INTEGER = 1; nur bei num. Eingaben, wenn der eingegebene Wert
                        kleiner als der mit MinV angegebene Wert ist;
To_Big   : INTEGER = 2; nur bei num. Eingaben, wenn der eingegebene Wert
                        grer als der mit MaxV angegebene Wert ist;
Esc      : INTEGER = 3; keine neue Eingabe, Variable bleibt erhalten, ESCAPE
                        wurde gedrckt;
Crs_Down : INTEGER = 4; keine neue Eingabe, Variable bleibt erhalten, die
                        CURSOR-DOWN Taste wurde gedrckt;
Crs_Up   : INTEGER = 5; keine neue Eingabe, Variable bleibt erhalten, die
                        CURSOR-UP Taste wurde gedrckt;
Crs_Left : INTEGER = 6; keine neue Eingabe, Variable bleibt erhalten, die
                        CURSOR-LEFT Taste wurde gedrckt;
Crs_Right: INTEGER = 7; keine neue Eingabe, Variable bleibt erhalten, die
                        CURSOR-RIGHT Taste wurde gedrckt;
Back_Step: INTEGER = 8; dient nur fr interne Zwecke;
Return   : INTEGER = 9; gltige Eingabe, die mit RETURN abgeschlossen wurde;


Number   : SET OF '+'..'E'=['+','-','.','0'..'9','E'];
           gibt die Menge aller mglichen Zeichen bei Zahleneingabe an;

Character: SET OF '!'..''=['!'..''];
           gibt die Menge aller mglichen Zeichen bei Stringeingabe an;

Folgende Konstanten wurden vordefiniert, falls der Programmierer den vollen
Zahlenbereich bei einer typisierten Eingabe ausnutzen mchte (diese Konstanten
knnen direkt fr MinV/MaxV eingesetzt werden);

Min_W    : WORD = 0;             : min. Wert von WORD-Variablen;
Max_W    : WORD = 65535;         : max. Wert von WORD-Variablen;
Min_I    : INTEGER = -32768;     : min. Wert von INTEGER-Variablen;
Max_I    : INTEGER = 32767;      : max. Wert von INTEGER-Variablen;
Min_LI   : LONGINT = -2147483647;: min. Wert von LONGINT-Variablen;
Max_LI   : LONGINT = 2147483647; : max. Wert von LONGINT-Variablen;
Min_R    : REAL = -1.5E+38;      : min. Wert von REAL-Variablen; (fr Rd_Fix
Max_R    : REAL = 1.5E+38;       : max. Wert von REAL-Variablen; &. Rd_Floati)

4) Der INTERFACE-Teil der UNITS GRAPH_IO:
-----------------------------------------
(*-------------------------------------------------------------------------*)
(********* UNIT Graph_IO: Ein/Ausgabe von Variablen im Graphikmodus ********)
(********* (c) Juli 1988 by eh                          Ernst HUBER ********)
(*-------------------------------------------------------------------------*)
UNIT Graph_IO;
INTERFACE
USES CRT, GRAPH;

(*-------------------------------------------------------------------------*)
(******************** Typendefinitionen fuer Unit Graph_IO *****************)
(*-------------------------------------------------------------------------*)
TYPE Whole_Set = SET OF  #0..#255;

(*-------------------------------------------------------------------------*)
(***************** Konstantendefinitionen fuer Unit Graph_IO ***************)
(*-------------------------------------------------------------------------*)
CONST To_Less  : INTEGER = 1;
      To_Big   : INTEGER = 2;
      Esc      : INTEGER = 3;
      Crs_Down : INTEGER = 4;
      Crs_Up   : INTEGER = 5;
      Crs_Left : INTEGER = 6;
      Crs_Right: INTEGER = 7;
      Back_Step: INTEGER = 8;
      Return   : INTEGER = 9;

      Number   : SET OF '+'..'E'=['+','-','.','0'..'9','E'];
      Character: SET OF '!'..''=['!'..''];

      Min_W    : WORD = 0;
      Max_W    : WORD = 65535;
      Min_I    : INTEGER = -32768;
      Max_I    : INTEGER = 32767;
      Min_LI   : LONGINT = -2147483647;
      Max_LI   : LONGINT = 2147483647;
      Min_R    : REAL = -1.5E+38;
      Max_R    : REAL = 1.5E+38;

(*-------------------------------------------------------------------------*)
(********** oeffentliche Proceduredefinitionen fuer Unit Graph_IO **********)
(*-------------------------------------------------------------------------*)
PROCEDURE Wr_String (X, Y, BARCol, Digits: WORD; V: STRING);
PROCEDURE Wr_Int (X, Y, BARCol: WORD; V: INTEGER);
PROCEDURE Wr_Long (X, Y, BARCol: WORD; V: LONGINT);
PROCEDURE Wr_Word (X, Y, BARCol, V: WORD);
PROCEDURE Wr_Floati (X, Y, BARCol, Digits: WORD; V: REAL);
PROCEDURE Wr_Fix (X, Y, BARCol, Digits: WORD; V: REAL);

PROCEDURE Rd_String (X, Y, BARCol, Digits: Word; CharSet: Whole_Set;
                     VAR Status: BYTE; VAR V: STRING);
PROCEDURE Rd_Int (X, Y, BARCol: WORD; MinV, MaxV: INTEGER;
                  VAR Status: BYTE; VAR V: INTEGER);
PROCEDURE Rd_Long (X, Y, BARCol: WORD; MinV, MaxV: LONGINT;
                   VAR Status: BYTE; VAR V: LONGINT);
PROCEDURE Rd_Word (X, Y, BARCol, MinV, MaxV: Word;
                   VAR Status: BYTE; VAR V: Word);
PROCEDURE Rd_Floati (X, Y, BARCol, Digits: WORD; MinV, MaxV: REAL;
                     VAR Status: BYTE; VAR V: REAL);
PROCEDURE Rd_Fix (X, Y, BARCol, Digits: WORD; MinV, MaxV: REAL;
                  VAR Status: BYTE; VAR V: REAL);

IMPLEMENTATION
(*-------------------------------------------------------------------------*)
(******************************* < S O U R C E > ***************************)
(*-------------------------------------------------------------------------*)
END. (* UNIT Graph_IO *)