DEFINE CLASS (Comando)

Crea una clase o una subclase definida por el usuario y especifica las propiedades, los eventos y los métodos para la clase o la subclase.

DEFINE CLASS ClassName1 AS ParentClass [OF ClassLibrary] [OLEPUBLIC]
   [IMPLEMENTS cInterfaceName [EXCLUDE] 
      IN TypeLib | TypeLibGUID | ProgID ]
   [[PROTECTED | HIDDEN PropertyName1, PropertyName2 ...]
   [[.]Object.]PropertyName = eExpression ...]
   [ADD OBJECT [PROTECTED] ObjectName AS ClassName2 [NOINIT]
      [WITH cPropertylist]]
   [[PROTECTED | HIDDEN] FUNCTION | PROCEDURE Name[_ACCESS |_ASSIGN]
      ([cParamName [AS type] [@]]) [AS type]
      [HELPSTRING cHelpString] |
      THIS_ACCESS(cMemberName)
      [NODEFAULT]
      cStatements
   [ENDFUNC | ENDPROC]]
   [PEMName_COMATTRIB = nFlags | DIMENSION PEMName_COMATTRIB[5]
      [PEMName_COMATTRIB[1] = nFlags
       PEMName_COMATTRIB[2] = cHelpString
       PEMName_COMATTRIB[3] = cPropertyCapitalization
       PEMName_COMATTRIB[4] = cPropertyType
       PEMName_COMATTRIB[5] = nOptionalParams]]
ENDDEFINE

