home *** CD-ROM | disk | FTP | other *** search
- '* ======================================================= *
- '* BOX.BAS *
- '* (C) 1991 J. Braun & TOOLBOX *
- '* Special thanks to Norbert! *
- '* *
- '* für Turbo- und Power-Basic *
- '* Änderungen für Quick-Basic/BC 7.1 sind auskommentiert *
- '* ------------------------------------------------------- *
- '* Im Gegensatz zur Pascal-Version muß bei den Angaben für *
- '* die Bildschirmposition zuerst der y- und dann der x- *
- '* Wert übergeben werden (Reihe/Spalte statt x/y-Koord.). *
- '* ======================================================= *
-
- '* Schalter für Power-Basic, für QB/BC 7.1 und TB entfernen:
- $LIB ALL OFF
- $CPU 8086
- $OPTION AUTODIM OFF
- $OPTION CNTLBREAK OFF
- $ERROR ALL OFF
- $FLOAT EMULATE
- $COM 0
- $SOUND 0
- $STRING 2
- $STACK 1536
-
- SHARED TextAttr% '* für QB: DIM SHARED TextAttr AS INTEGER
- '* für TB: entfernen
-
- %ScrSeg = &HB800 '* monochrom: &HB000
- '* für QB: CONST ScrSeg = &HB800
-
-
- '* ======================================================= *
- '* Demonstration:
-
- LOCATE , , 1 '* sonst gibt's keinen Cursor
- TextAttr% = 7 '* globale Bildschirm-Farbgebung
- CALL ClrScr(1, 1, 25, 80) '* gesamten BS löschen
-
- '* diverse Fenster ausgeben:
- CALL Message("OK-Box", 15, 30, "Alles paletti")
- CALL Ausblick
- CALL Message("", 20, 15, "Eine Message-Box ohne Header")
-
- yesno$ = "JN" '* Reaktion nur auf jJnN:
- CALL Answer(3, 10, "Drücken Sie [J/N] ...", yesno$, ans$)
-
-
- '* ======================================================= *
- '* Unterprogramme:
-
- '* ======================================================= *
- SUB Answer(y%, x%, s$, corr$, ch$)
- '* Der Prozedur muß ein Zeichensatz übergeben werden, der
- '* die gültige Auswahl beinhaltet:
- '* -------------------------------------------------------
- '* yesno$ = "JN"
- '* CALL Answer(3, 10, "Drücken Sie [J/N]: ", yesno$, ans$)
- '* IF ans$ = "J" THEN
- '* ...
- '* END IF
- '* END
- '* -------------------------------------------------------
- '* Das angewählte Zeichen wird nicht mehr ausgegeben.
-
- CALL Message("Answer", y%, x%, s$)
-
- DO
- DO
- ch$ = UCASE$(INKEY$)
- LOOP UNTIL LEN(ch$) > 0
- IF INSTR(1, corr$, ch$) THEN
- ' CALL WriteCharXY(y% + 1 , x% + LEN(s$), ch$, 1)
- ELSE
- BEEP
- END IF
- LOOP UNTIL INSTR(1, corr$, ch$)
- END SUB
-
- '* ======================================================= *
- SUB Ausblick
- CALL ClrScr(5, 55, 20, 75)
- CALL Frame(5, 55, 20, 75)
- CALL Shadow(5, 55, 20, 75)
-
- '* in allen drei Prozeduren die Parameter wegen der
- '* Übersichtlichkeit ... (und Unabhängigkeit!)
-
- CALL WriteTextXY(5 + 5, 55 + 2, "demnächst in")
- CALL WriteTextXY(5 + 7, 55 + 2, "diesem")
- CALL WriteTextXY(5 + 9, 55 + 2, "Theater ..")
- END SUB
-
- '* ======================================================= *
- SUB ClrScr(y1%, x1%, y2%, x2%)
- '* Löscht einen Bildschirmausschnitt
- LOCAL p% '* für Quick-Basic entfernen!
- FOR p% = y1% TO y2%
- CALL WriteCharXY(p%, x1%, CHR$(32), x2% - x1% + 1)
- NEXT p%
- END SUB
-
- '* ======================================================= *
- SUB Frame(y1%, x1%, y2%, x2%)
- LOCAL i% '* für Quick-Basic entfernen!
- CALL ClrScr(y1%, x1%, y2%, x2%)
-
- CALL WriteCharXY(y1%, x1%, CHR$(201), 1) '* oben
- CALL WriteCharXY(y1%, x1% + 1, CHR$(205), x2% - x1% - 2)
- CALL WriteCharXY(y1%, x2% - 1, CHR$(187), 1)
-
- FOR i% = y1% + 1 TO y2% - 1
- CALL WriteCharXY(i%, x1%, CHR$(186), 1) '* links
- CALL WriteCharXY(i%, x2% - 1, CHR$(186), 1) '* rechts
- NEXT i%
-
- CALL WriteCharXY(y2%, x1%, CHR$(200), 1) '* unten
- CALL WriteCharXY(y2%, x1% + 1, CHR$(205), x2% - x1% - 2)
- CALL WriteCharXY(y2%, x2% - 1, CHR$(188), 1)
- END SUB
-
- '* ======================================================= *
- SUB Message(head$, y%, x%, s$)
- '* "head$" ist die Kopfzeile der Box. Wird der Leerstring
- '* als Parameter angegeben, erscheint keine Kopfzeile. Der
- '* Kopf wird zentriert.
- LOCAL length%, hlen% '* für Quick-Basic entfernen!
- length% = LEN(s$) + 4
- CALL Frame(y%, x%, y% + 2, x% + length%)
-
- IF head$ <> "" THEN
- head$ = " " + head$ + " "
- hlen% = (length% - LEN(head$)) \ 2
- CALL WriteTextXY(y%, x% + hlen%, head$)
- END IF
-
- CALL WriteTextXY(y% + 1, x% + 2, s$)
-
- '* sollte optional sein: der Schatten ...
- CALL Shadow(y%, x%, y% + 2, x% + length%)
- END SUB
-
- '* ======================================================= *
- SUB Shadow(y1%, x1%, y2%, x2%)
- '* "schattiert" den Bildschirmausschnitt. Zwischen dem
- '* Rahmen und dem Bildschirmrand muß noch Platz für den
- '* Schatten sein. Kein Check!!
- LOCAL i% '* für Quick-Basic entfernen!
- FOR i% = y1% TO y2%
- CALL WriteCharXY(i% + 1, x2%, CHR$(177), 1) '* "▒"
- NEXT i%
- CALL WriteCharXY(y2% + 1, x1% + 1, CHR$(177), x2% - x1%)
- END SUB
-
- '* ======================================================= *
- SUB WriteCharXY(y%, x%, ch$, num%)
- '* Schreibt ein Zeichen "ch$" an der Stelle "y%"/"x%"
- '* "num%"-mal in den Bildschirmspeicher. Da in Basic keine
- '* absolute Adressierung außer mit PEEK/POKE möglich ist,
- '* muß die Position im Bildschirmspeicher berechnet
- '* werden.
- SHARED TextAttr% '* bei Quick-Basic unnötig
- LOCAL i%, Offset% '* für Quick-Basic entfernen!
- '* Berechnung der Anfangsadresse im Bildschirmspeicher:
- Offset% = 160 * (y% - 1) + x% + x% - 2
-
- DEF SEG = %ScrSeg '* für QB "%"-Zeichen weglassen
- FOR i% = Offset% TO (Offset% + (num% - 1) * 2) STEP 2
- POKE i%, ASC(ch$)
- POKE i% + 1, TextAttr% '* für QB: bei Textattr "%"-
- NEXT i% '* Zeichen weglassen
- DEF SEG
- END SUB
-
- '* ======================================================= *
- SUB WriteTextXY(y%, x%, s$)
- LOCAL i% '* für Quick-Basic entfernen!
- FOR i% = 0 TO LEN(s$) - 1
- CALL WriteCharXY(y%, x% + i%, MID$(s$, i% + 1, 1), 1)
- NEXT i%
- END SUB
-
- '* ======================================================= *
- '* Ende von BOX.BAS *