Author |
Topic: Numeric entry into a textbox (Read 2315 times) |
|
RNBW
Full Member
member is offline


Gender: 
Posts: 106
|
 |
Re: Numeric entry into a textbox
« Reply #6 on: May 9th, 2016, 07:34am » |
|
Point taken!
So the only safe way to do it is to check the final entered number and if there is more than one "." then to give a warning to that effect and let the user decide which is the correct "." and re-enter the number.
|
| « Last Edit: May 9th, 2016, 07:34am by RNBW » |
Logged
|
|
|
|
Richard Russell
Administrator
member is offline


Posts: 1348
|
 |
Re: Numeric entry into a textbox
« Reply #7 on: May 9th, 2016, 09:43am » |
|
on May 9th, 2016, 07:34am, RNBW wrote: Would that be "decimal point" taken? 
Richard.
|
|
Logged
|
|
|
|
RNBW
Full Member
member is offline


Gender: 
Posts: 106
|
 |
Re: Numeric entry into a textbox
« Reply #8 on: May 18th, 2016, 10:20am » |
|
I have tidied up the routine a little: * increased the number of textboxes from 2 to 3 * instead of separate textboxes, made them into a grid * made the borders thinner * made the entry right justified (like calculator entry)
It still needs the issue of more than one decimal point to be dealt with. I think this will have to be a Notice with a warning for the user to ensure just one decimal point.
Here's the code to date. Hope it's of use.
Code:
'==================================================
' NUMERIC INPUT CHECK DEMO
'==================================================
' Originally by Brandon Parker Liberty Basic
' Conforums Re: Error Messege
' « Reply #3 on: Yesterday at 10:47pm »
'--------------------------------------------------
' Modifications by RNBW 7 May 2016
'--------------------------------------------------
' Modification to SLEEP period from 1 to 300
' (allows you to see the unacceptable
' character displayed before deletion.
'--------------------------------------------------
' remchar$() has been replaced by the function
' num$(d$) posted by GaRPMorE in his post
' « Reply #6 on: Apr 22nd, 2016, 7:23pm » and
' modified by RNBW.
' This should enable compatibility with
' earlier versions of LB, including the PRO version
' This version does not appear to be compatible
' with JustBasic
'==================================================
NoMainWin
NumOfTB = 3
Dim ControlName$(NumOfTB)
WindowWidth = 130
WindowHeight = 250
UpperLeftX=int((DisplayWidth-WindowWidth)/2)
UpperLeftY=int((DisplayHeight-WindowHeight)/2)
bWidth = 100
bHt = 30
TextboxColor$ = "white"
Stylebits #main.textbox1, _ES_RIGHT, _WS_BORDER, 0, 0
TextBox #main.textbox1, 5, 30, bWidth, bHt+1
Stylebits #main.textbox2, _ES_RIGHT, _WS_BORDER, 0, 0
TextBox #main.textbox2, 5, 60, bWidth, bHt+1
Stylebits #main.textbox3, _ES_RIGHT, _WS_BORDER, 0, 0
Textbox #main.textbox3, 5, 90, bWidth, bHt+1
Open "untitled" For Window As #main
#main, "Font Georgia 12"
#main "TrapClose Quit"
'ControlName$(1) = "#main.textbox1"
'ControlName$(2) = "#main.textbox2"
'ControlName$(3) = "#main.textbox3"
For i = 1 to NumOfTB
ControlName$(i) = "#main.textbox" + str$(i)
next
While Hwnd(#main)
Scan
For i = 1 To NumOfTB
Call checkInput ControlName$(i)
Next i
CallDLL #kernel32, "Sleep", 300 As long, _
ret As void
Wend
'---------------------------------------------------------------
' Check the characters entered.
'---------------------------------------------------------------
' It does not check for more than one occurence of "."
' or that "." is not the last character.
'---------------------------------------------------------------
Sub checkInput controlName$
#controlName$ "!contents? txt$"
initLen = Len(txt$)
txt$ = num$(txt$)
If Len(txt$) < initLen Then
#controlName$ txt$
handle = Hwnd(#controlName$)
pos = Len(txt$)
CallDLL #user32, "SendMessageA", handle As long, _
_EM_SETSEL As long, _
pos As long, _
pos As long, _
result As void
End If
End Sub
'------------------------
' Close down the program
'------------------------
Sub Quit handle$
Close #handle$
End
End Sub
'-------------------------------------------------------------
' function to replace remchar$() LB4.5 function
' This should make this compatible with earlier version of LB
' Code by GaRPMorE in Re: textbox input - numbers only
' in LB Forum Reply #6 on: Apr 22nd, 2016, 7:23pm »
'-------------------------------------------------------------
function num$(d$)
for i=1 to len(d$)
a=asc(mid$(d$,i,1))
if a = 45 and i = 1 or a = 46 or a>47 and a<58 then num$=num$+chr$(a)
next
end function
|
|
Logged
|
|
|
|
RNBW
Full Member
member is offline


Gender: 
Posts: 106
|
 |
Re: Numeric entry into a textbox
« Reply #9 on: May 19th, 2016, 2:01pm » |
|
I am trying to extend the use of Brandon Parker's code for numeric entry. In my last post I produced code for a small grid consisting of 3 textboxes.
This worked pretty well, so I thought I would try a 3 x 3 grid.
I just can't get it to work.
Code:
NoMainWin
Row = 3: Col =3
Dim TB$(Row, Col)
WindowWidth = 240
WindowHeight = 200
UpperLeftX=int((DisplayWidth-WindowWidth)/2)
UpperLeftY=int((DisplayHeight-WindowHeight)/2)
bWidth = 100: bHt = 30 'width & height of textboxes
TextboxColor$ = "white"
Stylebits #main.tb1, _ES_RIGHT, _WS_BORDER, 0, 0
TextBox #main.tb1, 20, 30, bWidth, bHt+1
Stylebits #main.tb2, _ES_RIGHT, _WS_BORDER, 0, 0
TextBox #main.tb2, 20, 60, bWidth, bHt+1
Stylebits #main.tb3, _ES_RIGHT, _WS_BORDER, 0, 0
Textbox #main.tb3, 20, 90, bWidth, bHt+1
Open "untitled" For Window As #main
#main, "Font Arial 11"
#main "TrapClose Quit"
For i = 1 to Row
For j = 1 to Col
TB$(i,j) = "#main.tb" + str$(i) + str$(j)
Next
Next
While Hwnd(#main)
Scan
For i = 1 To Row
For j = 1 to Col
Call checkInput TB$(i,j)
Next j
Next i
CallDLL #kernel32, "Sleep", 300 As long, _
ret As void
Wend
'---------------------------------------------------------------
' Check the characters entered.
'---------------------------------------------------------------
' It does not check for more than one occurence of "."
' or that "." is not the last character.
'---------------------------------------------------------------
Sub checkInput controlName$
#controlName$ "!contents? txt$" 'THIS IS WHERE THE ERROR COMES UP
initLen = Len(txt$)
txt$ = num$(txt$)
If Len(txt$) < initLen Then
#controlName$ txt$
handle = Hwnd(#controlName$)
pos = Len(txt$)
CallDLL #user32, "SendMessageA", handle As long, _
_EM_SETSEL As long, _
pos As long, _
pos As long, _
result As void
End If
End Sub
'------------------------
' Close down the program
'------------------------
Sub Quit handle$
Close #handle$
End
End Sub
'-------------------------------------------------------------
' function to replace remchar$() LB4.5 function
' This should make this compatible with earlier version of LB
' Code by GaRPMorE in Re: textbox input - numbers only
' in LB Forum Reply #6 on: Apr 22nd, 2016, 7:23pm »
'-------------------------------------------------------------
function num$(d$)
for i=1 to len(d$)
a=asc(mid$(d$,i,1))
if a = 45 and i = 1 or a = 46 or a>47 and a<58 then num$=num$+chr$(a)
next
end function
I have marked the line in the code where the error is reported (Invalid channel at line 72).
I don't seem to be able to get my head around it. Has anybody any ideas?
|
|
Logged
|
|
|
|
Richard Russell
Administrator
member is offline


Posts: 1348
|
 |
Re: Numeric entry into a textbox
« Reply #10 on: May 19th, 2016, 3:41pm » |
|
on May 19th, 2016, 2:01pm, RNBW wrote:| I don't seem to be able to get my head around it. Has anybody any ideas? |
|
I am surprised that this should have given you difficulty. The error occurs in this line:
Code: #controlName$ "!contents? txt$" so it's clear that the variable controlName$ doesn't contain a valid handle. The next step in debugging is to find out what it does contain, which you can easily do either by printing it to the MAINWIN or using the debugger. What you will find is this:
Code:controlName$ = "#main.tb11" Now you can see why the error occurs: there is no control with the handle #main.tb11!
Here is a corrected version of the program which does not raise an error (LBB only of course):
Code: NoMainWin
Row = 3: Col =3
Dim TB$(Row, Col)
WindowWidth = 400
WindowHeight = 200
UpperLeftX=int((DisplayWidth-WindowWidth)/2)
UpperLeftY=int((DisplayHeight-WindowHeight)/2)
bWidth = 100: bHt = 30 'width & height of textboxes
TextboxColor$ = "white"
For i = 1 to Row
For j = 1 to Col
Stylebits #main.tb, _ES_RIGHT, _WS_BORDER, 0, 0
TextBox #main.tb, (bWidth+20)*j - 100, (bHt+10)*i - 15, bWidth, bHt+1
TB$(i,j) = "#main.tb" + str$(i) + str$(j)
maphandle #main.tb, TB$(i,j)
Next
Next
Open "untitled" For Window As #main
#main, "Font Arial 11"
#main "TrapClose Quit"
While Hwnd(#main)
Scan
For i = 1 To Row
For j = 1 to Col
Call checkInput TB$(i,j)
Next j
Next i
CallDLL #kernel32, "Sleep", 300 As long, _
ret As void
Wend
'---------------------------------------------------------------
' Check the characters entered.
'---------------------------------------------------------------
' It does not check for more than one occurence of "."
' or that "." is not the last character.
'---------------------------------------------------------------
Sub checkInput controlName$
#controlName$ "!contents? txt$"
initLen = Len(txt$)
txt$ = num$(txt$)
If Len(txt$) < initLen Then
#controlName$ txt$
handle = Hwnd(#controlName$)
pos = Len(txt$)
CallDLL #user32, "SendMessageA", handle As long, _
_EM_SETSEL As long, _
pos As long, _
pos As long, _
result As void
End If
End Sub
'------------------------
' Close down the program
'------------------------
Sub Quit handle$
Close #handle$
End
End Sub
'-------------------------------------------------------------
' function to replace remchar$() LB4.5 function
' This should make this compatible with earlier version of LB
' Code by GaRPMorE in Re: textbox input - numbers only
' in LB Forum Reply #6 on: Apr 22nd, 2016, 7:23pm »
'-------------------------------------------------------------
function num$(d$)
for i=1 to len(d$)
a=asc(mid$(d$,i,1))
if a = 45 and i = 1 or a = 46 or a>47 and a<58 then num$=num$+chr$(a)
next
end function Richard.
|
|
Logged
|
|
|
|
RNBW
Full Member
member is offline


Gender: 
Posts: 106
|
 |
Re: Numeric entry into a textbox
« Reply #11 on: May 19th, 2016, 4:07pm » |
|
Thank you Richard for the corrected code. I'm afraid the blank look on my face is a bit more frequent these days. I could see what the problem was, the blank bit was nothing happening between the ears to solve it.
I thought I should have maphandle in there, but I didn't need it when I was using just a single dimension array. so I thought I was missing something, which clearly I was.
|
|
Logged
|
|
|
|
Richard Russell
Administrator
member is offline


Posts: 1348
|
 |
Re: Numeric entry into a textbox
« Reply #12 on: May 19th, 2016, 5:18pm » |
|
on May 19th, 2016, 4:07pm, RNBW wrote:| I thought I should have maphandle in there, but I didn't need it when I was using just a single dimension array. |
|
In your 1D version you created the textboxes individually, rather than in a loop (with only three that wasn't too onerous) so you didn't need MAPHANDLE. But with a 2D grid of boxes it's much easier to create them using a nested loop, and increasingly so when the number of rows or columns increases.
As has been discussed here before, as soon as the number of rows and columns exceeds 10 you have to be a bit more careful about constructing the handles. The simple
Code:TB$(i,j) = "#main.tb" + str$(i) + str$(j) won't cut it in that case because (for example) i = 11, j = 1 would give exactly the same handle as i = 1, j = 11!
Richard.
|
|
Logged
|
|
|
|
Richard Russell
Administrator
member is offline


Posts: 1348
|
 |
Re: Numeric entry into a textbox
« Reply #13 on: May 19th, 2016, 8:20pm » |
|
on May 19th, 2016, 5:18pm, Richard Russell wrote:| But with a 2D grid of boxes it's much easier to create them using a nested loop, and increasingly so when the number of rows or columns increases. |
|
This is of course an advantage that LBB has over LB, but it seems that nobody dares mention that at the LB Community Forum, where there is currently a parallel thread (despite it having been stated in the past that such a reference to LBB is allowed).
Richard.
|
|
Logged
|
|
|
|
Rod
Full Member
member is offline


Gender: 
Posts: 110
|
 |
Re: Numeric entry into a textbox
« Reply #14 on: May 20th, 2016, 08:00am » |
|
Just in case it isn't obvious leading zeroes is one solution.
Code:dim TB$(11,11)
j=1
i=11
TB$(i,j) = "#main.tb" + str$(i) + str$(j)
print TB$(i,j)
TB$(i,j) = "#main.tb" + right$("00"+str$(i),2) + right$("00"+str$(j),2)
print TB$(i,j)
|
|
Logged
|
|
|
|
Richard Russell
Administrator
member is offline


Posts: 1348
|
 |
Re: Numeric entry into a textbox
« Reply #15 on: May 20th, 2016, 08:34am » |
|
on May 20th, 2016, 08:00am, Rod wrote:| Just in case it isn't obvious leading zeroes is one solution. |
|
Indeed, or a simple separator character might be even easier:
Code: TB$(i,j) = "#main.tb"; i; "x"; j Richard.
|
|
Logged
|
|
|
|
RNBW
Full Member
member is offline


Gender: 
Posts: 106
|
 |
Re: Numeric entry into a textbox
« Reply #16 on: May 22nd, 2016, 3:28pm » |
|
on May 20th, 2016, 08:34am, Richard Russell wrote:Indeed, or a simple separator character might be even easier:
Code: TB$(i,j) = "#main.tb"; i; "x"; j Richard. |
|
Interesting. I didn't know that you could do that. You could write:
Code:
TB$(i,j) = "#main.tb"; "r"; i; "c"; j
to make it clear the row and column definition.
|
| « Last Edit: May 22nd, 2016, 3:29pm by RNBW » |
Logged
|
|
|
|
Richard Russell
Administrator
member is offline


Posts: 1348
|
 |
Re: Numeric entry into a textbox
« Reply #17 on: May 22nd, 2016, 4:23pm » |
|
User cundo at the LB Community Forum has posted a solution for a grid of textboxes, involving initially creating each one as a separate window (which is the only way you can do it in a loop in LB). Although messy - and slow - compared with the LBB method, it's a workable approach if LB compatibility is essential.
As documented in the Compatibility section of the LBB Help file (subsection 4), a small modification to his code is necessary to make it work in LBB. I've listed the revised program below (it still works in LB 4.5.0):
Code: NoMainWin
WindowWidth = 640
WindowHeight = 480
UpperLeftX=int((DisplayWidth-WindowWidth)/2)
UpperLeftY=int((DisplayHeight-WindowHeight)/2)
stylebits #main, 0, _WS_VISIBLE, 0, 0
Open "Window" for Window_nf as #main
#main "trapclose [quit]"
for y = 1 to 15 ' create the controls
for x= 1 to 6
ctrl=ctrl+1 ' number of controls
textbox #temp.t1,(100*x)-99, (25*y)-24,100,25
stylebits #temp, 0, _WS_VISIBLE, 0, 0
Open "" for Window_popup as #temp
maphandle #temp.t1, "#";ctrl;".t1" ' required for LBB
maphandle #temp, "#";ctrl
next x
next y
for i = 1 to ctrl 'attach the controls to the main handler and show them
h$= "#";i;".t1"
call setParent hWnd(#main) , hWnd(#h$)
call ShowWindow hWnd(#h$), 1
next i
call ShowWindow hWnd(#main), 1
[chkInput]
Timer 0
for u = 1 to ctrl
controlName$="#";u;".t1"
#controlName$ "!contents? txt$"
new$= remchar$(txt$,"abcdefghijklmn�opqrstuvwxyz")
if new$<>txt$ Then
#controlName$ new$
handle = Hwnd(#controlName$)
pos = Len(txt$)
CallDLL #user32, "SendMessageA",_
handle As long, _
_EM_SETSEL As long,_
pos As long,_
pos As long,_
result As void
End if
next
Timer 72, [chkInput]
wait
[quit]
close #main
for i = 1 to ctrl
closeMePlease$ = "#";i
close #closeMePlease$
next
end
sub setParent parent,child
calldll #user32, "SetParent",_
child as ulong,_
parent as ulong,_
r as void
End sub
Sub ShowWindow hWnd, flag
'SW_HIDE = 0
'SW_NORMAL = 1
CallDLL #user32, "ShowWindow",hWnd as uLong, flag As Long, r As void
End Sub
'include lb45func.bas Richard.
|
|
Logged
|
|
|
|
RNBW
Full Member
member is offline


Gender: 
Posts: 106
|
 |
Re: Numeric entry into a textbox
« Reply #18 on: May 23rd, 2016, 10:00am » |
|
To get the stylebits working properly in LBB should the stylebits for the textbox be:
Code:
stylebits #temp.t1, 0, _WS_BORDER, 0, 0
This enables you to get rid of the double border with the textboxes
Code:
textbox #temp.t1,(100*x)-100+50, (25*y)-25+50,100+1,25+1
Whilst the code does enable a grid to be set up in LB, using it with LBB is a bit slow setting up. Also, the fact that a list of 90 textbox controls is set up (1-90) it is not going to be as easy to access the controls as using the grid I have previously set up with RR help where the controls are accessed via row,col.
|
|
Logged
|
|
|
|
Richard Russell
Administrator
member is offline


Posts: 1348
|
 |
Re: Numeric entry into a textbox
« Reply #19 on: May 23rd, 2016, 11:36am » |
|
on May 23rd, 2016, 10:00am, RNBW wrote:| Whilst the code does enable a grid to be set up in LB, using it with LBB is a bit slow setting up. |
|
It's quite slow in both LB and LBB, because it involves creating such a lot of windows. Maybe it's a little slower in LBB, because window creation is not normally on the critical path so has not been optimised. But either way if the time taken to create all those windows is an issue you could in many circumstances display a screen with instructions, or a dialog box requesting some input from the user, or just a logo, in order for that time not to be so noticeable.
After all it's only something you ever have to do once, sometime during program initialisation. You don't need to wait until the 'grid' is required before creating it, when the delay might indeed be more irritating. I often see programs that close and then reopen windows, when they could much more quickly hide and then re-show them.
Quote:| Also, the fact that a list of 90 textbox controls is set up (1-90) it is not going to be as easy to access the controls as using the grid I have previously set up with RR help where the controls are accessed via row,col. |
|
That's completely unrelated to the method used. Whether you create the boxes using LBB's nicer method or using cundo's method to achieve LB compatibility, it's entirely up to you whether you name the handles by a single value 1-90 or by row and column.
Strangely I find myself having to defend LB against unfair criticism in this case!
Richard.
|
|
Logged
|
|
|
|
RNBW
Full Member
member is offline


Gender: 
Posts: 106
|
 |
Re: Numeric entry into a textbox
« Reply #20 on: May 23rd, 2016, 1:31pm » |
|
I was not critising the code. I was making observations. I think the code is quite clever and gets over the problem of setting up a grid of textboxes in LB. However, I would suggest that accessing the textboxes via a row/col method is easier (and I think clearer) than trying to deal with a 90 item list of controls. It does mean that you'll have to set up the handles to deal with it.
In respect of speed; in this instance I found that the grid was displayed almost instantly in LB, whereas in LBB it could be seen building up a line of textboxes at a time before finally displaying the whole grid. As you say this can be overcome by creating the grid in the background, before displaying it.
Personally, I wouldn't use this method in LBB, because the grid solution that you came up with for me some time ago it's a much easier system to use.
|
|
Logged
|
|
|
|
|