Parámetros

  • ClassName1
    Especifica el nombre de la clase que se va a crear.

  • AS ParentClass
    Especifica la clase primaria en la que se basa una clase o una subclase. La clase primaria puede ser una clase de base de Visual FoxPro, como la clase Form, u otra clase o subclase definida por el usuario. La tabla siguiente indica las clases de base de Visual FoxPro:

    Nombres de clases de base

    ActiveDoc ProjectHook
    CheckBox Label
    Column Line
    ComboBox ListBox
    CommandButton OLEControl
    CommandGroup OLEBoundControl
    Container OptionButton
    Control OptionGroup
    Cursor Page
    Custom PageFrame
    DataEnvironment Relation
    EditBox Separator
    Form Session
    FormSet Spinner
    Grid TextBox
    Header Timer
    Hyperlink ToolBar
    Image  

    Si se especifica Custom como ParentClass, Visual FoxPro crea una clase no visual definida por el usuario*.*

    El código de ejemplo siguiente crea una subclase llamada MyForm, basada en la clase Form. El formulario contiene un método Click que muestra un cuadro de diálogo cuando se hace clic en MyForm.

    DEFINE CLASS MyForm AS Form
       PROCEDURE Click
          = MESSAGEBOX('MyForm has been clicked!')
       ENDPROC
    ENDDEFINE
    

    Si se especifica Session como ParentClass, Visual FoxPro crea una clase no visual, definida por el usuario, que mantiene su propia sesión de datos privada. Dado que el objeto Session no es un contenedor, la cláusula AddObject no está disponible al especificar el valor de ParentClass de Session. Las siguientes propiedades de Session tienen nuevas configuraciones predeterminadas cuando se utilizan en una sesión de datos privada (esta versión de Visual FoxPro y posteriores):

    • EXCLUSIVE = OFF
    • TALK = OFF
    • SAFETY = OFF

    Si se especifica OLEPUBLIC para una clase cuyo valor de BaseClass sea Session, la biblioteca de tipos generada para un archivo EXE o DLL sólo contendrá las propiedades y métodos personalizados. Todas las propiedades intrínsecas, métodos y eventos de la clase de base de Session se excluyen de la biblioteca de tipos.

    Este comportamiento es compatible con esta versión de Visual FoxPro y posteriores.

  • OF ClassLibrary
    Permite identificar la biblioteca de clase para AS ParentClass sin especificar explícitamente la ruta de acceso a la biblioteca de clases que la contiene, por ejemplo mediante SET CLASSLIB o SET PROCEDURE. ClassLibrary puede ser un archivo de biblioteca de clases (.vcx), de programa (.prg) o un programa compilado (.fxp).

    Si no se puede encontrar la biblioteca ClassLibrary especificada cuando se intenta crear una instancia de la clase, se producirá un error de tipo "No se encuentra la definición de clase …".

    La configuración especificada para ClassLibrary puede contener una ruta de acceso relativa, siempre que Visual FoxPro pueda encontrar la biblioteca a lo largo de sus rutas de acceso habituales para la búsqueda de bibliotecas de clases.

    Al generar, Visual FoxPro agregará automáticamente ClassLibrary al proyecto si éste incluye el programa que contiene la clase.

  • OLEPUBLIC
    Especifica que se puede tener acceso a la clase, situada en un servidor de Automatización, mediante un cliente de Automatización.

    Si agrega a un proyecto un programa que contenga una definición de clase OLEPUBLIC, podrá crear un archivo ejecutable (.exe) o una biblioteca de vínculos dinámicos (.dll) que contenga la clase, ya sea en el Administrador de proyectos o con BUILD EXE, BUILD DLL o BUILD MTDLL. El archivo EXE o DLL se registra automáticamente con el sistema operativo y pasa a estar disponible para cualquier cliente de Automatización.

    Para obtener información acerca de la creación de servidores de automatización, vea Crear servidores de Automatización.

    [PROTECTED | HIDDEN PropertyName1, PropertyName2 ...][Object.]PropertyName = eExpression ... Crea una propiedad de clase o subclase y asigna un valor predeterminado a la misma. Las propiedades son atributos con nombre de la clase y definen características y comportamientos de la clase. Las clases y las subclases pueden tener múltiples propiedades.

    Utilice = para asignar un valor a la propiedad. El ejemplo siguiente crea una clase definida por el usuario llamada MyClass y crea dos propiedades llamadas Name y Version. La propiedad Name se inicializa con la cadena vacía y la propiedad Version se inicializa con la cadena de caracteres 1.0.

       DEFINE CLASS MyClass AS Custom
          Name = ''
          Version = '1.0'
       ENDDEFINE
    

    Es posible tener acceso a una propiedad fuera de la definición de clase o subclase después de crear el objeto con CREATEOBJECT( ):

       MyObject = CREATEOBJECT('MyClass')
    

    Se tiene acceso a la propiedad mediante la sintaxis siguiente:

       ObjectName.Property
    

    La palabra clave .Object indica a Visual FoxPro que se debería aplicar el valor de la propiedad cuando se cree el control ActiveX.

    En el siguiente ejemplo se agrega el control ActiveX Outline a un formulario. La palabra clave Object se utiliza para especificar una propiedad para el control Outline antes de crearlo.

       PUBLIC frmOLETest
       frmOLETest = CREATEOBJECT('Form')
       frmOLETest.Visible = .T.
    
       frmOLETest.ADDOBJECT('OCXTest', 'BlueOLEControl', ;
          'MSOutl.Outline')
       frmOLETest.OCXTest.AddItem('Item One')
       frmOLETest.OCXTest.AddItem('Item Two')
    
       DEFINE CLASS BlueOLEControl AS OLEControl
    
          * Set a property of the ActiveX control
          .Object.Backcolor = 16776960
    
          * Set properties of the OLE Container Control
          Visible = .T.
          Height = 100
          Width = 200
       ENDDEFINE
    

    Incluya PROTECTED e indique los nombres de propiedad para impedir el acceso y los cambios de las propiedades desde fuera de la definición de clase o subclase. Los métodos y los eventos de la definición de clase o subclase pueden tener acceso a las propiedades protegidas.

    En el ejemplo siguiente, la propiedad Version se protege, lo que impide tener acceso a ella y modificarla desde fuera de la definición de clase. Sin embargo, la propiedad Name no se protege y se puede tener acceso a ella y cambiarla.

       DEFINE CLASS MyClass AS Custom
          PROTECTED Version
          Name = ''
          Version = '1.0'
       ENDDEFINE
    

    Incluya HIDDEN y una lista de nombres de propiedades para impedir el acceso y las modificaciones a las propiedades desde fuera de la definición de clase. Sólo los métodos y los eventos de la definición de la clase pueden tener acceso a las propiedades ocultas. Mientras que las subclases de la definición de clase pueden tener acceso a las propiedades protegidas, sólo la definición de la clase puede tener acceso a las propiedades ocultas.

