-
1 Attachment(s)
VB - An ActiveX control which restricts a textbox to numbers
The attached control is a modified TextBox which restricts the user to numbers. The control also has these additional properties:
CanHaveDecimals - A Boolean property that determines if the number can have decimals
CanBeNegative - A Boolean property that determines if the number can be negative
MaxDecimals - Allows the maximum number of decimals to be set
MinValue - Allows the minimum value to be set
MaxValue - Allows the maximum value to be set
DecimalSeparator - Determines which character ("." or ",") is used as the decimal separator
RequireLeadingDigit (New) - Determines if at least one digit must preceed the decimal separator.
The code for the control is included in the zip file.
NOTES:
- Version 1.1: Updated to include most of the normal properties associated with a textbox. Also includes the bug fix provided by dee-u.
- Version 1.2: Add Click event
- Version 1.3: Add SelStart, SelLen and SelText properties
- Version 1.4: Corrected implementation of SelStart, SelLen and SelText and also added several other properties
- Version 1.5: Changed the names of the NumberBoxClick and NumberBoxKeyPress events to Click and KeyPress. Added KeyUp, KeyDown and Change events, and corrected DblClick event
- Version 1.6: 12/02/2006 Corrected KeyUp, KeyDown, and KeyPress properties by adding standard parameters
- Version 1.7: 02/07/2007 Added Enums for Alignment and BorderStyle properties. Corrected problem where numberbox behaved as if it was locked when data with decimal points was added, and added protection against pasting in invalid characters (which I thought it already had)
- Version 1.8: 02/07/2007 Added support for paste via ctrl-V and allow for an almost unlimited number of decimals
- Version 1.9: 06/11/2007 Added MinValue and MaxValue properties
- Version 1.10: 02/27/2008 Added DecimalSeparator property. Also fixed a bug which occurred when more than the allowed number of decimals was entered
- Version 1.11: 03/14/2008 Changed code so that an attempt to add a second decimal separator is ignored rather than causing the first one to be removed. Corrected bug where adding a decimal separator to a negative number would cause one too few decimal places to be shown.
- Version 1.12: 04/25/2008 Corrected MaxValue and MinValue processing when comma is the decimal separator. Changed the Appearance property values so that they display Flat and 3D like the normal textbox rather than 0 and 1
- Version 1.13: 05/02/2008
- Corrected MinValue and MaxValue processing so that the entry of a minus sign doesn't result in a type mismatch error.
- Changed MinValue and MaxValue processing so that if a change would violate either limit, the old value is restored rather than changing it to the MinValue or MaxValue.
- Corrected spelling of DecimalSeparator property.
- Added a Test project for those who might want to debug my code.
- Version 1.14: 10/20/2008
- Made .text the default property.
- Added categories to properties
- Version 1.15: 03/29/2009 Corrected problem where previously if you had a number that contained a decimal separator, and you selected the number with the intention of entering a new number that started with a decimal separator, the entry of the decimal separator was not allowed because it was assumed you were trying to add a second decimal separator.
- Version 1.16: 04/03/2009
- Added RequireLeadingDigit property. For example .15 would be changed to 0.15 if set to True.
- Removed MaxLength and PasswordChar properties
- Changed behavior where if number was greater than the MaxValue or less than the MinValue it dropped the last digit. New behavior changes the value to MaxValue or MinValue as appropriate.
KNOWN PROBLEMS: None
-
1 Attachment(s)
Re: VB - An ActiveX control which restricts a textbox to numbers
I fixed a small flaw in the above project, here is the updated version...
[Edited by MartinLiss]dee-u's code is now out of date.
-
Re: VB - An ActiveX control which restricts a textbox to numbers
Heyy i found something interesting .Maybe this can reduce the size of the code in some way
VB Code:
//module
Public Const GWL_STYLE = (-16)
' Restricts input to the edit control to digits only
Public Const ES_NUMBER = &H2000
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
(ByVal hwnd As Long, ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
(ByVal hwnd As Long, ByVal nIndex As Long) As Long
//end module
form code
VB Code:
Private Sub Form_Load()
SetWindowLong Text1.hwnd, GWL_STYLE, _
GetWindowLong(Text1.hwnd, GWL_STYLE) Or _
ES_NUMBER
End Sub
-
Re: VB - An ActiveX control which restricts a textbox to numbers
I updated the zip file above with code that includes a Click event. If you need any other events you can look for the two changes that I made (marked by "' new") for the Click event.
-
Re: VB - An ActiveX control which restricts a textbox to numbers
-
Re: VB - An ActiveX control which restricts a textbox to numbers
Zip file updated again - sorry.
-
Re: VB - An ActiveX control which restricts a textbox to numbers
-
Re: VB - An ActiveX control which restricts a textbox to numbers
i need the last version of the numberbox for excel 2003, and the instructions how to install it.
thanks
-
Re: VB - An ActiveX control which restricts a textbox to numbers
Quote:
Originally Posted by mkkmkk
i need the last version of the numberbox for excel 2003, and the instructions how to install it.
thanks
Sorry but my ocx has nothing to do with excel.
-
Re: VB - An ActiveX control which restricts a textbox to numbers
-
Re: VB - An ActiveX control which restricts a textbox to numbers
thanks, why doesn´t work in a form of excel?
-
Re: VB - An ActiveX control which restricts a textbox to numbers
-
Re: VB - An ActiveX control which restricts a textbox to numbers
I tried out V 1.7 in my 'Numbers To English' program (in [RESOLVED] VB6/ Number to Words / 66 digits) . It works very well (good job!) except the limit on digits to the right of the decimal point. In theory, the number of digits (to the right) could be the maximum the textbox will take (in theory!). I'm sure it won't often happen.
But sometimes, in 'normal' apps, the number of decimal digits will not be know at design time.
Is there a reason you are limiting decimals to a defined design-time value? If so, would I need to add one more allowable decimal digit each time the user adds one to the control? Is there a point at which it'll blow up?
Either way, it seems like a lot of overhead.
Also, the paste-into fuctionality isn't working :(
-
Re: VB - An ActiveX control which restricts a textbox to numbers
I'm not limiting the decimals. I believe you over looked the MaxDecimals property. I'll look into the paste problem, thanks.
-
Re: VB - An ActiveX control which restricts a textbox to numbers
Setting the MaxDecimals property is, well, setting the maximum number of decimals. The object is to NOT set a maximum number of decimals and allowing the user to enter them to his/her heart's content!
Did I miss something? :confused:
-
Re: VB - An ActiveX control which restricts a textbox to numbers
I like the decimal restriction. My nbrboxes are too small to have the user going overboard on decimal places. I've also an whole upper number limit so that the number is never greater than the nbrbox size.
It is a user input box and I doubt that anyone will spend time adding or pasting in more than 9,999 decimal places. A numberbox that is 10,000 characters would also need to be pretty big.
If you are writing to the nbrbox round the number to 9,999th decimal place or there abouts.
-
Re: VB - An ActiveX control which restricts a textbox to numbers
You're probably right. I doubt it will ever be a problem
The textbox maxes out at 65,535 (me thinks, though some sources say 32,000) characters. 10,000 isn't bad. I suppose, all things considered, that's a fair limit.
I'm really amazed this hadn't been done defore. Is seems so obvious in hind-sight. I'm certain it'll be used far & wide.
Nicely done.
Just-a-waiting on that paste thing ( :D ) ...
-
Re: VB - An ActiveX control which restricts a textbox to numbers
About the max limit of chars to a textbox: Here is the word from the Power-That-Is (Microsoft):
"The Text setting for a TextBox control is limited to 2048 characters unless the MultiLine property is True, in which case the limit is about 32K." *
About? What's THAT mean? :confused:
* http://msdn.microsoft.com/library/de.../vbprotext.asp
-
Re: VB - An ActiveX control which restricts a textbox to numbers
Quote:
Originally Posted by rjbudz
Setting the MaxDecimals property is, well, setting the maximum number of decimals. The object is to NOT set a maximum number of decimals and allowing the user to enter them to his/her heart's content!
Did I miss something? :confused:
Okay I think I misunderstood you. I felt I was not limiting it because you can use the MaxDecimals in the IDE or in code to increase the maximum, but now I see that you don't want even that "restriction". I will try to change it so that it can be unlimited by default.
-
Re: VB - An ActiveX control which restricts a textbox to numbers
The tricky part will be how to set MaxDecimals to infinity. Setting to zero means no decimals.
-
Re: VB - An ActiveX control which restricts a textbox to numbers
I will try blank to indicate no limit.
-
Re: VB - An ActiveX control which restricts a textbox to numbers
Yeah, that's how Index is done. In leu of that (in case you're using Integer or Long) you could do the TabStop (True/False) and TabIndex (numeric).
-
Re: VB - An ActiveX control which restricts a textbox to numbers
Quote:
Originally Posted by rjbudz
...In leu of that (in case you're using Integer or Long) you could do the TabStop (True/False) and TabIndex (numeric).
I'm not sure what you mean by that. Is there something wrong with those two properties of my control?
-
Re: VB - An ActiveX control which restricts a textbox to numbers
:) No, don't worry. I was just suggesting how you might implement the infinite decimal allowance part of your control.
Just trying to be of assistance. There's nothing wrong.
-
Re: VB - An ActiveX control which restricts a textbox to numbers
Right now I have it working in my copy this way. If you blank out the MaxDecimals it changes it to 9999. Is that acceptable?
-
Re: VB - An ActiveX control which restricts a textbox to numbers
Sure, but I could set MaxDecimal to 9999 anyway, hence the added code to automatically set it to 9999 isn't really neccessary.
So, the short answer is: If infinity is out of the question, just leave is the way it is in the last release. As you've written it, any value entered in excess of 9999 automatically sets the vale to it (9999), as would be expected.
My intent isn't to get you to re-write it for my benefit. I like it just fine (except for the paste-thing :) ) I just suggested ASSUMED infinity for decimals.
-
Re: VB - An ActiveX control which restricts a textbox to numbers
-
Re: VB - An ActiveX control which restricts a textbox to numbers
Nice. Does it fix the paste problem? :D
And, oh BTW, I couldn't let the textbox limit ambiguity rest ('tis my nature), so I tested it with a single line and multi-line textbox. It took overnight to run, the multi-line textbox seemed to take longer and longer to calculate textbox2 = textbox2 & "X". Textbox1 (single line) didn't seem to take longer. (No I'm not going to run timers!)
Anyway, both textboxes max out at 65,535. This is in direct contrast to what Microsoft stated. Also, there is no error message when the max is reached. Instead it just doesn't add anymore chars (as opposed to dropping off the first ones to accommodate the last).
I know everyone is going to sleep better knowing this! :)
-
Re: VB - An ActiveX control which restricts a textbox to numbers
Quote:
Originally Posted by rjbudz
Nice. Does it fix the paste problem? ....
If you mean can you now paste via ctrl-v then yes. If you mean something else then please let me know.
-
Re: VB - An ActiveX control which restricts a textbox to numbers
Nope. That is what I meant. I rate Excellent! Thank you!
-
Re: VB - An ActiveX control which restricts a textbox to numbers
Hi again.
I noticed that if a user enters a second decimal point, the first decimal point disappears.
The user will probably not notice this event (I didn't) and will continue to happily enter numbers, and then click the ‘Go’ button. The result: Instead of entering 3.1415926535, he/she will have entered 314159265.35, and obtain somewhat different results than expected.
You may want to notify the user that a second decimal point has been entered. Ignoring the second one (the same way the control ignores non-numeric chars) won't work as the user may have made the mistake when entering the first one.
-
Re: VB - An ActiveX control which restricts a textbox to numbers
Quote:
Originally Posted by rjbudz
Hi again.
I noticed that if a user enters a second decimal point, the first decimal point disappears.
The user will probably not notice this event (I didn't) and will continue to happily enter numbers, and then click the ‘Go’ button. The result: Instead of entering 3.1415926535, he/she will have entered 314159265.35, and obtain somewhat different results than expected.
You may want to notify the user that a second decimal point has been entered. Ignoring the second one (the same way the control ignores non-numeric chars) won't work as the user may have made the mistake when entering the first one.
I see what you are saying but there are a lot of possible mistakes and I think the user would find it annoying to be notified of each one.
-
Re: VB - An ActiveX control which restricts a textbox to numbers
I suppose it's a matter of opinion.
I think entering a value of 3.1415926535 and having 314159265.35 entered instead would be far worse than asking if this is what the user intended. Entering two decimal points IS a mistake. To have the control decide the correct course of action (eliminate the first one) is presumptuous.
Users don't always recheck values they've entered, more so in this case because he/she knows non-numeric values will be ignored. Not advising of a gross error defeats the purpose (MHO).
The vast majority of mistakes a user can make (I can’t think of any others you haven’t anticipated) using this control have been eliminated. That's what makes it so useful in the first place!
-
Re: VB - An ActiveX control which restricts a textbox to numbers
Okay let me think about it.
-
Re: VB - An ActiveX control which restricts a textbox to numbers
sgrya1 makes a valid point regarding the second decimal point. I think that is probably the way to go with it (again, MHO).
-
Re: VB - An ActiveX control which restricts a textbox to numbers
Quote:
Originally Posted by rjbudz
sgrya1 makes a valid point regarding the second decimal point. I think that is probably the way to go with it (again, MHO).
I agree and I'll make the change in the next release.
-
Re: VB - An ActiveX control which restricts a textbox to numbers
Here's the code that does it from Calculator.zip:
VB Code:
Private Sub ButtonDecPoint_Click()
If bError = False Then
If iCurrentRadix = DECNUM Then
If bEntered = False Then ' Start of New Number
bEntered = True
OutputWindow.Text = "."
Else ' Append
If InStr(OutputWindow.Text, ".") = 0 Then ' Make Sure Only 1 Decimal Point
OutputWindow.Text = OutputWindow.Text + "."
End If
End If
End If
End If
OutputWindow.SetFocus
End Sub
-
Re: VB - An ActiveX control which restricts a textbox to numbers
In particular:
VB Code:
If InStr(OutputWindow.Text, ".") = 0 Then ' Make Sure Only 1 Decimal Point
OutputWindow.Text = OutputWindow.Text + "."
End If
-
Re: VB - An ActiveX control which restricts a textbox to numbers
Of course. I included the entire method to make it easier to find and understand its use! :)
-
Re: VB - An ActiveX control which restricts a textbox to numbers
Updated to Version 1.9. Note that no change was made to the way a second decimal point is handled.