I did see a few things in various programming dialects, but, like yourself, wasn't sure how to do in FreeBasic.
Unfortunately, the link didn't work.
Tried your suggested solution and entered it into the message loop, having introduced another button to generate the closure:
This partially worked. It removed everything in the grid except for column 2. Now I can't see why it would not close column 2. Any idea what I'm doing wrong? The full code is below:
Code: Select all
'=========================================================
' NumericEntryIntoGridOfTextboxes_BC2_Dev05C.bas
' Author: RNBW
' 7 August 2018
'--------------------------------------------------------------------------------------------------
'INSTRUCTIONS:
'Enter any text you want in col 2, rows 2 & 3. It is superfluous to the exercise and is only
'included for my own future use.
'Enter numbers into columns 3 and 4 in rows 2 and 3. They will be automatically
'checked for numeric validity in the range 0 to 9, minus and period and for only one
'inclusion of minus and period and ensuring that the minus only occurs as the first
'character. It will also print out ".123" as "0.123" and "-.123" as "-0.123"
'=========================================================
' TO DO:
' Totalling the rows and columns doesn't work.
' Format the numbers :
' As can be seen, the displayed numbers are a bit straggly.
' Format the numbers to a specific number of decimal places.
'=========================================================
#Include "WinGUI.bi"
Dim Shared As Long NumOfRows = 10
dim shared as long NumOfCols = 5
Dim Shared As String sRows, sCols
Dim Shared As HWND Window_Main, Static_Text, Label_a, Edit_a, Button_Num, Button_CloseGrid
Dim Shared As MSG msg
Dim Shared As String text, text2
Dim Shared As HWND Edit_Text(1 To NumOfRows, 1 To NumOfCols)
Dim Shared As HWND Button_Calc
Dim Shared As Long vPos, hPos, bWidth, bHeight, row, col
DIM Shared AS STRING sTxt, oldsTxt
DIM Shared AS INTEGER pos0
DIM Shared AS DOUBLE numb(2 TO NumOfRows, 3 TO NumOfCols)
DIM Shared AS DOUBLE totalRows(2 TO NumOfRows, NumOfCols)
DIM Shared AS DOUBLE totalCols(NumOfRows, 3 TO NumOfCols)
FUNCTION sNum(BYVAL sTxt AS STRING) AS STRING
'Function to check that character input is 0-9, - or .
DIM AS STRING sNum1
DIM AS INTEGER i, a, t
FOR i = 1 TO LEN(sTxt)
a = ASC(MID(sTxt,i,1))
IF a = 46 THEN t = t + 1
IF (a = 46) AND (t > 1) THEN a = 0 'only DOT after FIRST is cleared
IF a = 45 AND i>1 THEN a = 0 'so really almost anything do, not just 8
IF a = 46 AND i = 1 THEN sNum1 = "0" + sNum1
IF a = 45 OR a = 46 OR a > 47 AND a < 58 THEN sNum1 = sNum1 + CHR(a)
NEXT
a=ASC(MID(sTxt,1,1))
IF a = 45 AND MID(sTxt,2,1) = "." THEN sNum1 = "-0" + sNum1
RETURN sNum1
END FUNCTION
'---------------------
' MAIN WINDOW
'---------------------
Sub OpenWindow_Main()
Window_Main = Window_New(100, 100, 750, 400, "Numeric Input Into A Grid of Textboxes")
End Sub
OpenWindow_Main()
' Gadgets to state number of rows
Label_a = Label_New(10,10,270,20,"How many rows do you want to calculate",, Window_Main)
Edit_a = EditBox_New(300,10,30,20,"", ES_CENTER or WS_BORDER, Window_Main)
Button_Num = Button_New(350,10,100,20, "Enter",, Window_Main)
Button_CloseGrid = Button_New(500,10,100,20, "Close Grid",, Window_Main)
'Open console
'Screen 12
'open cons for output as #1
Button_Calc = Button_New(10, 60, 100, 20, "Calculate!",, Window_Main)
'-------------------------------
' SET UP THE GRID
'-------------------------------
sub setUpGrid(NumOfRows as long)
reDim As HWND Edit_Text(1 To NumOfRows, 1 To NumOfCols)
reDIM AS DOUBLE numb(2 TO NumOfRows, 3 TO NumOfCols)
reDIM AS DOUBLE totalRows(2 TO NumOfRows, NumOfCols)
reDIM AS DOUBLE totalCols(NumOfRows, 3 TO NumOfCols)
vPos = 90: bHeight = 20
For row = 1 To NumOfRows
For col = 1 To 5
Select Case col
Case 1
hPos = 10: bWidth = 65
Case 2
hPos = 75: bWidth = 380
End Select
Edit_Text(row, col) = EditBox_New(hPos, vPos+bHeight*(row-1), bWidth+1, bHeight+1, "",, Window_Main)
Next
Next
FOR row = 1 to 1
for col = 3 TO 5
SELECT CASE col
CASE 3 TO 4
hpos = col*65+(455-65*3) : bWidth = 65
CASE 5
hPos = (10+65+380)+(col-3)*65 : bWidth = 75
END SELECT
Edit_Text(row, col) = EditBox_New(hPos, vPos+bHeight*(row-1), bWidth+1, bHeight+1, "",, Window_Main)
NEXT
NEXT
FOR row = 2 TO NumOfRows
FOR col = 3 TO 5
SELECT CASE col
CASE 3 TO 4
hpos = col*65+(455-65*3) : bWidth = 65
CASE 5
hPos = (10+65+380)+(col-3)*65 : bWidth = 75
END SELECT
Edit_Text(row, col) = EditBox_New(hPos, vPos+bHeight*(row-1), bWidth+1, bHeight+1, "",ES_RIGHT, Window_Main)
NEXT
NEXT
'-----------------------------------
' SET UP HEADINGS IN ROW 1
'-----------------------------------
row = 1
For col = 3 To NumOfCols
EditBox_SetText(Edit_Text(row,col), "Number" + Str(col-2))
Next
EditBox_SetText(Edit_Text(row,2), "Description")
EditBox_SetText(Edit_Text(row,5), "TOTAL")
'----------------------------------
' SET UP HEADINGS IN COL 1
'----------------------------------
col = 1
For row = 2 To NumOfRows -1
For col = 1 To 1
EditBox_SetText(Edit_Text(row,col), "Row" + Str(row-1))
Next
Next
EditBox_SetText(Edit_Text(numOfRows,1), "TOTAL" )
end sub
'=============================================
'setUpGrid(2)
'=============================================
'Set timer to 300 miliseconds:
SETTIMER(Window_Main, 0, 300, 0 )
DO
WaitEvent(Window_Main,msg)
SELECT CASE msg.message
' CASE WM_LBUTTONDOWN
'SELECT CASE msg.message
CASE WM_TIMER
'Check contents of the edit box every 300 millisecinds
For row = 2 to NumOfRows
FOR col = 3 TO 4
sTxt = EditBox_GetText(Edit_Text(row,col)) 'get text from edit box
oldsTxt = sTxt 'make text the oldtext
sTxt = sNum(sTxt) 'gets new text from function sNum(sTxt) which does the checking
IF oldsTxt <> sTxt THEN
EditBox_SetText(Edit_Text(row,col), sTxt) 'if old text is not the same as the new text then use new text
pos0 = LEN(sTxt) 'position of character is the length of the current text
SENDMESSAGE(Edit_Text(row,col), EM_SETSEL, pos0, pos0)
END IF
NEXT col
NEXT row
CASE WM_LBUTTONDOWN
if msg.hwnd = Button_Num then
text = EditBox_GetText(Edit_a)
NumOfRows = val(text)
NumOfRows = NumOfRows + 2
setUpGrid(NumOfRows)
print NumOfRows
Else
' Click Close Grid button to close grid
' This closes all down except for column 2
if msg.hwnd = Button_CloseGrid THEN
for row = 1 to NumOfRows
for col = 1 to 5
SendMessage(Edit_Text(row,col), WM_CLOSE, 0, 0)
next
Next
Else
'If Calculate! button is clicked then carry out calculation
IF msg.hwnd = Button_Calc THEN
totalCols(NumOfRows,col) = 0
FOR row = 2 to NumOfRows
FOR col = 3 TO 5
' Total Rows--->
sTxt = EditBox_GetText(Edit_Text(row,col))
numb(row,col) = VAL(sTxt)
totalRows(row,5) = numb(row, 3) + numb(row,4)
sTxt = STR(totalRows(row,5))
EditBox_SetText(Edit_Text(row,5), sTxt)
'Total Columns--->
sTxt = EditBox_GetText(Edit_Text(row,col))
numb(row,col) = val(sTxt)
totalCols(NumOfRows,col) = totalCols(NumOfRows,col) + numb(row-1,col)
'print row; " "; col; " "; numb(row,col)
sTxt = STR(totalCols(NumOfRows,col))
EditBox_SetText(Edit_Text(NumOfRows,col), sTxt)
print row; " "; col; " "; numb(row,col)
NEXT
NEXT
end if
END IF
End if
END SELECT
LOOP UNTIL Window_Event_Close(Window_Main, msg)
End