Nota Si no incluye la palabra clave HIDDEN, puede crear subclases con los métodos Access y Assign.

  • ADD OBJECT
    Agrega un objeto a una definición de clase o subclase desde una clase de base de Visual FoxPro, una clase o una subclase definida por el usuario o un control personalizado ActiveX.

  • PROTECTED
    Impide tener acceso y cambiar las propiedades del objeto desde fuera de la definición de clase o subclase. La palabra clave PROTECTED debe estar situada inmediatamente antes de ObjectName ya que, de lo contrario, FoxPro genera un error de sintaxis.

  • ObjectName
    Especifica el nombre del objeto y se utiliza para hacer referencia al objeto desde dentro de la definición de clase o subclase después de crear un objeto desde la definición de clase o subclase.

  • AS ClassName2
    Especifica el nombre de la clase o subclase que contiene el objeto que se agrega a la definición de clase. Por ejemplo, la siguiente definición de clase agrega un botón de comando desde la clase de base CommandButton y un cuadro de lista desde la clase de base ListBox.

       DEFINE CLASS MyClass AS Custom
       ADD OBJECT CB1 AS CommandButton
       ADD OBJECT LIST1 AS ListBox
       ENDDEFINE
    
  • NOINIT
    Especifica que el método Init de un objeto no se ejecuta cuando se agrega el objeto.

  • WITH cPropertyList
    Especifica una lista de propiedades y valores de propiedad para el objeto que se agrega a la definición de clase o subclase. Por ejemplo, la siguiente definición de clase crea una clase llamada MyClass, agrega un botón de comando a la definición de clase y especifica las propiedades Caption y BackColor del botón de comando.

       DEFINE CLASS MyClass AS CUSTOM
       ADD OBJECT CB1 AS CommandButton;
          WITH Caption = 'Cancel', BackColor = 2
       ENDDEFINE
    
  • FUNCTION | PROCEDURE Name[_ACCESS | _ASSIGN] | THIS ACCESS
    Crea eventos y métodos para la clase o subclase. Los eventos y los métodos se crean como un conjunto de funciones o procedimientos.

    Es posible crear una función o un procedimiento de evento dentro de una definición de clase o subclase para responder a un evento. Un evento es una acción, como un clic del mouse, que se reconoce por un objeto creado con una definición de clase o subclase. Si desea obtener información adicional acerca del procesamiento de eventos de Visual FoxPro, vea Descripción del modelo de eventos.

    Los eventos se llaman mediante la sintaxis siguiente:

    ObjectName.Event
    

    También es posible crear un método, una función o un procedimiento dentro de una definición de clase o subclase. Un método es un procedimiento que actúa sobre el objeto creado con la definición de clase o subclase. Los métodos se llaman mediante esta sintaxis:

    ObjectName.Method
    

    Puede agregar los sufijos _ACCESS y _ASSIGN a un nombre de procedimiento o función para crear un método Access o Assign para una propiedad del mismo nombre. El código de un método Access se ejecuta cada vez que intenta cambiar el valor de una propiedad. El código de un método Assign se ejecuta cada vez que se consulta la propiedad.

    Además, puede crear un procedimiento o función THIS_ACCESS que se ejecute siempre que cambie un valor o se realice una consulta en un miembro de un objeto.

    El código siguiente crea un objeto cuyos procedimientos internos, MyProperty_ACCESS y MyProperty_ASSIGN, responden a consultas (método Access) y a cambios de propiedades (método Assign).

    Observe el uso de la instrucción LPARAMETERS para aceptar el valor pasado al método Assign. Este ejemplo demuestra también la creación de propiedades de sólo lectura.

       DEFINE CLASS MyClass AS Custom
       MyProperty = 100 && A user-defined property
    
       PROCEDURE MyProperty_ACCESS && Access method
          WAIT WINDOW 'This is the Access method';
             +  ' ' + PROGRAM( )
          RETURN THIS.MyProperty
       ENDPROC
    
       PROCEDURE MyProperty_ASSIGN && Assign method
          LPARAMETERS tAssign  && Required to accept value
          WAIT WINDOW 'This is the Assign method';
              + ' ' + PROGRAM( )
       ENDPROC
       ENDDEFINE
    

    El código siguiente agrega un método Assign a una propiedad nativa de Visual FoxPro que ejecuta una validación sencilla en el valor de la propiedad.

    DEFINE CLASS se utiliza para crear una clase Form, frmMyForm. Un método Assign, Left_ASSIGN, creado con una creación PROCEDURE, se ejecuta siempre que se intenta asignar un valor a la propiedad Left del formulario.

       DEFINE CLASS frmMyForm AS Form
    
       PROCEDURE Left_ASSIGN && Assign method
          LPARAMETERS tAssign  && Required to accept value
    
          DO CASE
             CASE tAssign < 0 && Left value negative
                WAIT WINDOW 'Value must be greater than 0'
             OTHERWISE  && Left value not negative
                THIS.Left = tAssign
          ENDCASE
       ENDPROC
       ENDDEFINE
    

    Si intenta establecer un valor negativo en la propiedad Left, el método mostrará un mensaje y el valor no se modificará. Si intenta asignar un valor no negativo a la propiedad Left, el método establecerá la propiedad en el valor especificado.

    Las propiedades, los eventos y los métodos nativos de los controles ActiveX no admiten los métodos Access y Assign. Sin embargo, las propiedades, los eventos y los métodos del OLE Container de Visual FoxPro que contiene el control ActiveX sí admiten los métodos Access y Assign.

    Si desea obtener más información acerca de la creación de métodos Access y Assign con DEFINE CLASS, vea Métodos Access y Assign.

  • CParamName AS Type
    Especifica el parámetro y su tipo que se pasan al procedimiento o función de la clase definida. Utilice el elemento @ para especificar que el parámetro se pase por referencia. AS Type, aquí, especifica el tipo de datos del parámetro con nombre.

    Nota   La cláusula AS Type sólo se utiliza para la información IntelliSense y de definición de clase almacenada en una biblioteca de tipos (OLEPUBLIC). Visual FoxPro no exige la comprobación de tipos durante la compilación ni durante la ejecución del código. El uso estricto de tipos es también recomendable cuando se utilizan los métodos de interfaz especificados por IMPLEMENTS.

    Para que los parámetros y sus tipos aparezcan en la biblioteca de tipos, deberá utilizar la sintaxis de parámetros en línea, en lugar de usar LPARAMETERS para declarar los parámetros: p. ej. FUNCTION Publisher_ShowPrice(Bookid As Integer, Bookprice As String).

          DEFINE CLASS f1 AS custom OLEPUBLIC
          PROTECTED myprop
          FUNCTION mymethod (parm1 AS integer @, parm2 AS string) ;
             AS integer
             RETURN parm1
          ENDFUNC
          ENDDEFINE
    

    Utilice AS VOID como valor de retorno de métodos que no devuelvan nada (procedimientos de un solo sentido). Esto es necesario para ciertas tecnologías, tales como los Componentes en cola de Servicios COM+ de Microsoft.

    Visual FoxPro convertirá automáticamente los valores AS Type cuando los utilicen otros servidores COM. Visual FoxPro muestra también información de tipo para servidores COM en Información rápida de IntelliSense, de acuerdo con la tabla siguiente:

    Tipo definido VFP Conversión biblioteca de tipos COM Información rápida de IntelliSense
    BinaryMemo VARIANT
    Boolean VARIANT_BOOL Logical
    Byte unsigned char Number
    Character VARIANT
    Currency CURRENCY Currency
    Date DATE Date
    DateTime DATE Date
    Decimal wchar_t Number
    Double double Number
    Float VARIANT
    Integer long Number
    Logical VARIANT_BOOL Logical
    Long long Number
    Memo VARIANT
    Number double Number
    Object IDispatch* Object
    Short long Number
    Single single Number
    String BSTR String
    Variant VARIANT
    Void void VOID
  • HELPSTRING cHelpString
    Especifica la cadena que se agrega a la biblioteca de tipos, para mostrarla en un examinador de objetos o en IntelliSense como descripción de la funcionalidad de un método.

  • IMPLEMENTS InterfaceName
    Especifica que esta definición de clase hereda la interfaz (definición de clase) de otro componente COM. Una clase puede incluir varias instrucciones IMPLEMENTS.

       DEFINE CLASS myClass AS custom olepublic
          IMPLEMENTS Publisher IN "mybooksore.dll"
          PROCEDURE Publisher_ShowPrice(cGetID AS Long) AS Short
          ENDPROC
       ENDDEFINE
    
  • EXCLUDE
    Excluye de la biblioteca de tipos la interfaz implementada.

  • IN TypeLib | TypeLibGUID | ProgID
    Especifica la ubicación de la interfaz.

    Puede especificar el objeto COM por medio de TypeLib, la biblioteca de tipos del objeto COM, TypeLibGUID, GUID de la biblioteca de tipos o por medio de la especificación del valor ProgID del programa que inicializa el objeto COM.

       DEFINE CLASS MyBooks AS Custom olepublic
       IMPLEMENTS Publisher IN "c:\sample4\Publisher.VB\BooksPub.dll"
       FUNCTION Publisher_ShowPrice(Bookid As Integer, Bookprice As String)
          ACTIVATE SCREEN
          ? TRANS(Bookid)+"-"+TRANS(Bookprice),Sys(1011),Sys(1016)
       ENDFUNC
       ENDDEFINE
    

    Cuando utilice la opción TypeLibGUID, pase la opción con la designación de versión principal y secundaria como en el ejemplo siguiente:

    IMPLEMENTS IDict1 IN {04BCEF93-7A77-11D0-9AED-CE3E5F000000}#1.0
    

    La opción Typelib es el modo menos recomendable de especificar la biblioteca de tipos, puesto que requiere un nombre de archivo cuya ruta de acceso puede ser diferente de un equipo a otro. Si el archivo DLL se va a distribuir, considere la utilización de TypeLibGUID o ProgID.

    Cuando implemente una interfaz, deberá incluir en la definición de clase todos los métodos de la interfaz. Utilice el nombre de interfaz como principio del nombre de método (por ejemplo, Publisher_ShowPrice). Así evitará también conflictos entre dos interfaces que contengan métodos con el mismo nombre, puesto que es posible tener múltiples instrucciones IMPLEMENTS en una definición de clase. Debe utilizar el nombre de interfaz exactamente como aparece en la biblioteca de tipos. Para los nombres de interfaz que empiezan con un carácter de subrayado, "_", como la clase ADODB Recordset, el carácter de subrayado es opcional.

    Dado que las propiedades se almacenan en esencia como dos métodos dentro de una biblioteca de tipos (put y get), la definición de clase debe incluir ambos métodos.

    Sugerencia   Utilice el Examinador de objetos de Visual FoxPro para arrastrar y colocar una definición de interfaz en el código y ahorrar tiempo. La instrucción IMPLEMENTS, junto con los demás métodos implementados con sus firmas de parámetros correctas, se escribirá automáticamente.

    Ciertas tecnologías, tales como los eventos COM+ de Microsoft, requieren que el componente COM implemente también la interfaz de la clase de eventos que se está enlazando.

  • NODEFAULT
    Hace que Visual FoxPro no realice su procesamiento predeterminado de eventos y métodos de Visual FoxPro. Por ejemplo, si ocurre el evento KeyPress, incluir NODEFAULT en el procedimiento o función KeyPress impide que Visual FoxPro incluya la pulsación de teclas en el búfer de teclado de Visual FoxPro. Esto permite crear un procedimiento KeyPress que le permite probar qué tecla se presionó antes de enviar la tecla al búfer de teclado.

    Puede situar NODEFAULT en cualquier lugar dentro del procedimiento de evento o método. Observe que NODEFAULT también se puede colocar dentro de un procedimiento de evento o método en el Diseñador de formularios.

  • cStatements
    [ENDFUNC | ENDPROC]]
    ...
    ENDDEFINE

    cStatements son los comandos de Visual FoxPro que se ejecutan al ejecutar un evento o un método.

    Las funciones y los procedimientos de evento y método pueden aceptar valores que incluyen una instrucción PARAMETERS o LPARAMETERS como primera línea ejecutable de la función o el procedimiento.

    A diferencia de la mayor parte de palabras clave de Visual FoxPro, no es posible abreviar ENDFUNC ni ENDPROC. Así se evitan conflictos con las palabras clave ENDFOR y ENDPRINTJOB.

    El ejemplo siguiente demuestra cómo crear un procedimiento de evento que muestra un mensaje cuando se hace clic en el botón de comando. Este procedimiento de evento anula el evento Click predeterminado del botón de comando.

    DEFINE CLASS MyClass AS Custom
       ADD OBJECT MyButton AS CommandButton
       ADD OBJECT MyList AS ListBox
       PROCEDURE MyButton.Click
          = MESSAGEBOX('This is my click event procedure')
       ENDPROC
    ENDDEFINE
    
  • PEMName_COMATTRIB
    Crea una matriz que especifica atributos de biblioteca de tipos para la propiedad o método PEMName. Esta característica sólo se aplica a las clases OLEPUBLIC. Utilice esta opción para especificar información adicional acerca de la propiedad o método que desee escribir en la biblioteca de tipos, por ejemplo una descripción o un atributo de sólo lectura.

    La configuración de PEMName_COMATTRIB puede ser una propiedad o una matriz de propiedades. Si se especifica una propiedad, el valor que se le asigna es el de nFlags (primer elemento de la matriz). Visual FoxPro genera un error para los valores o tipos no válidos de la matriz PEMName_COMATTRIB. Los elementos vacíos utilizarán valores predeterminados.

    Elemento COMATTRIB Descripción Tipo
    1 Indicadores de atributo Número
    2 Cadena de ayuda Cadena
    3 Uso de mayúsculas Cadena
    4 Tipo de propiedad Cadena
    5 Número de parámetros
    Si especifica menos parámetros que los reales, los parámetros que excedan el número declarado serán opcionales.
    Número

