Ooops
November 25, 2020, 08:19:02 AM

Author Topic: [bb] A much better input function by Russell [ 1+ years ago ]  (Read 551 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
Title : A much better input function
Author : Russell
Posted : 1+ years ago

Description : Instead of examining a user's input AFTER they press enter (and then running in a loop until they press the right ones), you tell the function which keys are acceptable and ONLY accept those keys. You also specify where to put the input (no Locate required), a prompt, a default (so that if they press enter, THAT will be returned) and a maximum length.

Enjoy!
Russell


Code :
Code: BlitzBasic
  1. Function GetInput$(x,y,sPrompt$,sFilter$,sDefault$,iMaxLength)
  2.         ; x = x location of the prompt, if any, or text input
  3.         ; y = y location ...
  4.         ; sPrompt$ is the prompt, such as "Please enter your name:"
  5.         ; sFilter$ is very useful. It ONLY allows the user to enter certain characters. For example, "ync" would only allow "y","n" or "c"
  6.         ;          There are also a few special 'codes':
  7.         ;                               "/all" or "" means allow anything to be entered
  8.         ;                               "/123" allows only 0 through 9 to be entered
  9.         ;                               "/abc" allows only letters of the alphabet to be entered
  10.        
  11.         FlushKeys
  12.         iFlashInterval = 300            ; The blinking cursor speed
  13.         sTotal$ = sDefault$
  14.         iNumDigits = Len(sDefault$)
  15.        
  16.         If Lower$(sFilter$) = "/123" Then sFilter$ = "0123456789"                                       ; All the numbers
  17.         If Lower$(sFilter$) = "/abc" Then sFilter$ = "abcdefghijklmnopqrstuvwxyz"       ; All the letters
  18.        
  19.         iTotalWidth = StringWidth(sPrompt$) + (iMaxLength * FontWidth())
  20.         iTotalHeight = FontHeight()
  21.        
  22.         hTextBuffer = CreateImage(iTotalWidth,iTotalHeight)     ; Where the text will be drawn before blitting to the backbuffer()
  23.         hCleanCopy = CreateImage(iTotalWidth,iTotalHeight)      ; Will hold a clean copy of the backbuffer (not the whole thing)
  24.         MaskImage hTextBuffer,255,0,255                                         ; Make the text background transparent so we can show text with BG showing
  25.         SetBuffer ImageBuffer(hTextBuffer)                                      ; We're going to draw to the text buffer
  26.         ClsColor 255,0,255                                                                      ; Temporarily make the cls color the transparent color (magenta)
  27.         Cls                                                                                                     ; Now clear to magenta
  28.         ; Foreground (text) will be drawn in the current color
  29.        
  30.         CopyRect x,y,iTotalWidth,iTotalHeight,0,0,BackBuffer(),ImageBuffer(hCleanCopy)  ; Save a clean copy of the back buffer where the
  31.                                                                                                                                                                         ;       text is going to be
  32.  
  33.         SetBuffer BackBuffer()
  34.         Repeat
  35.                 ; Blinking cursor code *******************************************************************************************************
  36.                 iCurrentTime = MilliSecs()
  37.                 If bFlash = True Then
  38.                         If (iCurrentTime - iOldFlashTime) >= iFlashInterval Then
  39.                                 bFlash = False
  40.                                 iOldFlashTime = MilliSecs()
  41.                         EndIf
  42.                 Else
  43.                         If (iCurrentTime - iOldFlashTime) >= iFlashInterval Then
  44.                                 bFlash = True
  45.                                 iOldFlashTime = MilliSecs()
  46.                         EndIf
  47.                 EndIf
  48.                
  49.                 ; Input starts here **********************************************************************************************************
  50.                 iKeyPressed = GetKey()
  51.                 If iKeyPressed = 13 Then
  52.                         sKeyPressed$ = ""
  53.                 Else
  54.                         sKeyPressed$ = Chr$(iKeyPressed)
  55.                 EndIf
  56.                
  57.                 ; If the key passes, add it to the total *************************************************************************************
  58.                 If iKeyPressed Then
  59.                         If (sFilter$ = "/all") Or (sFilter$ = "") Or (Instr(sFilter$,sKeyPressed$) > 0) Then ; "all" does not filter any keys out
  60.                                 If Len(sTotal$) < iMaxLength Then
  61.                                         sTotal$ = sTotal$ + sKeyPressed$                                                                ; Add it to the total string if it passes
  62.                                         iNumDigits = iNumDigits + 1
  63.                                 EndIf
  64.                         EndIf
  65.                 EndIf
  66.                
  67.                 ; If backspace was pressed, delete the last character from the total and update the number of digits *************************
  68.                 If KeyDown(14) And iNumDigits > 0 Then
  69.                         sTotal$ = Left$(sTotal$,iNumDigits - 1)
  70.                         iNumDigits = iNumDigits - 1
  71.                         Delay 50
  72.                 EndIf
  73.                
  74.                 ; Draw the clean background and then the text on the backbuffer() ************************************************************
  75.                 DrawBlock hCleanCopy,x,y
  76.  
  77.                 ; Draw the cursor if enough time has passed (change iFlashInterval for different speeds) *************************************
  78.                 If Len(sTotal$) = iMaxLength Then
  79.                         rx = StringWidth(sPrompt$ + sTotal$) - StringWidth(Right$(sTotal$,1))
  80.                         rw = StringWidth(Right$(sTotal$,1))
  81.                 Else
  82.                         rx = StringWidth(sPrompt$) + (Len(sTotal$) * FontWidth())
  83.                         rw = FontWidth()
  84.                 EndIf
  85.  
  86.                 If bFlash = True Then
  87.                         Text x,y,sPrompt$ + sTotal$
  88.                         Rect x + rx,y,rw,FontHeight(),True
  89.                 Else
  90.                         Text x,y,sPrompt$ + sTotal$
  91.                 EndIf
  92.  
  93.                 Flip
  94.         Until iKeyPressed = 13 ; This is the 'return/enter' key
  95.        
  96.         ClsColor 0,0,0  ; Reset back to black
  97.         Return sTotal$
  98. End Function


Comments : none...

 

SimplePortal 2.3.6 © 2008-2014, SimplePortal