BUG: Using Class With Reserved Custom Property Name Gives Error

ID: Q195406


The information in this article applies to:
  • Microsoft Visual FoxPro for Windows, version 6.0


SYMPTOMS

If you create a class in Visual FoxPro 3.0 or 5.0 with a custom property and you add an intrinsic property in Visual FoxPro 6.0, when you modify the class or a form which contains an instance of the class in Visual FoxPro 6.0, you receive the following error(s) when the form or class is not opened in the Designer:

Syntax error.
-or-
Unknown error code -5.
You may also see the following error when the form or class is open in the Designer:
Data type is invalid for this property.


CAUSE

Visual FoxPro 6.0 adds several new properties to the Visual FoxPro base classes. The visual class you are attempting to use has a custom property with the same name as one of these new base class properties and the data type for this property is incorrect or cannot be determined.

Intrinsic property names are reserved words. Avoid using reserved words for property names, especially if the reserved word is already used as a property name for some other base classes because the results may be unpredictable.


RESOLUTION

  • Modify the class in the previous version of Visual FoxPro, and remove the custom property from the class or set it to a value other than (None), some text, .F./.T., or a numeric value.


  • -or-

  • Edit the .vcx file directly and change the property value there.


Please refer to the MORE INFORMATION section of this document for details.


STATUS

Microsoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article.


MORE INFORMATION

In Visual FoxPro 5.0 and earlier, several base class objects such as pageframe, container, and custom did not have some properties such as Tag or Comment. These properties were added in Visual FoxPro 6.0.

NOTE: Please see the Visual FoxPro 6.0 Help topic, "New and Enhanced Language Elements" and scroll down to the "Enhanced language elements" section for details on which objects have had properties added.

Steps to Reproduce Behavior

  1. Run the following code from a program (.prg) file in Visual FoxPro 3.0 or Visual FoxPro 5.0. This creates the class automatically. However, the results are the same if you create the class manually through the Class Designer.
    
          CLOSE ALL
          CLEAR ALL
          DELETE FILE testlib.vc?
    
          * Allows us to be sure the Class Designer window is active.
          ON KEY LABEL ctrl+f8 ACTI WINDOW 'class designer'
    
          * Our property will be Tag.
          lcPropName = 'tag'
    
          * Put property name in clipboard.
          _CLIPTEXT = lcPropName
    
          * Open Add Property dialog box and past in clipboard contents,
          * then activate Class Designer window, and close and save it.
          KEYBOARD '{alt+c}{p}{ctrl+v}{alt+a}{alt+c}{ctrl+f8}{ctrl+w}'
    
          * Make the class.
          CREATE CLASS cntclass AS CONTAINER OF testlib
    
          * Clear ON KEY LABEL.
          ON KEY LABEL ctrl+f8
    
          * Modify the class and get object reference.
          MODIFY CLASS cntclass OF testlib NOWAIT
          = ASELOBJ(la_object,1)
          lo_object = la_object[1]
    
          * Set value of Tag property.
          lo_object.TAG = ""
    
          * Close the Class Designer.
          KEYBOARD "{Y}"
          RELEASE WINDOW 'class designer' 


  2. Try to modify the Testlib class within Visual FoxPro 6.0. Issue the following command in the Command window after switching to the directory where the Testlib class library created in step 1 is located:
    
          MODIFY CLASS cntclass OF testlib 
    You will receive a "Syntax error" error dialog box and the Class Designer does not open. The same behavior occurs if you attempt to open a form in the Form Designer if the form contains an instance of the class created in the preceding step 1.


If you change the lo_object.TAG = "" line in the preceding program to read lo_object.TAG = "Test prop" and repeat the steps, you get this error:
Unknown error code -5.
If you change the lo_object.TAG = "" line in the preceding program to read lo_object.TAG = .F. or lo_object.TAG = 5 and repeat the steps, you will get this error:
Data type is invalid for this property.

Demonstration of Workarounds

If you still have the earlier version of Visual FoxPro:

  1. Modify the cntclass class under Visual FoxPro 5.0 or earlier.


  2. Change the value of the Tag property from its previous value of (None), a character value, or a logical value to something else, like ="". This allows the class to be modified in Visual FoxPro 6, and the class can still be used in Visual FoxPro 5.

    -or-

    Remove the Tag property. This allows the class to be modified in Visual FoxPro 6.0, but the Tag property would not be available in the class under Visual FoxPro 5.0.


If you do not have the earlier version of Visual FoxPro:

  1. Make a copy of your the class library files (.VCX AND .VCT FILES) that contain the class exhibiting the behavior. In our example, these are Testlib.vcx and Testlib.vct.


  2. Type the following in the Command window. You would have to substitute your .vcx name and property name for those in this example:
    
          USE testlib.vcx
          BROWSE FOR "tag = " $ properties
          MODIFY MEMO properties 


  3. You will see a line that has the following:
    
          tag = 
    If you want the property to be visible in versions of Visual FoxPro prior to 6.0, change it to read as follows:
    
          tag = ("") 


Otherwise, remove the entire "tag = " line.

The objects that will most likely be affected are container, control, custom, formset, image, label, pageframe, separator, and toolbar.

The properties most likely to cause the problems are Tag, Comment, and ToolTipText.

If you have a form that causes the error but contains many objects, or objects from many classes, issue the following SELECT statement after inserting your form file name after the FROM:

      SELECT DISTINCT PADR(classloc+' '+class,40) ;
         FROM <formname.scx> ;
         WHERE !EMPTY(classloc) and INLIST(baseclass,'container', ;
         'control', 'custom', 'formset', 'image', 'label', ;
         'pageframe', 'separator', 'toolbar') 
This gives you a list of the classes that could be the ones causing the problem. You could then open each class in the Class Designer until you find the offending class. Once you find the class, look for a property named after one of the properties in the preceding list.


REFERENCES

© Microsoft Corporation 1998, All Rights Reserved.
Contributions by Jim Saunders, Microsoft Corporation

Additional query words:

Keywords : kbDesigner kbOOP kbVFp600
Version : WINDOWS:6.0
Platform : WINDOWS
Issue type : kbbug


Last Reviewed: December 9, 1999
© 2000 Microsoft Corporation. All rights reserved. Terms of Use.