Nota   A diferencia de los métodos Access y Assign, las propiedades _COMATTRIB aquí descritas se ocultan automáticamente y no resultan accesibles en Visual FoxPro. Son para uso exclusivo de Visual FoxPro durante el proceso de generación, mientras se escribe una biblioteca de tipos COM.

  • nFlags
    Especifica un conjunto de indicadores de atributo para PEMName, tal como aparece en la biblioteca de tipos. La tabla siguiente describe los indicadores válidos.

    Valor de nFlag #DEFINE Descripción
    0x1 (1) COMATTRIB_RESTRICTED La propiedad o método no debe permitir el acceso a lenguajes de macros. Este indicador es adecuado para las funciones del nivel de sistema o aquéllas que los examinadores de tipos no deban mostrar.
    0x40 (64) COMATTRIB_HIDDEN La propiedad o método no debe mostrarse al usuario, aunque exista y pueda enlazarse.
    0x400 (1024) COMATTRIB_NONBROWSABLE La propiedad o método aparece en un examinador de objetos, pero no en un examinador de propiedades.

    También puede utilizar cualquiera de los siguientes valores como indicador válido. El uso de ambas propiedades equivale a no utilizar ninguna.

    #DEFINE Valor Descripción
    COMATTRIB_READONLY 0x100000 La propiedad es de sólo lectura (sólo de aplica a las propiedades). Equivalente a un PropertyGet.
    COMATTRIB_WRITEONLY 0x200000 La propiedad es de sólo escritura (sólo de aplica a las propiedades). Equivalente a un PropertyLet.
  • cHelpString
    Especifica un valor de cadena que se almacenará en la biblioteca de tipos para la propiedad PEMName. Para los métodos, utilice la cláusula HELPSTRING.

  • cPropertyCapitalization
    Especifica el nombre de propiedad, un valor de cadena, tal como aparecerá en la biblioteca de tipos. Se conservan todas las mayúsculas y minúsculas. Sin esta configuración, Visual FoxPro escribirá la propiedad en mayúsculas en la biblioteca de tipos.

  • cPropertyType
    Este valor de cadena es el tipo de datos de la propiedad, tal como aparece en la biblioteca de tipos (igual que la cláusula AS Type). Sólo se aplica a propiedades.

  • nOptionalParms
    Especifica el número de parámetros opcionales de un método. Si este valor es 2 para un método con 5 parámetros, los últimos 3 serán opcionales. Con los clientes de enlace en tiempo de ejecución, los valores predeterminados de los parámetros opcionales continúan siendo .F.; PCOUNT() refleja de forma precisa el número verdadero de parámetros pasados. Para los clientes de enlace en tiempo de compilación, los valores predeterminados para los parámetros opcionales se establecen siempre en ""; PCOUNT() es siempre el número total de parámetros del método (no el número de parámetros que se pasaron). Sólo se aplica a los métodos.

    **Nota   **COMATTRIB_RESRICTED significa que no se debe permitir el acceso a este miembro a los programadores orientados a macros. Estos miembros suelen ser tratados como _HIDDEN por herramientas tales como Visual Basic; la diferencia principal es que el código no puede enlazarse con ellos. COMATTRIB_HIDDEN significa que la propiedad no debe mostrarse nunca en examinadores de objetos, examinadores de propiedades, etc. Esta función es útil para quitar objetos de un modelo de objetos. El código puede enlazar con el miembro, pero el usuario no sabrá nunca que el miembro existe. COMATTRIB _NONBROWSABLE significa que la propiedad no debe mostrarse en un examinador de propiedades. Se utiliza en circunstancias en las que se produciría un error si se mostrara la propiedad en un examinador de propiedades. Los enlaces en tiempo de compilación y en tiempo de ejecución imponen restricciones de acceso diferentes. Los clientes que enlacen en tiempo de compilación no podrán escribir en una propiedad de sólo lectura ni leer una propiedad de sólo escritura, porque no habrá una entrada en vtable. Los clientes que enlacen en tiempo de ejecución tendrán acceso a un propertyget para un PEMName de sólo escritura o un propertyput para un PEMName de sólo lectura.

