home *** CD-ROM | disk | FTP | other *** search
- '* =< Listing 4 >========================================= *
- '* BOX.BAS *
- '* (C) 1991 J. Braun & TOOLBOX *
- '* für Quick-Basic und Basic PDS 7.1 *
- '* ======================================================= *
-
- DECLARE SUB Answer (y AS INTEGER, x AS INTEGER, _
- s AS STRING, corr AS STRING, _
- ch AS STRING)
- DECLARE SUB Ausblick ()
- DECLARE SUB ClrScr (y1 AS INTEGER, x1 AS INTEGER, _
- y2 AS INTEGER, x2 AS INTEGER)
- DECLARE SUB Frame (y1 AS INTEGER, x1 AS INTEGER, _
- y2 AS INTEGER, x2 AS INTEGER)
- DECLARE SUB Message (head AS STRING, y AS INTEGER, _
- x AS INTEGER, s AS STRING)
- DECLARE SUB Shadow (y1 AS INTEGER, x1 AS INTEGER, _
- y2 AS INTEGER, x2 AS INTEGER)
- DECLARE SUB WriteCharXY (y AS INTEGER, x AS INTEGER, _
- ch AS STRING, num AS INTEGER)
- DECLARE SUB WriteTextXY (y AS INTEGER, x AS INTEGER, _
- s AS STRING)
-
- DIM SHARED TextAttr AS INTEGER
- CONST ScrSeg = &HB800 '* für monochrom: &HB000
-
- TextAttr = 7
- ClrScr 1, 1, 25, 80
- Message "OK-Box", 15, 30, "Alles paletti"
- Ausblick
- Message "", 20, 15, "Eine Message-Box ohne Header"
- yesno$ = "JN"
- Answer 3, 10, "Drücken Sie [J/N] ...", yesno$, ans$
-
-
- '* ======================================================= *
- SUB Answer (y AS INTEGER, x AS INTEGER, s AS STRING, _
- corr AS STRING, ch AS STRING)
- '* Der Prozedur muß ein Zeichensatz übergeben
- '* werden, der die gültige Auswahl beinhaltet
- '*
- '* yesno$ = "JN"
- '* 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.
-
- Message "Answer", y, x, s
-
- DO
- DO
- ch = UCASE$(INKEY$)
- LOOP UNTIL LEN(ch) > 0
- IF INSTR(1, corr, ch) THEN
- ' WriteCharXY y + 1 , x + LEN(s), ch, 1
- ELSE
- BEEP
- END IF
- LOOP UNTIL INSTR(1, corr, ch)
- END SUB
-
- '* ======================================================= *
- SUB Ausblick
- ClrScr 5, 55, 20, 75
- Frame 5, 55, 20, 75
- Shadow 5, 55, 20, 75
-
- '* in allen drei Prozeduren die Parameter wegen der
- '* Übersichtlichkeit ... (und Unabhängigkeit!)
-
- WriteTextXY 5 + 5, 55 + 2, "demnächst in"
- WriteTextXY 5 + 7, 55 + 2, "diesem"
- WriteTextXY 5 + 9, 55 + 2, "Theater .."
- END SUB
-
- '* ======================================================= *
- SUB ClrScr (y1 AS INTEGER, x1 AS INTEGER, _
- y2 AS INTEGER, x2 AS INTEGER)
- '* Löscht einen Bildschirmausschnitt
- DIM p AS INTEGER
- FOR p = y1 TO y2
- CALL WriteCharXY(p, x1, CHR$(32), x2 - x1 + 1)
- NEXT p
- END SUB
-
- '* ======================================================= *
- SUB Frame (y1 AS INTEGER, x1 AS INTEGER, _
- y2 AS INTEGER, x2 AS INTEGER)
- DIM i AS INTEGER
- ClrScr y1, x1, y2, x2
-
- WriteCharXY y1, x1, CHR$(201), 1 '* oben
- WriteCharXY y1, x1 + 1, CHR$(205), x2 - x1 - 2
- WriteCharXY y1, x2 - 1, CHR$(187), 1
-
- FOR i = y1 + 1 TO y2 - 1
- WriteCharXY i, x1, CHR$(186), 1 '* links
- CALL WriteCharXY(i, x2 - 1, CHR$(186), 1) '* rechts
- NEXT i
-
- WriteCharXY y2, x1, CHR$(200), 1 '* unten
- WriteCharXY y2, x1 + 1, CHR$(205), x2 - x1 - 2
- WriteCharXY y2, x2 - 1, CHR$(188), 1
- END SUB
-
- '* ======================================================= *
- SUB Message (head AS STRING, y AS INTEGER, x AS INTEGER, _
- s AS STRING)
- '* "head" ist die Kopfzeile der Box. Wird der Leerstring
- '* als Parameter angegeben, erscheint keine Kopfzeile. Der
- '* Kopf wird zentriert.
- DIM length AS INTEGER, hlen AS INTEGER
- length = LEN(s) + 4
- Frame y, x, y + 2, x + length
-
- IF head <> "" THEN
- head = " " + head + " "
- hlen = (length - LEN(head)) \ 2
- WriteTextXY y, x + hlen, head
- END IF
-
- WriteTextXY y + 1, x + 2, s
-
- '* sollte optional sein: der Schatten ...
- Shadow y, x, y + 2, x + length
- END SUB
-
- '* ======================================================= *
- SUB Shadow (y1 AS INTEGER, x1 AS INTEGER, _
- y2 AS INTEGER, x2 AS INTEGER)
- '* "schattiert" den Bildschirmausschnitt. Zwischen dem
- '* Rahmen und dem Bildschirmrand muß noch Platz für den
- '* Schatten sein. Kein Check!!
- DIM i AS INTEGER
- FOR i = y1 TO y2
- WriteCharXY i + 1, x2, CHR$(177), 1 '* "▒"
- NEXT i
- WriteCharXY y2 + 1, x1 + 1, CHR$(177), x2 - x1
- END SUB
-
- '* ======================================================= *
- SUB WriteCharXY (y AS INTEGER, x AS INTEGER, ch AS STRING, _
- num AS INTEGER)
- '* 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 Positionierung im Speicher jedesmal berechnet
- '* werden.
- '* Berechnung der Anfangsadresse im Bildschirmspeicher:
- DIM Offset AS INTEGER, i AS INTEGER
- Offset = 160 * (y - 1) + x + x - 2
-
- DEF SEG = ScrSeg
- FOR i = Offset TO (Offset + (num - 1) * 2) STEP 2
- POKE i, ASC(ch)
- POKE i + 1, TextAttr
- NEXT i
- DEF SEG
- END SUB
-
- '* ======================================================= *
- SUB WriteTextXY (y AS INTEGER, x AS INTEGER, s AS STRING)
- DIM i AS INTEGER
- FOR i = 0 TO LEN(s) - 1
- WriteCharXY y, x + i, MID$(s, i + 1, 1), 1
- NEXT i
- END SUB
-
- '* ======================================================= *
- '* Ende von BOX.BAS *
-