The concept of missing values, nulls and so on is a basic issue for any computing, and making assumptions is what gets people into trouble. The basic idea of a "type" is a set of allowed values and a set of processing methods that are associated with that domain. Data validation simple means enforcing the domain of that type, and restricting processing to the allowed operations. So boolean for example has a set of values True and false, and a set of operations AND OR NOT etc. This type definition is the "meaning" of that dats, the "semantics" of the type.
So the concept of data outside of that type is not an issue for type validation, it is outside of the type. When a data value is not provided, like a missing value in databases, that is additional "semantics". Additional meaning. But there are an infinite range of possible meanings for missing values, such as "not known", "known but not available", "I reserve the right not to tell you", "not available", "not relevant", "I will put it in later" and so on.
Now in data entry situations it may be a business requirement that a user provide a value for a field. That is what I mean by a required field. The opposite is an optional field, where programmer provides a blank field an the user does not have to enter a value. So a required field is one that cannot be left blank. It is not actually boolean logic either, this is the modal logic of what is "necessary" and "possible", and actually has nothing to do with type validation. It is a separate layer of meta-logic in fact.
Not understanding these issues clearly is what gets things into a muddle, and that is what has happened with the Spin Edit control. The control is set up by default to require a value from the user, it is a bloody mindedness of the control itself, and nothing to do with either type validation or business requirements. So that means you can only use the control in situations that require a value anyhow.
So I am not proposing that it ever provides a null as its value, I am only concerned with the strange behaviour that causes it to pull a digit from its previous value when the user enters invalid input. I am mostly interested whether anybody else thinks that this particular fallback behaviour is reasonable or not, and what would be the best way to provide some additional functionality so that this particular behaviour can be intercepted.