' David Hoff Jr ' Text Input Routine ' 'KeyPress.Bas by: David Hoff Jr ' DHoffJr at Clipboard.com ' 8/1/05 'KeyPress.Bas shows the use of KeyEntry.Bas. KeyEntry.Bas creates a 'text infut box, sets a limit on which keys are activated in the text 'box, sets a limit on text length, returns a dirrectional 'key (such as up/down arrows, Pageup/PageDown, with or without the 'ALT or CTRL keys), and processes the ESC key if pressed. The 'string variable 'Wurd' is returned for you to assign to your own 'variable defenition. Insert and Overstrike mode are toggled with 'the "INS" key. Cut, Copy & Paste are not supported. #COMPILE EXE #DIM ALL 'Colors GLOBAL AScrnL AS INTEGER GLOBAL PScrnL AS INTEGER GLOBAL ScrnC AS INTEGER GLOBAL BarL AS INTEGER GLOBAL BarC AS INTEGER ' AScrnL = Active (Changeable) Screen Fonts Color ' PScrnL = Read Only (Labels & Directions) Screen FOnts Color ' ScrnC = Screen Background Color ' BarL = Highlighted text box font Color ' BarC = Highlighted Text Box Background color 'Variables used to create 'KeysOn' variable. These can be added 'together to allow only the keyboard input you need, such as, 'kNum + kDec for numberic amounts with a decimal (only one decimal 'decimal point is allowed), kLet + kPun for simple sentence structure 'with normal punctuation, etc. GLOBAL kNum AS INTEGER GLOBAL kLet AS INTEGER GLOBAL kDec AS INTEGER GLOBAL kPun AS INTEGER GLOBAL kMat AS INTEGER GLOBAL kSym AS INTEGER GLOBAL kArr AS INTEGER GLOBAL kAll AS INTEGER ' kNum = Activates All Numbers ' kLet = Activates All Alphabet Letters ' kDec = Activates The Period for Use with numbers as a decimal point ' kPun = Activates All Various Punctuation Marks ' kMat = Activates Various Math symbols ' kSym = Activates Various other keybaord symbols ' kArr = Activates Arrow Keys, Page Up/Down (with & without CTRL & ALT)' kAll = Activates All keybaord keys REM ============================================================= FUNCTION PBMAIN () AS LONG AScrnL = 14: PScrnL = 15: ScrnC = 0: BarL = 15: BarC = 1 kNum = 1: kLet = 2: kDec = 4: kPun = 8: kMat = 16: kSym = 32: kArr = 64: kAll = 128 CALL Info_Entry () END FUNCTION REM ================================================= SUB Info_Entry () LOCAL X AS INTEGER LOCAL Pick AS STRING LOCAL Wurd AS STRING LOCAL CurLabel AS STRING LOCAL MaxSize AS INTEGER LOCAL KeysOn AS INTEGER LOCAL Box1 AS STRING LOCAL Box2 AS STRING LOCAL Box3 AS STRING CLS REM note at top of screen COLOR PScrnL, ScrnC LOCATE 2,1 PRINT "Use 'Enter' key to move to next box, OR use arrow type keys to move" PRINT "up or down between boxes (when arrow keys are activated). PRINT "Arrow keys are UP/DOWN, PGUP/PGDOWN, ALT + PGUP/PGDOWN and PRINT "CTRL + PGUP/PGDOWN" X = 1 DO SELECT CASE X CASE 1 'First Box - Any keyboard input LOCATE 7,1 COLOR PScrnL, ScrnC PRINT "This box allows entry of all keyboard keys and presses arrow keys" COLOR AScrnL, ScrnC LOCATE 9, 10 MaxSize = 40 'Maximum length of entry KeysOn = kAll + kArr 'Use all keyboard keys and catch arrow keys IF Box1 = "" THEN Wurd = "" ELSE Wurd = Box1 CALL KeyEntry (MaxSize, Wurd, KeysOn, CurLabel) SELECT CASE CurLabel CASE = "ESC" EXIT SUB CASE = "UP", "ALTUP", "CTRLUP", "PAGEUP", "CTRLPAGEUP", "ALTPAGEUP" Box1 = Wurd X = 3 CASE = "DOWN", "ALTDOWN", "CTRLDOWN", "PAGEDOWN", "CTRLPAGEDOWN", "ALTPAGEDOWN" BOX1 = Wurd INCR X CASE ELSE BOX1 = Wurd INCR X END SELECT CASE 2 'Second Box - Numbers only with decimal point COLOR PScrnL, ScrnC LOCATE 12, 1 PRINT "This box allows entry of numbers and one decimal point"; LOCATE 13,1 PRINT "It also processes the arrow keys"; COLOR AScrnL, ScrnC LOCATE 15, 30 MaxSize = 10 'Maximum length of entry KeysOn = kNum + kDec + kArr 'Enter amounts with decimal point. Also catch arrow Keys IF Box2 = "" THEN Wurd = "" ELSE Wurd = Box2 CALL KeyEntry (MaxSize, Wurd, KeysOn, CurLabel) SELECT CASE CurLabel CASE = "ESC" EXIT SUB CASE = "UP", "ALTUP", "CTRLUP", "PAGEUP", "CTRLPAGEUP", "ALTPAGEUP" BOX2 = Wurd DECR X CASE = "DOWN", "ALTDOWN", "CTRLDOWN", "PAGEDOWN", "CTRLPAGEDOWN", "ALTPAGEDOWN" BOX2 = Wurd INCR X CASE ELSE BOX2 = Wurd INCR X END SELECT CASE 3 'Third BOx - Numbers only without decimal COLOR PScrnL, ScrnC LOCATE 18, 1 PRINT "This box allows only numbers and does not process arrow keys" COLOR AScrnL, ScrnC LOCATE 19, 60 MaxSize = 10 'Maximum length of entry KeysOn = kNum 'Enter amounts with decimal point. Also catch arrow Keys IF Box3 = "" THEN Wurd = "" ELSE Wurd = Box3 CALL KeyEntry (MaxSize, Wurd, KeysOn, CurLabel) SELECT CASE CurLabel CASE = "ESC" EXIT SUB CASE = "UP", "ALTUP", "CTRLUP", "PAGEUP", "CTRLPAGEUP", "ALTPAGEUP" BOX3 = Wurd DECR X CASE = "DOWN", "ALTDOWN", "CTRLDOWN", "PAGEDOWN", "CTRLPAGEDOWN", "ALTPAGEDOWN" BOX3 = Wurd X = 1 CASE ELSE BOX3 = Wurd EXIT LOOP END SELECT END SELECT LOOP COLOR Barl, BarC LOCATE 24, 27 PRINT "Press Any Key To Continue" WAITKEY$ END SUB REM ====================================================================== SUB KeyEntry (MaxSize AS INTEGER, Wurd AS STRING, KeysOn AS INTEGER, CurLabel AS STRING) LOCAL Pick AS STRING LOCAL Entry AS STRING LOCAL CurPos AS INTEGER LOCAL Row AS INTEGER LOCAL Column AS INTEGER LOCAL Insrt AS INTEGER LOCAL ExtKey AS INTEGER LOCAL Decimal AS INTEGER CurLabel = "" ExtKey = 0 'Used with INSHFT REM Set Cursor to full blink CURSOR ON, 100 Decimal = 0 'Used to limit one decimal per number entry Pick = "" 'Used for each key press Row = CURSORY Column = CURSORX IF Wurd <> "" THEN Entry = Wurd ELSE Entry = "" COLOR PScrnL, ScrnC REM Print Input box, Entry if <> "", and position cursor SELECT CASE LEN(Entry) CASE MaxSize CurPos = LEN(Entry) COLOR BarL, BarC LOCATE Row, Column STDOUT STRING$(MaxSize, 32); LOCATE Row, Column STDOUT Entry; LOCATE Row, Column + MaxSize - 1 EXIT SELECT CASE 0 CurPos = 1 COLOR BarL, BarC LOCATE Row, Column STDOUT STRING$(MaxSize, 32); LOCATE Row, Column CASE > 0 CurPos = LEN(Entry) + 1 COLOR BarL, BarC LOCATE Row, Column STDOUT STRING$(MaxSize, 32); LOCATE Row, Column STDOUT Entry; END SELECT REM Start input loop DO Pick = INKEY$ ExtKey = INSHIFT SLEEP 1 SELECT CASE LEN(Pick) CASE 1 SELECT CASE Pick REM 0-9 - Bit 0 or Bit 7 CASE CHR$(48) TO CHR$(57) IF BIT(KeysOn, 0) OR BIT(KeysOn, 7) THEN CALL Process_Key (MaxSize, Entry, CurPos, Row, Column, Insrt, Pick) END IF REM A-Z, a-z - Bit 1 or Bit 7 CASE CHR$(65) TO CHR$(90), CHR$(97) TO CHR$(122) IF BIT(KeysOn, 1) OR BIT(KeysOn, 7) THEN CALL Process_Key (MaxSize, Entry, CurPos, Row, Column, Insrt, Pick) END IF REM Decimal or Period - Bit 3 CASE CHR$(46) IF BIT(KeysOn, 1) OR BIT(KeysOn, 7) THEN CALL Process_Key (MaxSize, Entry, CurPos, Row, Column, Insrt, Pick) ELSEIF ISTRUE BIT(KeysOn, 2) THEN IF Decimal = 0 THEN CALL Process_Key (MaxSize, Entry, CurPos, Row, Column, Insrt, Pick) Decimal = 1 END IF END IF REM Punctuation - Bit 4 - Comma, Colon, Semi Colon, Exclamation, Question, Single & Double Quote, Accent Mark CASE CHR$(44), CHR$(58), CHR$(59), CHR$(33), CHR$(63), CHR$(39), CHR$(34), CHR$(96) IF BIT(KeysOn, 3) OR BIT(KeysOn, 7) THEN CALL Process_Key (MaxSize, Entry, CurPos, Row, Column, Insrt, Pick) END IF REM Math Symbals - Bit 5, *, Back Slash, Plus, Minus, Equals CASE CHR$(42), CHR$(47), CHR$(43), CHR$(45), CHR$(61) IF BIT(KeysOn, 4) OR BIT(KeysOn, 7) THEN CALL Process_Key (MaxSize, Entry, CurPos, Row, Column, Insrt, Pick) END IF REM Other Symbals - Bit 6, ~, @, #, $, %, ^, &, Pipe, Forward Slash, [ and ], { and }, < and >, Underscore, Right & Left Parenthisis CASE CHR$(126), CHR$(64), CHR$(35), CHR$(36), CHR$(37), CHR$(94), CHR$(38), CHR$(124), CHR$(92), CHR$(91), CHR$(93), CHR$(123), CHR$(125), CHR$(60), CHR$(62), CHR$(95), CHR$(40), CHR$(41) IF BIT(KeysOn, 5) OR BIT(KeysOn, 7) THEN CALL Process_Key (MaxSize, Entry, CurPos, Row, Column, Insrt, Pick) END IF REM Space Bar CASE CHR$(32) IF BIT(KeysOn, 0) THEN IF BIT(KeysOn, 2) THEN EXIT SELECT ELSE CALL Process_Key (MaxSize, Entry, CurPos, Row, Column, Insrt, Pick) EXIT SELECT END IF ELSEIF BIT(KeysOn, 1) THEN CALL Process_Key (MaxSize, Entry, CurPos, Row, Column, Insrt, Pick) EXIT SELECT ELSEIF BIT(KeysOn, 7) THEN CALL Process_Key (MaxSize, Entry, CurPos, Row, Column, Insrt, Pick) EXIT SELECT END IF REM Return Key CASE CHR$(13) EXIT LOOP REM BACKSPACE Key CASE CHR$(8) IF CurPos = 1 THEN Decimal = 0 EXIT SELECT ELSEIF CurPos > LEN(Entry) + 1 THEN IF MID$(Entry, CurPos - 1, 1) = CHR$(46) THEN Decimal = 0 LOCATE Row, Column + CurPos DECR CurPos ELSE IF MID$(Entry, CurPos - 1, 1) = CHR$(46) THEN Decimal = 0 DECR CurPos Entry = LEFT$(Entry, CurPos-1) + RIGHT$(Entry, LEN(Entry)-CurPos) LOCATE Row, Column COLOR BarL, BarC PRINT STRING$(MaxSize, 32) LOCATE Row, Column PRINT Entry END IF REM ESC Key CASE CHR$(27) COLOR PScrnL, ScrnC CurLabel = "ESC" CURSOR OFF EXIT LOOP END SELECT CASE = 2: REM Cursor Movement & Control Keys ********************************************* SELECT CASE RIGHT$(Pick,1) REM Right Cursor, with CTRL key, With ALT Key CASE CHR$(77) IF ISFALSE BIT(KeysOn, 6) THEN IF BIT(KeysOn, 0) OR BIT(KeysOn, 1) OR BIT(KeysOn, 7) THEN IF CurPos = MaxSize THEN EXIT IF ELSEIF CurPos = (LEN(Entry) + 1) THEN EXIT IF ELSE LOCATE Row, Column + CurPos + 1 INCR CurPos END IF END IF REM ALTRIGHT ELSEIF BIT(KeysOn, 0) OR BIT(ExtKey, 1) THEN IF Entry = "" THEN CurLabel = "ALTRIGHT" EXIT LOOP ELSEIF Entry <> "" THEN IF CurPos = MaxSize THEN EXIT IF ELSEIF CurPos = (LEN(Entry) + 1) THEN EXIT IF ELSE LOCATE Row, Column + CurPos + 1 INCR CurPos END IF END IF REM CTRLRIGHT ELSEIF BIT(KeysOn, 2) OR BIT(ExtKey, 3) THEN IF Entry = "" THEN CurLabel = "CTRLRIGHT" EXIT LOOP ELSEIF Entry <> "" THEN IF CurPos = MaxSize THEN EXIT IF ELSEIF CurPos = (LEN(Entry) + 1) THEN EXIT IF ELSE LOCATE Row, Column + CurPos + 1 INCR CurPos END IF END IF REM RIGHT ELSE IF Entry = "" THEN CurLabel = "RIGHT" EXIT LOOP ELSEIF Entry <> "" THEN IF CurPos = MaxSize THEN EXIT IF ELSEIF CurPos = (LEN(Entry) + 1) THEN EXIT IF ELSE LOCATE Row, Column + CurPos + 1 INCR CurPos END IF END IF END IF REM Left Cursor, with CTRL key, With ALT Key CASE CHR$(75) IF ISFALSE BIT(KeysOn, 6) THEN IF BIT(KeysOn, 0) OR BIT(KeysOn, 1) OR BIT(KeysOn, 7) THEN IF CurPos = 1 THEN EXIT IF ELSE LOCATE Row, Column + CurPos - 1 DECR CurPos END IF END IF REM ALTLEFT ELSEIF BIT(KeysOn, 0) OR BIT(ExtKey, 1) THEN IF Entry = "" THEN CurLabel = "ALTLEFT" EXIT LOOP ELSEIF Entry <> "" THEN IF CurPos = 1 THEN EXIT IF ELSE LOCATE Row, Column + CurPos - 1 DECR CurPos END IF END IF REM CTRLLEFT ELSEIF BIT(KeysOn, 2) OR BIT(ExtKey, 3) THEN IF Entry = "" THEN CurLabel = "CTRLLEFT" EXIT LOOP ELSEIF Entry <> "" THEN IF CurPos = 1 THEN EXIT IF ELSE LOCATE Row, Column + CurPos - 1 DECR CurPos END IF END IF REM LEFT ELSE IF Entry = "" THEN CurLabel = "LEFT" EXIT LOOP ELSEIF Entry <> "" THEN IF CurPos = 1 THEN EXIT IF ELSE LOCATE Row, Column + CurPos - 1 DECR CurPos END IF END IF END IF REM Up Cursor, With CTRL Key, With ALT Key CASE CHR$(72) IF ISFALSE BIT(KeysOn, 6) THEN EXIT SELECT REM ALTUP ELSEIF BIT(ExtKey, 0) OR BIT(ExtKey, 1) THEN CurLabel = "ALTUP" EXIT LOOP REM CTRLUP ELSEIF BIT(ExtKey, 2) OR BIT(ExtKey, 3) THEN CurLabel = "CTRLUP" EXIT LOOP ELSE CurLabel = "UP" EXIT LOOP END IF REM Down Cursor, With CTRL Key, With ALT Key CASE CHR$(80) IF ISFALSE BIT(KeysOn, 6) THEN EXIT SELECT REM ALTDOWN ELSEIF BIT(ExtKey, 0) OR BIT(ExtKey, 1) THEN CurLabel = "ALTDOWN" EXIT LOOP REM CTRLDOWN ELSEIF BIT(ExtKey, 2) OR BIT(ExtKey, 3) THEN CurLabel = "CTRLDOWN" EXIT LOOP ELSE CurLabel = "DOWN" EXIT LOOP END IF REM PageUp, With CTRL Key, With ALT Key CASE CHR$(73) IF ISFALSE BIT(KeysOn, 6) THEN EXIT SELECT ELSEIF BIT(KeysOn, 6) THEN REM ALTPAGEUP IF BIT(ExtKey, 0) OR BIT(ExtKey, 1) THEN CurLabel = "ALTPAGEUP" EXIT LOOP REM CTRLPAGEUP ELSEIF BIT(ExtKey, 2) OR BIT(ExtKey, 3) THEN CurLabel = "CTRLPAGEUP" EXIT LOOP REM PAGEUP ELSE CurLabel = "PAGEUP" EXIT LOOP END IF END IF REM PageDown, With CTRL Key, With ALT Key CASE CHR$(81) IF ISFALSE BIT(KeysOn, 6) THEN EXIT SELECT ELSEIF BIT(KeysOn, 6) THEN REM ALTPAGEDOWN IF BIT(ExtKey, 0) OR BIT(ExtKey, 1) THEN CurLabel = "ALTPAGEDOWN" EXIT LOOP REM CTRLPAGEDOWN ELSEIF BIT(ExtKey, 2) OR BIT(ExtKey, 3) THEN CurLabel = "CTRLPAGEDOWN" EXIT LOOP REM PAGEDOWN ELSE CurLabel = "PAGEDOWN" EXIT LOOP END IF END IF REM END Key CASE CHR$(79) IF LEN(Entry) = MaxSize THEN LOCATE Row, Column + LEN(Entry) -1 CurPos = MaxSize ELSE LOCATE Row, Column + LEN(Entry) CurPos = LEN(Entry) + 1 END IF REM HOME Key CASE CHR$(71) LOCATE Row, Column CurPos = 1 REM INSERT Key CASE CHR$(82) SELECT CASE Insrt CASE 0 CURSOR ON, 15 Insrt = 1 CASE 1 CURSOR ON, 100 Insrt = 0 END SELECT REM DELETE Key CASE CHR$(83) COLOR BarL, BarC IF CurPos = 1 AND LEN(Entry) =< 1 THEN Entry = "" Decimal = 0 LOCATE Row, Column PRINT STRING$(MaxSize,32); LOCATE Row, Column ELSEIF CurPos = 1 AND LEN(Entry) > 1 THEN IF LEFT$(Entry, 1) = CHR$(46) THEN Decimal = 0 Entry = RIGHT$(Entry, LEN(Entry)-1) LOCATE Row, Column PRINT STRING$(MaxSize, 32) LOCATE Row, Column PRINT Entry; ELSEIF CurPos > LEN(Entry) THEN EXIT SELECT ELSE IF MID$(Entry, CurPos, 1) = CHR$(46) THEN Decimal = 0 DECR CurPos Entry = LEFT$(Entry, CurPos) + RIGHT$(Entry, LEN(Entry)-CurPos -1) LOCATE Row, Column PRINT STRING$(MaxSize, 32); LOCATE Row, Column PRINT Entry;" "; INCR CurPos END IF END SELECT END SELECT IF Pick <> "" THEN LOCATE Row, Column + CurPos-1 LOOP COLOR ScrnC, ScrnC LOCATE Row, Column STDOUT STRING$(MaxSize, 32); IF CurLabel <> "ESC" THEN Wurd = TRIM$(Entry, CHR$(32)) END IF LOCATE Row, Column COLOR AScrnL, ScrnC STDOUT Wurd; COLOR PScrnL, ScrnC CURSOR OFF END SUB REM ================================================= SUB Process_Key (MaxSize AS INTEGER, Entry AS STRING, CurPos AS INTEGER, Row AS INTEGER, Column AS INTEGER, Insrt AS INTEGER, Pick AS STRING) COLOR BarL, BarC SELECT CASE Insrt CASE 0: REM INSERT OFF IF CurPos = 1 AND Entry = "" THEN Entry = Pick LOCATE Row, Column STDOUT Entry; IF MaxSize > 1 THEN INCR CurPos LOCATE Row, Column + CurPos ELSEIF CurPos = 1 AND LEN(Entry) > 1 THEN Entry = Pick + RIGHT$(Entry, LEN(Entry)-1) LOCATE Row, Column STDOUT Entry; INCR CurPos LOCATE Row, Column + CurPos ELSEIF CurPos = LEN(Entry) THEN Entry = LEFT$(Entry, LEN(Entry)-1) + Pick LOCATE Row, Column STDOUT Entry; IF CurPos < MaxSize THEN INCR CurPos LOCATE Row, Column + CurPos ELSEIF CurPos = LEN(Entry) + 1 THEN Entry = Entry + Pick LOCATE Row, Column STDOUT Entry; IF CurPos < MaxSize THEN INCR CurPos LOCATE Row, Column + CurPos ELSEIF CurPos > LEN(Entry) + 1 THEN Entry = Entry + STRING$(CurPos-LEN(Entry)-1, 32) + Pick LOCATE Row, Column STDOUT Entry; IF CurPos < MaxSize THEN INCR CurPos LOCATE Row, Column + CurPos ELSEIF CurPos <> 1 AND CurPos < LEN(Entry) THEN Entry = LEFT$(Entry, CurPos -1) + Pick+ MID$(Entry, CurPos + 1, LEN(Entry) - CurPos) LOCATE Row, Column STDOUT Entry; INCR CurPos LOCATE Row, Column + CurPos END IF CASE 1: REM INSERT ON IF CurPos = 1 AND Entry = "" THEN Entry = Pick LOCATE Row, Column STDOUT Entry; IF MaxSize > 1 THEN INCR CurPos LOCATE Row, Column + CurPos ELSEIF CurPos = 1 AND LEN(Entry) > 1 THEN IF LEN(Entry) < MaxSize THEN Entry = Pick + LEFT$(Entry, LEN(Entry)) ELSEIF LEN(Entry) = MaxSize THEN Entry = Pick + LEFT$(Entry, LEN(Entry)- 1) END IF LOCATE Row, Column STDOUT Entry; INCR CurPos LOCATE Row, Column + CurPos ELSEIF CurPos = LEN(Entry) THEN IF CurPos < MaxSize THEN Entry = LEFT$(Entry, LEN(Entry) -1) + Pick + RIGHT$(Entry, 1) ELSEIF CurPos = MaxSize THEN Entry = LEFT$(Entry, LEN(Entry) -1) + Pick END IF LOCATE Row, Column STDOUT Entry; IF CurPos < MaxSize THEN INCR CurPos LOCATE Row, Column + CurPos ELSEIF CurPos = LEN(Entry) + 1 THEN Entry = Entry + Pick LOCATE Row, Column STDOUT Entry; IF CurPos < MaxSize THEN INCR CurPos LOCATE Row, Column + CurPos ELSEIF CurPos > LEN(Entry) + 1 THEN Entry = Entry + STRING$(CurPos-LEN(Entry)-1, 32) + Pick LOCATE Row, Column STDOUT Entry; IF CurPos < MaxSize THEN INCR CurPos LOCATE Row, Column + CurPos ELSEIF CurPos <> 1 AND CurPos < LEN(Entry) THEN IF LEN(Entry) = MaxSize THEN Entry = LEFT$(Entry, CurPos -1) + Pick + MID$(Entry, CurPos, LEN(Entry) - CurPos) ELSEIF LEN(Entry) < MaxSize THEN Entry = LEFT$(Entry, CurPos - 1) + Pick + MID$(Entry, CurPos, LEN(Entry) - CurPos + 1) END IF LOCATE Row, Column STDOUT Entry; INCR CurPos LOCATE Row, Column + CurPos END IF END SELECT END SUB