I hope it is a useful contribution.
Code: Select all
'==============================================
' Numeric entry into a textbox.
' This permits the entry of numbers including
' "-" and ".". It also prevents more than one
' "-" and "." from being entered.
' Filename: NumericInputInTextboxByChar_8
'--------------------------------------------------------------------------------'==============================================
nomainwin
Stylebits #main.textbox, _ES_RIGHT, _WS_BORDER, 0, 0
textbox #main.textbox, 10, 50, 150, 25
WindowWidth = 350
WindowHeight = 150
open "Filtered Numeric Input" for window as #main
print #main, "Font Arial 12 Bold"
#main.textbox "!contents? txt$"
#main.textbox "!setfocus"
#main "trapclose [quit]"
[CheckInput]
timer 0
#main.textbox "!contents? txt$" 'text in textbox
oldtxt$ = txt$ ' make text the oldtext
txt$ = num$(txt$) ' gets new text from function num$(text$) which does the checking
if oldtxt$ <> txt$ then
#main.textbox txt$ ' if old text is not the same as the new text then use new text
handle = hWnd(#main.textbox) ' get the handle of the textbox
pos = len(txt$) ' position of character is the length of the current text
calldll #user32, "SendMessageA", _ ' call EM_SETSEL
handle as ulong, _
_EM_SETSEL as long, _
pos as long, _
pos as long, _
result as void
end if
timer 5, [CheckInput] ' short delay then last char is deleted if not 0-9, - or .
wait ' wait for event
' Function to check that character input is 0-9, - or .
function num$(d$)
t = 0
maxNumChars = 12
for i=1 to maxNumChars 'input of characters will stop at 12 (including 0-9, - and .
a=asc(mid$(d$,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 num$ = "0" + num$
if (a = 45) or (a = 46) or (a>47 and a<58) then num$=num$+chr$(a)
next
a=asc(mid$(d$,1,1))
if a = 45 and mid$(d$,2,1) = "." then num$ = "-0" + num$
end function
[quit]
close #main ' close window
end