-------------------------------------------------
                      VFP 9.0 FIX - ACCESS AND ASSIGN METHODS
                                 January 2017
                 -------------------------------------------------
                                    CCB



1. BUG:

     In vfp9, we can use the Access and Assign methods to execute code when querying or changing property values,
     but when SET("STATUS BAR")="OFF" and SET("TALK")="ON", sometimes VFP will crash.

     1, There is a program for test:

     *PROC testaccessandassign

     SET STEP OFF
     SET ECHO OFF
     SET DEBUG OFF
     SET ESCAPE OFF
     SET TALK OFF
     SET SAFETY OFF

     _SCREEN.VISIBLE=.T.
     _SCREEN.WINDOWSTATE=2

     CLOSE DATABASES ALL
     CLOSE TABLES ALL

     SET STATUS BAR OFF
     SET TALK ON
     DO FORM testaccessandassign.scx

     CLOSE DATABASES ALL
     CLOSE TABLES ALL

     RETURN

     * END OF PROC TESTACCESSANDASSIGN.


     2, In the file testaccessandassign.scx:

     PROCEDURE olabel_access
     *To do: Modify this routine for the Access method
     IF TYPE("THIS.olabel")#"O"
        SET STATUS BAR OFF
        SET TALK ON
        WAIT WIND 'SET("STATUS BAR") = '+SET("STATUS BAR")
        WAIT WIND 'SET("TALK") = '+SET("TALK")
        THIS.olabel=THISFORM.label1
        WAIT WIND 'SET("STATUS BAR") = '+SET("STATUS BAR")
        WAIT WIND 'SET("TALK") = '+SET("TALK")
     ENDI
     RETURN THIS.olabel

     If we set the olabel property to a Logical data (or a Numeric data) in the Form Designer:
     olabel = .F.
     there is no problem.

     But if we set the olabel property to a Character data in the Form Designer:
     olabel = "aaa"
     after vfp run the code:
     THIS.olabel=THISFORM.label1
     VFP will crash.


     3, In the file Samples\chartssample_builder.scx of the FoxCharts v1.20:

     PROCEDURE ofoxcharts_access
     * Make sure we have a FoxCharts object
     IF VARTYPE(This.oFoxcharts) <> "O"
        This.oFoxcharts = EVALUATE(This.oFoxCharts)
     ENDIF
     RETURN This.oFoxcharts

     If we set the ofoxcharts property to a Character data in the Form Designer:
     ofoxcharts = "Thisform.FoxCharts1"
     after vfp run the code:
     This.oFoxcharts = EVALUATE(This.oFoxCharts)
     VFP will crash.

     There is no the PROCEDURE ofoxcharts_access in the FoxCharts v1.37b,
     so there is no the problem in the FoxCharts v1.37b.


2. CAUSE:

     There are some BUGs in the following code.


3. RESOLUTION:

     We can write some code to fix the BUG.

     Fun53cefe :: ; proc near
             cmp  byte ptr [esi] , 076h                                      ;0x0053cefe :        803e76
             je Label58d91f                                                  ;0x0053cf01 :        0f84180a0500

     Label53cf07 ::
             mov  ecx , dword ptr [ esi + 32 ]                               ;0x0053cf07 :        8b4e20
             test ecx , ecx                                                  ;0x0053cf0a :        85c9
             mov  byte ptr [esi] , 049h                                      ;0x0053cf0c :        c60649
             jne Label529447                                                 ;0x0053cf0f :        0f8532c5feff

     Label53cf15 ::
             mov  ecx , dword ptr [ esi + 36 ]                               ;0x0053cf15 :        8b4e24
             test ecx , ecx                                                  ;0x0053cf18 :        85c9
             jne Label5028ea                                                 ;0x0053cf1a :        0f85ca59fcff

     Label53cf20 ::
             mov  eax , dword ptr [ esi + 40 ]                               ;0x0053cf20 :        8b4628
             test eax , eax                                                  ;0x0053cf23 :        85c0
             jne Label58d92e                                                 ;0x0053cf25 :        0f85030a0500
             ret                                                             ;0x0053cf2b :        c3

     Label529447 ::


     ;
     ;                 -------------------------------------------------
     ;                      VFP 9.0 FIX - ACCESS AND ASSIGN METHODS
     ;                                 December 2014
     ;                 -------------------------------------------------
     ;                                     CCB
     ;
     ; Use the Access and Assign methods when SET("STATUS BAR")="OFF" and SET("TALK")="ON", sometimes VFP will crash.
     ;
     ; 2014/12/7, by ccb
     ;

             mov  ecx , dword ptr [ esi + 32 ]
             mov eax,dword ptr [ecx]
             sub eax,08h
             push dword ptr [eax+04h]
             push eax
             call IsBadReadPtr
             test eax,eax
             jne Label52944c
             mov  ecx , dword ptr [ esi + 32 ]


             call Fun42c1e2                                                  ;0x00529447 :        e8962df0ff

     Label52944c ::
             mov  dword ptr [ esi + 32 ] , 00h                               ;0x0052944c :        c7462000000000
             jmp Label53cf15                                                 ;0x00529453 :        e9bd3a0100


4. APPLIES TO:

     VFP 6.0.8167.0
     VFP 6.0.8961.0 (SP5)

     VFP 7.0.0.9262
     VFP 7.0.0.9465 (SP1)

     VFP 8.0.0.2521
     VFP 8.0.0.3117 (SP1)

     VFP 9.0.0.2412
     VFP 9.0.0.3504 (SP1)
     VFP 9.0.0.4611 (SP2)
     VFP 9.0.0.5015 (SP2)
     VFP 9.0.0.5411 (SP2)
     VFP 9.0.0.5721 (SP2)
     VFP 9.0.0.5815 (SP2)
     VFP 9.0.0.6303 (SP2)
     VFP 9.0.0.6602 (SP2)
     VFP 9.0.0.7423 (SP2)

     The bug has been fixed in VFP Advanced.


5. REFERENCE WEBSITES:

     1, baiyujia.com:
     http://www.baiyujia.com

     2, foxite.com:
     http://www.foxite.com/archives/vfp-c-compiler-and-app-0000362799.htm

     3, codeplex.com:
     http://vfpx.codeplex.com/wikipage?title=FoxCharts#


6. OTHER:

     For reference only, there is no guarantees.

     Any questions or suggestions, please e-mail to ccb2000@163.com.