Observaciones

Las clases definidas por el usuario son un conjunto de comandos situados en un archivo de programa, similares a un procedimiento. Los comandos que siguen la definición de clase o subclase definen propiedades, eventos y métodos para la clase o la subclase.

Nota    No puede incluir código de programa ejecutable normal dentro de un archivo de programas después de procedimientos; sólo las definiciones de clase, los procedimientos y las funciones definidas por el usuario pueden ir a continuación del comando DEFINE CLASS, PROCEDURE o FUNCTION en el archivo.

Las definiciones de clase y subclase creadas con DEFINE CLASS no pueden situarse dentro de comandos de programación estructurados, como IF ... ENDIF o DO CASE ... ENDCASE. Tampoco pueden situarse en bucles, como DO WHILE ... ENDDO o FOR ... ENDFOR.

Para crear un objeto a partir de una definición de clase o subclase, ejecute CREATEOBJECT( ) con el nombre de clase o subclase.

Si utiliza la cláusula IMPLEMENTS, deberá incluir todos los métodos de la interfaz especificada. Visual FoxPro no exige la comprobación de los tipos, así que deberá asegurarse de utilizar tipos de datos válidos. Dado que las propiedades se almacenan como dos métodos, PUT y GET, deberá incluirlos a ambos en la definición de clase.

