Just to summarize: There are three buffers for each control. Each holds the control's value at a point in time.
1. OldValue - for a new record this is null. For an existing record, it holds the value that is saved in the table - which may be null.
2. Text - this captures each character as it is typed. The OnChange event runs each time a new character is typed giving you an opportunity to validate character by character. An example might be to limit the typing to x characters or to auto tab after x characters have been entered. This property is only accessible while focus remains in the control. Once focus moves to a different control, you can no longer reference the .Text property of the previous control. You will get a runtime error.
3. Value - As focus leaves the control, the contents of .Text are copied to .Value and trimmed if extra space characters are present.
Between the Form's BeforeUpdate and AfterUpdate events, the contents of dirty controls are moved from the .Value to the .OldValue buffer because now the record has been saved and so the .OldValue has the updated value and will always = the .Value property