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)