Los métodos Access y Assign están protegidos de forma predeterminada (no puede tener acceso a un método Access o Assign ni modificarlo desde fuera de la clase en la que se cree el método Access o Assign).

Puede ver el código de los métodos Access y Assign en la ventana Seguimiento de la ventana Depurador. Sin embargo, los métodos Access y Assign no se pueden ejecutar en las ventanas Inspección y Locales de la ventana Depurador.

Se pasan matrices a los métodos Access y Assign de la misma forma en que se pasan a procedimientos estándar de Visual FoxPro.

Si ejecuta SET UDFPARMS TO REFERENCE o se antepone @ al nombre de la matriz, se pasa la matriz completa al método Access o Assign. Si ejecuta SET UDFPARMS TO VALUE o escribe el nombre de la matriz entre paréntesis, se pasa por valor el primer elemento de la matriz. Los elementos de matriz siempre se pasan por valor. Para obtener más información acerca de cómo pasar valores y matrices, vea SET UDFPARMS.

Ejemplo

El ejemplo siguiente usa DEFINE CLASS y CREATEOBJECT( ) para crear dos clases personalizadas llamadas FormChild y FormGrandChild a partir de la clase de base Form de Visual FoxPro. ACLASS( ) se utiliza para crear una matriz llamada gaNuevamatriz que contiene los nombres de clase, que se muestran después.

