Numeric entry control with Window's Textbox

Post your FreeBASIC source, examples, tips and tricks here. Please don’t post code without including an explanation.
Post Reply
BasicCoder2
Posts: 3906
Joined: Jan 01, 2009 7:03
Location: Australia

Numeric entry control with Window's Textbox

Post by BasicCoder2 »

This thread was originally about numeric entry into a Windows GUI text box.
viewtopic.php?f=7&t=26816
I didn't want to hijack the thread so I have made another one.
This is my take where any non numeric number in the two input columns is removed.
It removes anything typed into the total column which really shouldn't accept any key input in the first place.
Making the total column a list labels is perhaps the best solution.
There are other kinds of data as seen in a spread sheet. A common one being a date and/or time.
There are other features missing from the textbox such as aligning the text to the left, right or centre.

Code: Select all

'BasicCoder2  attempt at using WinGUI.bi
'8th August 2018
'Enter numbers into number1 and number 2 column
'Hit Calculate button to get total for each row and running total for numbers in TOTAL column.

#Include "C:\FreeBasic\WinGUI_FB\WinGUI.bi"

const GRIDX = 50          'top left corner of text box array
const GRIDY = 70

dim shared as integer colWidth(0 to 4)
dim shared as string  text         'text from text box
dim shared as integer mx,my,mb    'mouse variables

colWidth(0)=80              'width for each of the five columns
colWidth(1)=200
colWidth(2)=80
colWidth(3)=80
colWidth(4)=80

Dim shared As HWND Window_Main, grid(20, 10), displayText, labels(0 to 4), totalDisplay
Dim Shared As HWND Button_Calc

Dim shared As MSG msg
dim shared as integer maxCol,maxRow

'Create the window with a data grid:
Window_Main = Window_New(100, 100, 900, 500, "Totals Calculator")

'create display text box
displayText = EditBox_New( 10,10, 100, 20, "",, Window_Main)


sub setUpGrid()
    dim as integer nxtPos
    For j as integer = 0 To maxRow-1
        nxtPos = 0
	    For i as integer = 0 To maxCol-1
            grid(i, j) = EditBox_New( i+nxtPos + GRIDX, j * 20 + GRIDY, colWidth(i), 20, "abc",, Window_Main)
		    EditBox_SetText(grid(i, j), "")
            nxtPos = nxtPos + colWidth(i)
	    Next
    Next

    'create labels
    Labels(0) = Label_New(GRIDX,GRIDY-20,80,20,"  date",, Window_Main)
    labels(1) = Label_New(GRIDX+80,GRIDY-20,200,20,"   Description",, Window_Main)
    labels(2) = Label_New(GRIDX+280,GRIDY-20,80,20,"number 1",, Window_Main)
    labels(3) = Label_New(GRIDX+360,GRIDY-20,80,20,"number 2",, Window_Main)
    labels(4) = Label_New(GRIDX+440,GRIDY-20,80,20," TOTAL  ",, Window_Main)
    for j as integer = 0 to maxRow-1
        Labels(j) = Label_New(GRIDX-40,GRIDY+j*20,40,20,"row " & str(j),, Window_Main)
    next j
        
end sub


maxCol = 5
maxRow = 4
setUpGrid()  'set up grid

'create calculate button
Button_Calc = Button_New(10, 360, 100, 20, "Calculate!",, Window_Main)
totalDisplay = Label_New(120,10,100,20,"Running Total",, Window_Main)

'Main:
dim as single num1,num2,total,runningTotal

Do
    
   WaitEvent(Window_Main,msg)
   SELECT CASE msg.message
      CASE WM_LBUTTONDOWN

         IF msg.hwnd = Button_Calc THEN
            runningTotal = 0
            for j as integer = 0 to 7
               num1 = val(EditBox_GetText(grid(2,j)))
               num2 = val(EditBox_GetText(grid(3,j)))
               total = num1 + num2
               runningTotal = runningTotal + total
               EditBox_SetText(grid(4,j), str(total))
            next j
            EditBox_SetText(displayText,str(runningTotal))
        End if

       'this erases non numerical entries
       dim as single num
       dim as string strNum
       For j as integer = 0 To maxRow-1
	       For i as integer = 0 To maxCol-1
               num = val(EditBox_GetText(grid(i,j)))  'get value
               if num = 0  then
                   strNum = ""
               else
                   strNum = str(num)
               end if
		       EditBox_SetText(grid(i, j), strNum)  'convert to string
	       Next
       Next
        
        
   END SELECT

Loop Until Window_Event_Close(Window_Main, msg)
Post Reply