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
Last edited by MartinLiss; Apr 3rd, 2009 at 12:03 PM.
Reason: Updated project files
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
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?
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!
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.
Re: VB - An ActiveX control which restricts a textbox to numbers
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?
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
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
Nice. Does it fix the paste problem?
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
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
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!