$CPU 8086 'make compatible with XT systems $LIB ALL OFF 'turn off all PowerBASIC libraries $ERROR ALL OFF 'turn off all PowerBASIC error checking $OPTIMIZE SIZE 'optimize for smaller code $COMPILE UNIT 'compile to a UNIT (.PBU) '$COMPILE EXE 'compile to a UNIT (.PBU) DEFINT A-Z 'Required for all numeric functions, forces PB to not 'include floating point in UNIT (makes it smaller) '/*--- Print Message ------------------------------------------------- $CODE SEG "MLIB1" '/*--- Print Message ------------------------------------------------- DECLARE SUB MCLICKED(Rgt%,Lft%,Row%,Col%) DECLARE SUB MOUSEOFF() DECLARE SUB MOUSEON() DECLARE FUNCTION ISMOUSELBR() DECLARE SUB SAY(BYVAL Row AS INTEGER, BYVAL Col AS INTEGER, BYVAL Text AS STRING, BYVAL Attr AS INTEGER) DECLARE SUB SAYB(BYVAL ROW,BYVAL COL,BYVAL T$,BYVAL ATTR,BYVAL HATTR,OPT) DECLARE SUB TWINDOW(ROW,COL,NROW,NCOL,ATTR,OPT$,BTYPE) DECLARE FUNCTION GETSCREEN() AS STRING DECLARE SUB PUTSCREEN(BYVAL X AS STRING) DECLARE FUNCTION WORDS(BYVAL X AS STRING) AS INTEGER DECLARE FUNCTION WORD(BYVAL X AS STRING,XN AS INTEGER) AS STRING DECLARE FUNCTION LASTELE(temp AS STRING) AS INTEGER DECLARE FUNCTION CENTER(BYVAL X AS STRING, BYVAL L AS INTEGER, BYVAL PAD AS STRING) AS STRING DECLARE FUNCTION GETKEY() AS STRING '/*--- Print Message ------------------------------------------------- FUNCTION MBOX(ROW,COL,ATTR,MSG$(),OPT$,BTYPE) PUBLIC AS STRING REDIM BT$(10) REDIM BC(10) REDIM BCE(10) H$ = GETSCREEN '/*--- Determine Options ---*/ FTITLE = INSTR(1,UCASE$(OPT$),"TITLE") IF FTITLE > 0 THEN TOPT$ = MID$(OPT$,FTITLE+6,INSTR(FTITLE+6,OPT$,"'")-(FTITLE+6)) END IF ' IF INSTR(1,OPT$,"G?") > 0 THEN TOPT$ = TOPT$ + " G? " ' IF INSTR(1,OPT$,"G#") > 0 THEN TOPT$ = TOPT$ + " G# " ' IF INSTR(1,OPT$,"G!") > 0 THEN TOPT$ = TOPT$ + " G! " ' IF INSTR(1,OPT$,"TP0") > 0 THEN TOPT$ = TOPT$ + " TP0 " ' IF INSTR(1,OPT$,"TP1") > 0 THEN TOPT$ = TOPT$ + " TP1 " ' IF INSTR(1,OPT$,"TP2") > 0 THEN TOPT$ = TOPT$ + " TP2 " ' IF INSTR(1,OPT$,"TP3") > 0 THEN TOPT$ = TOPT$ + " TP3 " ' IF INSTR(1,OPT$,"TP4") > 0 THEN TOPT$ = TOPT$ + " TP4 " ' IF INSTR(1,OPT$,"TP5") > 0 THEN TOPT$ = TOPT$ + " TP5 " ' IF INSTR(1,OPT$,"TP6") > 0 THEN TOPT$ = TOPT$ + " TP6 " ' IF INSTR(1,OPT$,"GATTR") > 0 THEN TOPT$ = TOPT$ + " GATTR" +MID$(OPT$,INSTR(1,OPT$,"GATTR")+5,3) ' IF INSTR(1,OPT$,"TATTR") > 0 THEN TOPT$ = TOPT$ + " TATTR" +MID$(OPT$,INSTR(1,OPT$,"TATTR")+5,3) FMOUSE = INSTR(1,OPT$,"MOUSE") FBUTTON = INSTR(1,OPT$,"BUTTON") FDEXIT = INSTR(1,OPT$,"DEXIT") IF FBUTTON > 0 THEN HKEY$ = "" S = INSTR(FBUTTON+7,OPT$,"'") BTEXT$ = MID$(OPT$,FBUTTON+7,S-(FBUTTON+7)) BWRDS = WORDS(BTEXT$) FOR CNT = 1 TO BWRDS BT$(CNT) = WORD(BTEXT$,CNT) S = INSTR(1,BT$(CNT),"@") IF S > 0 THEN HTKEY$ = HTKEY$ + MID$(BT$(CNT),S+1,1) NEXT CNT END IF IF INSTR(1,OPT$,"MCENTER") > 0 THEN FCENTER = 1 ELSE FCENTER = 0 IF INSTR(1,OPT$,"SEC") > 0 THEN S = INSTR(1,OPT$,"SEC") SEC = VAL(MID$(OPT$,S+3,3)) ELSE SEC = 0 END IF IF INSTR(1,OPT$,"DEXIT") > 0 THEN FDEXIT = 1 ELSE FDEXIT = 0 '/*--- Determine Longest and # of Elements ---*/ T = LASTELE(MSG$(1)) ' SAY 25,1,STR$(T),31 ' Y$ = GETKEY NBROWS = T L = 1 FOR CNT = 1 TO T TL = LEN(MSG$(CNT)) IF TL > L THEN L = TL NEXT CNT '/*--- Determine Graphic Type ---*/ GF = INSTR(1,OPT$,ANY"?#!") IF GF > 0 THEN OSET = 10 ELSE OSET = 2 END IF '/*--- Row/Col Centering? ---*/ IF ROW = 0 THEN ROW = 12 - (NBROWS\2) IF COL = 0 THEN COL = 40 - ((L+OSET+2)\2) '/* --- Display Window ---*/ IF FBUTTON > 0 THEN BOS = 3 ELSE BOS = 0 TWINDOW ROW,COL,NBROWS+BOS+2,L+OSET+2,ATTR,OPT$,BTYPE '/* --- Display Message ---*/ FOR CNT = 1 TO T IF FCENTER = 1 THEN SAY ROW+CNT,COL+OSET,CENTER(MSG$(CNT),L," "),ATTR ELSE SAY ROW+CNT,COL+OSET,MSG$(CNT),ATTR END IF NEXT CNT '/* --- What Type of Box ---*/ FUNCTION = "" IF FBUTTON > 0 THEN SP = 2 BROW = ROW+NBROWS+1 FOR CNT = 1 TO BWRDS BC(CNT) = COL+SP BCE(CNT) = LEN(REMOVE$(BT$(CNT),"@"))+2 SAYB BROW,BC(CNT),BT$(CNT),0,12,0 SP = SP + BCE(CNT) NEXT CNT MSGBUTRESTART: WHILE NOT INSTAT IF FMOUSE THEN MOUSEON MCLICKED Rgt%,Lft%,MRow%,MCol% IF ISMOUSELBR THEN IF MRow% = BROW OR MRow% = BROW + 1 OR MRow% = BROW + 2 THEN FBUT = 0 FOR CNT = 1 TO BWRDS IF MCol% => BC(CNT) AND MCol% <= BC(CNT)+BCE(CNT)-1 THEN FBUT = CNT END IF NEXT CNT IF FBUT > 0 THEN EXIT LOOP END IF END IF END IF WEND IF FMOUSE THEN MOUSEOFF IF FBUT > 0 THEN Y$ = MID$(HTKEY$,FBUT,1) ELSE Y$ = UCASE$(INKEY$) END IF S = INSTR(1,HTKEY$,Y$) IF S > 0 THEN SAYB BROW,BC(S),BT$(S),0,12,1 ELSE GOTO MSGBUTRESTART END IF FUNCTION = Y$ END IF '/* --- Wait for any key? ---*/ IF INSTR(1,OPT$,"ANYKEY") > 0 THEN Y$ = GETKEY END IF '/* --- Display & Exit? ---*/ IF FDEXIT = 1 THEN GOTO EEXITMBOX '/* --- WAIT? ---*/ IF SEC > 0 THEN DELAY SEC END IF PUTSCREEN H$ EEXITMBOX: END FUNCTION '/*-------------------------------------------------------------------- ' $INCLUDE "C:\CODE\MLIB\MLIB.INC" ' DIM MSG$(15) ' MSG$(1) = "Test message line #1" ' MSG$(2) = "Another" ' MSG$(3) = " " ' MSG$(4) = "1" ' MSG$(5) = " " ' MSG$(6) = "123" ' MSG$(7) = "" ' T$ = MBOX(0,0,31,MSG$(),"SEC030",1) ' SAY 25,1,T$,31 ' Y$ = GETKEY