CLEAR
frmMyForm = CREATEOBJECT("FormGrandChild")
FOR nCount = 1 TO ACLASS(gaNewarray, frmMyForm)    && Creates an array
   ? gaNewarray(nCount)  && Displays the names of the classes
ENDFOR
RELEASE frmMyForm

DEFINE CLASS FormChild AS FORM
ENDDEFINE

DEFINE CLASS FormGrandChild AS FormChild
ENDDEFINE

El código siguiente define una matriz de atributos de biblioteca de tipos que utilizan el parámetro _COMATTRIB.

#INCLUDE foxpro.h
DEFINE CLASS myclass AS CUSTOM olepublic
   * Define property
   MyProperty = 5.2
   * Set the COM attributes for MyProperty
   DIMENSION MyProperty_COMATTRIB[4]
   myproperty_COMATTRIB[1] = COMATTRIB_READONLY
   myproperty_COMATTRIB[2] = "Helptext displayed in object browser"
   myproperty_COMATTRIB[3] =  "MyProperty"&& Proper capitalization.
   myproperty_COMATTRIB[4] = "Float"&& Data type
ENDDEFINE

Si sólo desea establecer el elemento nFlags, no necesitará asignar dimensiones a la propiedad _COMATTRIB como matriz.

#INCLUDE foxpro.h
DEFINE CLASS myclass AS SESSION olepublic
   * Define property
   MyProperty = "Test"
   * Only set the nFlags attribute for MyProperty
   myproperty_comattrib = COMATTRIB_READONLY
ENDDEFINE

Vea también

:: Operador de resolución de alcance | ADD CLASS | _BROWSER | CREATE CLASS | CREATE CLASSLIB | CREATEOBJECT( ) | DODEFAULT( ) (Función) | EVENTHANDLER( ) | GETOBJECT( ) | MODIFY CLASS | OBJECT BROWSER | RELEASE CLASSLIB | Session (Objeto) | SET CLASSLIB | WITH ... ENDWITH