Bug: a readonly left-aligned textbox has a floating point number whose value changes

Here’s an interesting bug report. The code below shows two readonly textboxes on a form, both containing floating point values. The first is left-aligned.

When you hit tab from the first textbox, the value changes from 4.011 to 4.000

If you change the Alignment to Right (1) then it works as expected.

Possible alignment property values:

0 = Left

1 = Right

2 = Center

3 = Automatic (Default)

When you tab off the textbox, VFP is trying to match “4.011 ” (trailing spaces) with the default input mask “#######.###” which was set when the value was set.

Since the second character is the decimal place, which does not match the second “#”, the matching stops.

When the value is right aligned, then the textbox has “ 4.011“ (leading spaces) which VFP tries to match with “#######.###” which does not stop prematurely.

When it’s not readonly, then the value is “ 4.011 “ (leading and trailing spaces), which matches the mask.

=== STEPS TO REPRO ===

1. Run code below.

2. Press TAB to move focus from 1st TextBox while watching it's value

OBSERVED: Value in TEXT1 goes from 4.011 to 4.000

EXPECTED: Value in TEXT1 to not change.

COMMENTS: Setting the ALIGNMENT of TEXT1 = 1 or 3, *OR* setting it's READONLY = .F. causes EXPECTED results.

#DEFINE TXT_ALIGN 0

PUBLIC oform1

oform1=NEWOBJECT("form1")

oform1.SHOW

RETURN

DEFINE CLASS form1 AS FORM

      NAME = "Form1"

      ADD OBJECT text1 AS TEXTBOX WITH ;

            ALIGNMENT = TXT_ALIGN, ;

            HEIGHT = 23, LEFT = 108, ;

            READONLY = .T., TOP = 60, ;

            WIDTH = 100, NAME = "Text1"

      ADD OBJECT text2 AS TEXTBOX WITH ;

            ALIGNMENT = 3, HEIGHT = 23, ;

            LEFT = 108, READONLY = .T., ;

            TOP = 96, WIDTH = 100, ;

            NAME = "Text2"

      PROCEDURE INIT

            THIS.text1.VALUE = 4.011

            THIS.text2.VALUE = 4.01001

      ENDPROC

ENDDEFINE