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
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 enMyForm
.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 llamadaMyClass
, 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]]
...
ENDDEFINEcStatements 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