Textfield: Limit input to numbers only?

BlitzMax Forums/BlitzMax Beginners Area/Textfield: Limit input to numbers only?

Hi!

Is there an easy way to let the user only enter numbers ranging from "0..9" into this 3 digits textfield with all other chars not being accepted at all?

SuperStrict 

Local window:TGadget
Local tf:TGadget

window: TGadget=CreateWindow("My Window",30,20,320,200)

tf:TGadget=CreateTextField(4,4,28,20,window)

While WaitEvent()
	Select EventID()
	Case EVENT_GADGETACTION
		Select EventSource()
			Case tf
				Print "textfield updated"
				If Len(TextFieldText(tf)) >3 Then SetGadgetText(tf,"") 
 		End Select
	Case EVENT_WINDOWCLOSE
		End
	End Select
Wend


I'm at work, so this is from memory, but I'm sure there's a way to add a "FilterKey" function to any gadget. You could use this to mask out any non-numerics.

Very quick...
If Not Int(TextFieldText(TF)) Print "Not integers"
<edit> Hmm works unless the first char is an int.

Something bullet-proof would be nice.

Couldn't find something on setting a filter. But if this is possible, this SHOULD be in the docs.

SuperStrict 

Local window:TGadget
Local tf:TGadget

window: TGadget=CreateWindow("My Window",30,20,320,200)

tf:TGadget=CreateTextField(4,4,28,20,window)

While WaitEvent()
	Select EventID()
	Case EVENT_GADGETACTION
		Select EventSource()
			Case tf
			 If Not Int(Right(TextFieldText(tf) , 1) ) 
					Print "Non integer entered"
					SetGadgetText(Tf,Left(TextFieldText(tf) , Len(TextFieldText(tf)) - 1))
				EndIf
				Print "textfield updated"
				If Len(TextFieldText(tf)) >3 Then SetGadgetText(tf,"") 
 		End Select
	Case EVENT_WINDOWCLOSE
		End
	End Select
Wend


My doc has an entry for SetGadgetFilter.
Here's a quick example...
SuperStrict 

Local window:TGadget
Local tf:TGadget

window: TGadget=CreateWindow("My Window",30,20,320,200)

tf:TGadget=CreateTextField(4,4,28,20,window)
SetGadgetFilter tf,filter




Function filter:Int(event:TEvent,context:Object)
	Select event.id
		Case EVENT_KEYDOWN
			Print "filtering non-integer:"+event.data+","+event.mods
			If event.data > 57 Or event.data < 48 Return 0
		Case EVENT_KEYCHAR
			Print "filtering charkey:"+event.data+","+event.mods
			If event.data > 57 Or event.data < 48 Return 0
		End Select
	Return 1
End Function

While WaitEvent()
	Select EventID()
		Case EVENT_WINDOWCLOSE
			End
		Case EVENT_GADGETACTION
		Select EventSource()
			Case tf
				If Len(TextFieldText(tf)) >3 Then SetGadgetText(tf,"") 
 		End Select

	End Select
Wend



Let me know when you want your tea stirring.

Thanks for the try Tony. It's not as easy as it may look like.
Your code fails when entering "10" or "100".

SetGadgetfilter... *gets a headache when trying to understand the docs explanation

Would be nice to add this to "Createtextfield" (docs):
"Also see: SetGadgetText and TextFieldText and SetGadgetfilter"

For the filter example:

Backspace should work and "013", "000" and such inputs should also be impossible...

Backspace=Ascii value? *thinking

You're spending 5-10 mins before saying "It doesn't do x and y!"
Can't you take this as examples and see whether you can expand them to work the way you want?

SuperStrict 

Local window:TGadget
Local tf:TGadget

window: TGadget=CreateWindow("My Window",30,20,320,200)

tf:TGadget=CreateTextField(4,4,28,20,window)

While WaitEvent()
	Select EventID()
	Case EVENT_GADGETACTION
		Select EventSource()
			Case tf
			 If Not Int(Right(TextFieldText(tf) , 1) ) And Right(TextFieldText(tf) , 1)<>"0"
					Print "Non integer entered"
					SetGadgetText(Tf,Left(TextFieldText(tf) , Len(TextFieldText(tf)) - 1))
				EndIf
				Print "textfield updated"
				If Len(TextFieldText(tf)) >3 Then SetGadgetText(tf,"") 
 		End Select
	Case EVENT_WINDOWCLOSE
		End
	End Select
Wend

And SetGadgetFilter with backspace and <edit> leading zero not allowed...
SuperStrict 

Local window:TGadget
Local tf:TGadget

window: TGadget=CreateWindow("My Window",30,20,320,200)

tf:TGadget=CreateTextField(4,4,28,20,window)
SetGadgetFilter tf,filter




Function filter:Int(event:TEvent , context:Object)
	Local error:Int=1
	Select event.id
		Case EVENT_KEYDOWN
			Print "filtering non-integer:"+event.data+","+event.mods
			If event.data > 57 Or event.data < 48 error = 0
			If event.data = KEY_BACKSPACE error =1
		Case EVENT_KEYCHAR
			Print "filtering charkey:" + event.data + "," + event.mods
			If event.data > 57 Or event.data < 48 error = 0
			If event.data = KEY_BACKSPACE error =1
		
		End Select
	Return error
End Function

While WaitEvent()
	Select EventID()
		Case EVENT_WINDOWCLOSE
			End
		Case EVENT_GADGETACTION
		Select EventSource()
			Case tf
				 If Len(TextFieldText(tf))>1 And Left(TextFieldText(tf) , 1)="0"
					Print "Leading zero not allowed"
					SetGadgetText(Tf,Left(TextFieldText(tf) , Len(TextFieldText(tf)) - 2))
				EndIf

				If Len(TextFieldText(tf)) >3 Then SetGadgetText(tf,"") 
 		End Select

	End Select
Wend


Much appreciated. Thank you Tony!

Np, I've altered it to not accept a leading zero.
You can enter '0' on it's own but not '00' or '03' etc.

If it was going to be a built in command, it should allow all mathimatical Chars. That is, in a situatuton were we wanted more then the three didgits here, the user should, (Well the programmer should have the chosse really), be able to enter, (For example), 46*33/2

The reason I say this, is that I hate having to go to a calculator, just because, (For example), I cannot remember what 17.5% of 342 is

I Know this is not what you are talking about here, but it seemed a point worth raising.

@tonyg,

Ahhhh, When you tie their shoe laces, they still expect their socks washing ;)