Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Pgina 1 de 83
Visual FoxPro es una eficaz herramienta de administracin de datos, pero adems podr beneficiarse de toda su eficacia para crear aplicaciones. Comprender las tcnicas de programacin orientada a objetos y el modelo controlado por eventos puede aumentar su productividad como programador. Captulo 1 Introduccin a la programacin Si est empezando a programar, aprenda el proceso y el mtodo de programacin en Visual FoxPro. Captulo 2 Programar una aplicacin Cuando programe una aplicacin, organice sus componentes con el Administrador de programas, una forma integrada de generar y probar su aplicacin a medida que la cree. Captulo 3 Programacin orientada a objetos Con la programacin orientada a objetos, puede crear componentes de aplicacin independientes que respondan a acciones del usuario y al sistema y que se puedan mantener y reutilizar fcilmente. Captulo 4 Descripcin del modelo de eventos El modelo de eventos define cundo y cmo tienen lugar las interacciones con el usuario y el sistema.
file://C:\temp\~hh52BB.htm
30/05/2000
Pgina 2 de 83
Ventajas de la programacin La mecnica de la programacin en Visual FoxPro Conceptos bsicos de programacin El proceso de la programacin Usar procedimientos y funciones definidos por el usuario Pasos siguientes
Ventajas de la programacin
Normalmente, cualquier funcin que pueda realizar con un programa podr realizarla tambin a mano, si dispone de suficiente tiempo. Por ejemplo, si desea consultar informacin sobre un cliente en una tabla de clientes, como por ejemplo la empresa Ernst Handel, podra hacerlo manualmente si sigue una secuencia concreta de instrucciones. Para buscar manualmente un nico pedido en una tabla 1. En el men Archivo, elija Abrir. 2. En el cuadro Archivos de tipo, elija Tabla. 3. Haga doble clic en Customer.dbf en la lista de archivos. 4. En el men Ver, elija Examinar. 5. Desplcese por la tabla, examinando el campo Company de los registros hasta encontrar Ernst Handel. Mediante programacin podra conseguir el mismo resultado escribiendo los siguientes comandos de Visual FoxPro en la ventana Comandos:
USE Customer LOCATE FOR Company = "Ernst Handel" BROWSE
Cuando haya localizado el pedido de esta empresa, tal vez desee incrementar la cantidad mxima del pedido en un 3%. Para incrementar manualmente la cantidad mxima del pedido 1. Presione la tecla Tab para desplazarse hasta el campo max_ord_amt. 2. Multiplique el valor mostrado en el campo max_ord_amt por 1,03 y escriba el nuevo valor en el campo. Para conseguir el mismo resultado mediante programacin, escriba el siguiente comando de Visual FoxPro en la ventana Comandos:
file://C:\temp\~hh52BB.htm
30/05/2000
Pgina 3 de 83
Es relativamente sencillo cambiar la cantidad mxima del pedido para un cliente, ya sea manualmente o escribiendo las instrucciones en la ventana Comandos. Sin embargo, suponga que desea incrementar en un 3% la cantidad mxima de pedido de todos los clientes. Podra hacerlo manualmente, pero le llevara mucho tiempo y es posible que cometiese errores. Si especifica las instrucciones correctas en un archivo de programa, Visual FoxPro podr realizar esta tarea con rapidez y facilidad, sin cometer ningn error. Programa de ejemplo para incrementar las cantidades mximas de pedido de todos los clientes Cdigo
USE customer
Comentarios Abre la tabla CUSTOMER. Examina todos los registros de la tabla y realiza todas las instrucciones comprendidas entre SCAN y ENDSCAN para cada registro. Incrementa la cantidad mxima de pedido en un 3%. (El punto y coma (;) indica que el comando sigue en la lnea siguiente). Final del cdigo que se ejecuta para cada registro contenido en la tabla.
SCAN
ENDSCAN
La ejecucin de un programa ofrece numerosas ventajas en comparacin con la introduccin de distintos comandos en la ventana Comandos:
l l l
Los programas se pueden modificar y volver a ejecutar. Se pueden ejecutar programas desde los mens, formularios y barras de herramientas. Los programas pueden ejecutar otros programas.
En las siguientes secciones se describe la mecnica, los conceptos y los procesos que subyacen a ste y otros programas de Visual FoxPro.
l l
La ventana Comandos. Archivos de programa Ventanas de cdigo de eventos o de mtodos en el Diseador de formularios o en el Diseador de clases Ventanas de cdigo de procedimientos en el Diseador de mens Ventanas de cdigo de procedimientos en el Diseador de informes
file://C:\temp\~hh52BB.htm
30/05/2000
Pgina 4 de 83
Crear programas
Un programa de Visual FoxPro es un archivo de texto que contiene una serie de comandos. Puede crear un programa en Visual FoxPro de una de las siguientes maneras: Para crear un programa 1. En el Administrador de proyectos, seleccione Programas en la ficha Cdigo. 2. Elija Nuevo. O bien 1. En el men Archivo, elija Nuevo. 2. En el cuadro de dilogo Nuevo, seleccione Programa. 3. Elija Nuevo archivo. O bien
file://C:\temp\~hh52BB.htm
30/05/2000
Pgina 5 de 83
Visual FoxPro abrir una nueva ventana denominada Programa1. Podr entonces escribir su programa en esta ventana. Guardar programas Una vez creado un programa, asegrese de guardarlo. Para guardar un programa
l
Si intenta cerrar un programa sin antes guardarlo, aparecer un cuadro de dilogo en el que se le preguntar si desea guardar o descartar los cambios realizados en el mismo. Si guarda un programa creado a partir del Administrador de proyectos, el programa se agregar al proyecto. Si guarda un programa al que todava no ha asignado un nombre, se abrir el cuadro de dilogo Guardar como, en el que podr especificar el nombre del programa. Cuando haya guardado el programa, podr ejecutarlo o modificarlo. Modificar programas Despus de guardar el programa, podr modificarlo. En primer lugar, abra el programa de una de las siguientes maneras: Para abrir un programa
l
Si el programa forma parte de un proyecto, seleccinelo en el Administrador de proyectos y elija Modificar. O bien
En el men Archivo, elija Abrir. Aparecer un cuadro de dilogo en el que se muestra una lista de los archivos disponibles. En la lista Archivos de tipo, elija Programa. En la lista de archivos, seleccione el programa que desea modificar y elija Abrir. O bien
Pgina 6 de 83
Cuando aparezca la lista de archivos, seleccione el programa que desea modificar y a continuacin elija Abrir. Despus de abrir el programa, podr realizar cambios en el mismo. Cuando haya terminado de introducir los cambios, asegrese de guardar el programa. Ejecutar programas Despus de crear un programa, podr ejecutarlo. Para ejecutar un programa
l
Si el programa forma parte de un proyecto, seleccinelo en el Administrador de proyectos y elija Ejecutar. O bien
En el men Programa, elija Ejecutar. Cuando aparezca la lista de programas, seleccione el programa que desea ejecutar y a continuacin elija Ejecutar. O bien
file://C:\temp\~hh52BB.htm
30/05/2000
Pgina 7 de 83
Cuando se programa, se almacenan datos y se manipulan mediante una serie de instrucciones. Los datos y los contenedores en los que se almacenan los datos constituyen la materia prima de la programacin. Las herramientas utilizadas para manipular esta materia prima son comandos, funciones y operadores.
Almacenar datos
Los datos con los que trabaja probablemente incluyan perodos de tiempo, dinero y elementos contables, as como fechas, nombres, descripciones, etc. Cada dato corresponde a un determinado tipo, es decir, pertenece a una categora de datos que se manipula de maneras similares. Podra trabajar directamente con estos datos sin almacenarlos, si bien perdera la mayor parte de la flexibilidad y potencia que ofrece Visual FoxPro. Visual FoxPro aporta numerosos contenedores de almacenamiento con el fin de ampliar su capacidad para manipular fcilmente los datos. Los tipos de datos determinan la manera en que se almacenan los datos y la forma en que se pueden utilizar tales datos. Puede multiplicar dos nmeros, pero no puede multiplicar caracteres. Puede imprimir caracteres en maysculas, pero no puede imprimir nmeros en maysculas. En la tabla siguiente se muestran algunos de los principales tipos de datos de Visual FoxPro. Tipos de datos Tipo Numeric Ejemplos 123 3,1415 7 Prueba 123 01/01/98 .T. (verdadero) .F. (falso) {^1998-01-01} {^1998-01-01 12:30:00 p}
Character
Los contenedores de datos le permiten realizar las mismas operaciones con varios datos. Por ejemplo, sumar las horas que ha trabajado un empleado, multiplicarlas por el salario por hora y restar los impuestos para determinar el sueldo que ha percibido el empleado. Deber realizar estas operaciones para cada empleado y para cada perodo de pago. Si almacena esta informacin en contenedores y realiza las operaciones sobre stos, bastar con sustituir los datos antiguos por los nuevos datos y volver a ejecutar el mismo programa. En la siguiente tabla se enumeran algunos de los principales contenedores de datos disponibles en Visual FoxPro:
file://C:\temp\~hh52BB.htm
30/05/2000
Pgina 8 de 83
Descripcin Elementos individuales de datos almacenados en la memoria RAM (memoria de acceso aleatorio) del PC. Varias filas de campos predeterminados, cada uno de los cuales puede contener un dato definido previamente. Las tablas se guardan en disco. Varios elementos de datos almacenados en la memoria RAM.
Manipular datos
Los contenedores y los tipos de datos le ofrecen los mdulos que necesita para manipular los datos. Los elementos finales son los operadores, las funciones y los comandos. Usar operadores Los operadores se utilizan para vincular los datos. A continuacin se muestran los operadores utilizados habitualmente en Visual FoxPro. Operador = Tipos de datos vlidos Todos Ejemplo
? n = 7
Resultado Imprime .T. si el valor almacenado en la variable es 7; de lo contrario, imprime .F. Imprime FoxPro
? "Fox" + "Pro"
! or NOT *, /
? !.T.
? 5 * 5 ? 25 / 5
Nota Un signo de interrogacin (?) situado delante de una expresin imprime el resultado de la expresin y un carcter de nueva lnea en la ventana de salida activa, que es normalmente la ventana principal de Visual FoxPro. Recuerde que debe utilizar el mismo tipo de datos con cada operador. Las siguientes instrucciones almacenan dos datos numricos en dos variables. Los nombres de variable empiezan con la letra n, por lo que se puede determinar de inmediato que contienen datos numricos, pero puede nombrarlas con cualquier combinacin de caracteres alfanumricos y caracteres de subrayado.
nPrimero = 123 nSegundo = 45
file://C:\temp\~hh52BB.htm
30/05/2000
Pgina 9 de 83
Las instrucciones siguientes almacenan dos datos de caracteres en dos variables. Los nombres de variable empiezan con la letra c para indicar que contienen datos de tipo character.
cPrimero = "123" cSegundo = "45"
Las dos operaciones siguientes, suma y concatenacin, producen resultados distintos, ya que el tipo de datos es diferente en cada una de ellas.
? nPrimero + nSegundo ? cPrimero + cSegundo
Resultado
168 12345
Puesto que cPrimero contiene caracteres y nSegundo contiene datos numricos, se producir un error de tipo de datos incorrecto si se intenta ejecutar el siguiente comando:
? cPrimero + nSegundo
Puede evitar este problema si utiliza funciones de conversin. Por ejemplo, STR( ) devuelve el valor de tipo Character equivalente de un valor de tipo Numeric, mientras que VAL( ) devuelve el equivalente numrico de una cadena de caracteres formada por nmeros. Estas funciones y LTRIM( ), que elimina los espacios iniciales, le permiten realizar las operaciones siguientes:
? cPrimero + LTRIM(STR(nSegundo)) ? VAL(cPrimero) + nSegundo
Resultado
12345 168
Usar funciones Las funciones devuelven un tipo especfico de datos. Por ejemplo, las funciones STR( ) y VAL( ) utilizadas en la seccin anterior devuelven valores de tipo Character y Numeric, respectivamente. Al igual que ocurre con todas las funciones, estos tipos devueltos estn documentados con las funciones. Hay cinco maneras de llamar a una funcin de Visual FoxPro:
l
Asignar a una variable el valor que devuelve la funcin. La siguiente lnea de cdigo almacena la fecha actual del sistema en una variable denominada dHoy:
dHoy = DATE( )
Incluir la llamada a la funcin en un comando de Visual FoxPro. El siguiente comando establece el directorio predeterminado como el valor devuelto por la funcin GETDIR( ):
file://C:\temp\~hh52BB.htm
30/05/2000
Pgina 10 de 83
CD GETDIR( )
l
Imprimir el valor devuelto en la ventana de salida activa. La siguiente lnea de cdigo imprime la hora actual del sistema en la ventana principal de Visual FoxPro:
? TIME( )
Llamar a la funcin sin almacenar en ningn lugar el valor devuelto. La siguiente llamada de funcin desactiva el cursor:
SYS(2002)
Incluir la funcin dentro de otra funcin. La siguiente lnea de cdigo imprime el da de la semana:
? DOW(DATE( ))
A continuacin se enumeran otros ejemplos de funciones utilizados en este captulo: Funcin ISDIGIT( ) FIELD( ) LEN( ) RECCOUNT( ) SUBSTR( ) Descripcin Devuelve el valor verdadero (.T.) si el carcter situado al comienzo de una cadena es un nmero; de lo contrario, devuelve el valor falso (.F.). Devuelve el nombre de un campo. Devuelve el nmero de caracteres de una expresin de caracteres. Devuelve el nmero de registros de la tabla que est activa en este momento. Devuelve el nmero especificado de caracteres a partir de una cadena de caracteres, empezando en una posicin especificada de la cadena.
Usar comandos Un comando hace que se realice una determinada accin. Cada comando dispone de una sintaxis especfica que indica lo que se debe incluir con el fin de que se ejecute correctamente el comando. Hay tambin clusulas opcionales asociadas a los comandos que permiten especificar de forma ms detallada la accin que se desea realizar. Por ejemplo, el comando USE permite abrir y cerrar tablas: Sintaxis de USE
USE
Descripcin Cierra la tabla que aparece en el rea de trabajo actual. Abre la tabla CUSTOMER en el rea de trabajo actual y cierra cualquier tabla que ya est abierta 30/05/2000
USE customer
file://C:\temp\~hh52BB.htm
Pgina 11 de 83
Abre la tabla CUSTOMER en la siguiente rea de trabajo disponible. Abre la tabla CUSTOMER en la siguiente rea de trabajo disponible y asigna al rea de trabajo el alias miCliente.
A continuacin se muestran algunos ejemplos de comandos utilizados en este captulo: Comando DELETE REPLACE Go Descripcin Selecciona registros especificados de una tabla para su eliminacin. Sustituye el valor almacenado en el campo del registro por un nuevo valor. Coloca el puntero de registro en una posicin especfica de la tabla.
Observaciones El cdigo comprendido entre SCAN y ENDSCAN se ejecuta tantas veces como registros haya en la tabla. Cada vez que se ejecuta el cdigo, el puntero de registro se desplaza al siguiente registro de la tabla. Para cada registro, si el salario es mayor o igual que 3.000.000, este valor se sustituye por un nuevo salario que es un 3% superior.
file://C:\temp\~hh52BB.htm
30/05/2000
Pgina 12 de 83
El signo de punto y coma (;) que aparece despus de WITH indica que el comando contina en la siguiente lnea.
ELSE REPLACE salario WITH ; salario * 1,06
Para cada registro, si el salario no es mayor o igual que 3.000.000, se sustituye este valor por un nuevo salario que es un 6% superior. Final de la instruccin condicional IF. Final del cdigo que se ejecuta para cada registro de la tabla.
ENDIF ENDSCAN
Este ejemplo utiliza comandos de bifurcacin y bucle condicional para controlar el desarrollo del programa. Bifurcacin condicional La bifurcacin condicional permite someter a prueba condiciones y, a continuacin, en funcin del resultado de la prueba, realizar distintas operaciones. Visual FoxPro ofrece dos comandos que permiten realizar una bifurcacin condicional:
l l
El cdigo comprendido entre la instruccin inicial y la instruccin ENDIF o ENDCASE slo se ejecuta si una condicin lgica se evala como verdadera (.T.). En el programa de ejemplo, el comando IF se utiliza para distinguir entre dos estados: o el salario es de 3.000.000 pesetas o ms, o no lo es. Se adoptan diferentes medidas, dependiendo del estado. En el siguiente ejemplo, si el valor almacenado en la variable nTempAgua es menor que 100, no se realizar ninguna accin:
* definir una variable lgica como Verdadera si se cumple una condicin. IF nTempAgua >= 100 lEbullicin = .T. ENDIF
Nota Un asterisco al principio de una lnea de un programa indica que la lnea es un comentario. Los comentarios ayudan al programador a recordar la funcin que debe realizar cada segmento de cdigo, si bien Visual FoxPro los pasa por alto. Si se desea comprobar varias condiciones posibles, un bloque DO CASE ... ENDCASE puede resultar ms eficaz que varias instrucciones IF y adems es ms fcil realizar un seguimiento del mismo. Bucles Un bucle le permite ejecutar una o ms lneas de cdigo tantas veces como sea necesario. En Visual file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro FoxPro hay tres comandos que permiten realizar bucles:
l l l
Pgina 13 de 83
Utilice SCAN cuando realice una serie de acciones para cada uno de los registros de una tabla, como en el ejemplo de programa descrito anteriormente. El bucle SCAN permite escribir el cdigo una vez y ejecutarlo para cada registro a medida que el puntero de registro se desplaza por la tabla. Utilice FOR cuando sepa cuntas veces debe ejecutarse la seccin de cdigo. Por ejemplo, sabe que una tabla contiene un nmero especfico de campos. Puesto que la funcin FCOUNT( ) de Visual FoxPro devuelve este nmero, puede utilizar un bucle FOR para imprimir los nombres de todos los campos de la tabla:
FOR nRecuento = 1 TO FCOUNT( ) ? FIELD(nRecuento) ENDFOR
Utilice DO WHILE cuando desee ejecutar una seccin de cdigo mientras cumpla una determinada condicin. Tal vez no sepa cuntas veces debe ejecutarse el cdigo, pero s sabe cundo debe detenerse la ejecucin. Por ejemplo, supongamos que dispone de una tabla en la que figuran los nombres y las iniciales de una serie de personas y desea utilizar las iniciales para consultar los nombres de las personas. Surgira un problema la primera vez que intentase agregar una persona cuyas iniciales fuesen las mismas que las de otra persona contenida en la tabla. Para resolver este problema, podra agregar un nmero a las iniciales. Por ejemplo, el cdigo de identificacin de Miguel Surez podra ser MS. La siguiente persona cuyas iniciales fuesen las mismas, Margarita Snchez, sera MS1. Si a continuacin anexase Mara Sanz a la tabla, su cdigo de identificacin sera MS2. Un bucle DO WHILE permite localizar el nmero correcto que se debe adjuntar a las iniciales. Programa de ejemplo que utiliza DO WHILE para generar un nmero de identificacin nico Cdigo
nAqu = RECNO()
Comentarios Guardar la posicin del registro. Obtener las iniciales de la persona a partir de las primeras letras de los campos nombre y apellido. Si es necesario, establecer una variable que contenga el nmero que se debe agregar al final de las iniciales de una persona.
Comprobar si hay otra persona en la tabla cuyas iniciales son las mismas. Si en otro registro de la tabla hay un valor id_persona que coincide con cIniciales, la 30/05/2000
DO WHILE FOUND( )
file://C:\temp\~hh52BB.htm
Pgina 14 de 83
funcin FOUND( ) devolver el valor verdadero (.T.) y se ejecutar el cdigo contenido en el bucle DO WHILE. Si no se encuentra ninguna coincidencia, la siguiente lnea de cdigo que se ejecute ser la lnea que figura a continuacin de ENDDO.
nSufijo = nSufijo + 1 cIniciales = ; LEFT(cIniciales,2); + ALLTRIM(STR(nSufijo))
CONTINUE
CONTINUE hace que se vuelva a evaluar el ltimo comando LOCATE. El programa comprueba si el nuevo valor contenido en cIniciales ya existe en el campo id_persona de otro registro. Si es as, FOUND( ) seguir devolviendo el valor .T. y se volver a ejecutar el cdigo contenido en el bucle DO WHILE. Si el nuevo valor contenido en cIniciales es efectivamente nico, FOUND( ) devolver el valor .F. y la ejecucin del programa continuar con la lnea de cdigo que figura a continuacin de ENDDO. Final del bucle DO WHILE. Volver al registro y almacenar el cdigo de identificacin nico en el campo id_persona.
ENDDO
Puesto que no hay manera de saber de antemano cuntas veces se encontrarn los cdigos de identificacin coincidentes que ya se estn utilizando, se utiliza el bucle DO WHILE.
El proceso de la programacin
Cuando entienda los conceptos bsicos, la programacin ser un proceso reiterativo. Los pasos se repiten numerosas veces, perfeccionndose el cdigo a medida que se avanza. Al principio, someter el cdigo a prueba frecuentemente mediante un sistema de prueba y tanteo. Cuanto ms conozca el lenguaje, mayor ser la rapidez con que pueda programar y podr realizar ms pruebas preliminares mentalmente. Entre los pasos bsicos de la programacin cabe citar los siguientes:
l l l l l
Definir el problema. Desglosar el problema en elementos discretos. Construir los elementos. Comprobar y perfeccionar los elementos. Ensamblar los elementos.
file://C:\temp\~hh52BB.htm
30/05/2000
Pgina 15 de 83
A continuacin se enumeran algunos aspectos que debe tener presentes al empezar a programar:
l
Defina claramente el problema antes de intentar resolverlo. Si no lo hace, acabar por realizar numerosos cambios, desechar cdigo, tendr que empezar de nuevo o bien terminar con un resultado que no es realmente lo que deseaba. Desglose el problema en pasos manejables, en lugar de intentar resolver todo el problema de una sola vez. Pruebe y depure secciones de cdigo a medida que desarrolla el programa. Compruebe que el cdigo hace lo que quiere que haga. La depuracin es el proceso de encontrar y solucionar problemas que impiden que el cdigo se ejecute correctamente. Perfeccione los datos y el almacenamiento de datos para facilitar la manipulacin de estos datos a travs del cdigo del programa. Esto suele implicar estructurar las tablas de forma adecuada.
En el resto de esta seccin se describen los pasos que debe seguir para construir un pequeo programa Visual FoxPro.
Definir el problema
Antes de poder resolver un problema, debe formularlo claramente. Algunas veces, si ajusta la formulacin del problema podr ver ms opciones para resolverlo. Suponga que obtiene muchos datos de distintos orgenes. Si bien la mayora de los datos son estrictamente numricos, algunos valores contienen guiones y espacios en blanco adems de nmeros. Suponga que quiere eliminar todos los espacios en blanco y los guiones de dichos campos y guardar los datos numricos. En lugar de intentar eliminar los espacios en blanco y los guiones de los datos originales, podra formular el objetivo del programa como: Objetivo Reemplazar los valores existentes de un campo por otros valores que contengan todo lo que contenan los valores originales, excepto los espacios en blanco y los guiones. Esta formulacin evita la dificultad que supone manipular una cadena de caracteres cuya longitud sigue cambiando a medida que trabaja con ella.
Descomponer el problema
Puesto que tiene que indicar instrucciones especficas a Visual FoxPro en trminos de operaciones, comandos y funciones, debe descomponer el problema en pasos discretos. La tarea ms discreta para este problema sera examinar cada carcter de la cadena. Hasta que pueda examinar un carcter individualmente, no podr determinar si desea guardarlo. Una vez que examine un carcter, deber comprobar si se trata de un guin o de un espacio en blanco. En este momento, quiz desee refinar la declaracin del problema. Y si obtuviera ms adelante datos que contienen parntesis de apertura y de cierre? Y si desea deshacerse de los smbolos de moneda, las comas y los puntos? Cuanto ms genrico pueda hacer el cdigo, ms file://C:\temp\~hh52BB.htm 30/05/2000
Pgina 16 de 83
trabajo se ahorrar de ahora en adelante; lo principal es ahorrar trabajo. He aqu una formulacin del problema vlida para una variedad mucho mayor de datos: Objetivo refinado Reemplazar los valores existentes en un campo por otros valores que contengan nicamente los caracteres numricos de los valores originales. Con esta formulacin, ahora puede volver a plantear el problema a nivel de carcter: si el carcter es numrico, guardar el carcter; si el carcter es no numrico, pasar al siguiente carcter. Cuando haya construido una cadena que slo contenga los elementos numricos de la cadena inicial, podr reemplazar la primera cadena y pasar al siguiente registro hasta que haya terminado con todos los datos. Para resumir, el problema se descompone en los siguientes elementos: 1. Examinar cada carcter. 2. Decidir si el carcter es numrico o no. 3. Si es numrico, copiarlo a la segunda cadena. 4. Cuando haya terminado con todos los caracteres de la cadena original, reemplazar la cadena original con la cadena que slo contiene valores numricos. 5. Repetir estos pasos para todos los registros de la tabla.
Examinar cada carcter En primer lugar desea buscar un nico carcter en la cadena. Para obtener una lista de funciones que se pueden utilizar para manipular cadenas, vea Funciones de carcter. Ver tres funciones que devuelven determinadas secciones de una cadena: LEFT( ), RIGHT( ) y SUBSTR( ). De estas tres funciones, SUBSTR( ) devuelve caracteres de cualquier parte de la cadena. SUBSTR( ) usa tres argumentos o parmetros: la cadena, la ubicacin inicial dentro de la cadena y el nmero de caracteres que se deben devolver de la cadena, empezando por la ubicacin inicial. Para comprobar si SUBSTR( ) va a hacer lo que usted quiere, podra escribir los siguientes comandos en la
file://C:\temp\~hh52BB.htm
30/05/2000
Pgina 17 de 83
Resultado
1 3 -
Puede ver que en la ventana principal de Visual FoxPro se muestran el primer, el tercer y el octavo caracteres de la cadena de prueba. Para hacer eso mismo varias veces, utilice un bucle. Puesto que la cadena de prueba tiene un nmero determinado de caracteres (14), puede utilizar un bucle FOR. El contador del bucle FOR se incrementa cada vez que se ejecuta el cdigo del bucle, por lo que puede utilizar el contador de la funcin SUBSTR( ). Puesto que en la ventana Comandos no puede comprobar las construcciones de bucles, deber probar la siguiente seccin de cdigo en un programa de ejemplo. Para crear un programa nuevo 1. Escriba el siguiente comando en la ventana Comandos:
MODIFY COMMAND numonly
Ahora que ha creado un programa, ya puede ejecutarlo. Para ejecutar un programa 1. En la ventana del programa abierto, presione CTRL+E. 2. Si aparece un cuadro de dilogo Guardar, elija Aceptar. Cuando ejecute este programa, los caracteres individuales de la cadena de prueba se imprimirn en lneas distintas en la ventana principal de Visual FoxPro. Comprobar parte del programa
file://C:\temp\~hh52BB.htm
30/05/2000
Pgina 18 de 83
Ya ha completado la primera tarea. Ahora puede examinar cada carcter de la cadena. Decidir si el carcter es numrico Cuando tenga un nico carcter de la cadena, debe saber si se trata de un nmero. Puede hacerlo con ISDIGIT( ). Puede probar los siguientes comandos en la ventana Comandos:
? ISDIGIT('2') ? ISDIGIT('-') ? ISDIGIT(SUBSTR(cTest, 3, 1))
Resultado
.T. .F. .T.
De este resultado se desprende que 2 es un nmero, no es un nmero y el tercer carcter, 3, es un nmero. Si el carcter es numrico, copiarlo a la segunda cadena Ahora que puede examinar los caracteres y determinar si son o no numricos, necesita una variable
file://C:\temp\~hh52BB.htm
30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro para almacenar los valores numricos: cNumOnly. Para crear la variable, debe asignarle un valor inicial, una cadena de longitud cero:
cNumOnly = ""
Pgina 19 de 83
A medida que el bucle FOR recorre la cadena, es conveniente crear otra variable para almacenar temporalmente cada carcter de la cadena a medida que sta se manipula:
cCharacter = SUBSTR(cTest, nCnt, 1)
Sugerencia Normalmente es mejor almacenar en una variable de memoria el resultado de un clculo, evaluacin o funcin. Entonces puede manipular la variable en lugar de tener que repetir el clculo o la evaluacin. La siguiente lnea de cdigo puede utilizarse cada vez que se encuentra un nmero para sumar el nmero a la segunda cadena:
cNumOnly = cNumOnly + cCharacter
Resultado
123-456-7 89 0 1234567890
El resultado parece correcto. Pero si cambia la cadena de prueba mientras comprueba los elementos, puede tener problemas. Escriba el siguiente comando en la ventana Comandos y ejecute de nuevo el programa:
file://C:\temp\~hh52BB.htm
30/05/2000
Pgina 20 de 83
El programa generar un mensaje de error. El bucle FOR ha intentado ejecutarse 14 veces, pero en la cadena slo haba 10 caracteres. Necesita una forma de ajustar las longitudes variables de las cadenas. Use LEN( ) para devolver el nmero de caracteres de una cadena. Si sustituye este comando en el bucle FOR, ver que el programa funciona correctamente con ambas cadenas de prueba:
cNumOnly = "" FOR nCnt = 1 TO LEN(cTest) cCharacter = SUBSTR(cTest, nCnt, 1) IF ISDIGIT(cCharacter) cNumOnly = cNumOnly + cCharacter ENDIF ENDFOR ? cTest ? cNumOnly
Cuando sustituya el nombre de la cadena de prueba por el nombre del campo, el programa ser similar al siguiente:
FOR nCnt = 1 TO LEN(TestField) cCharacter = SUBSTR(TestField, nCnt, 1) IF ISDIGIT(cCharacter) cNumOnly = cNumOnly + cCharacter ENDIF ENDFOR ? TestField ? cNumOnly
Puede ajustar manualmente el puntero de registro si examina la tabla y se desplaza por ella. Cuando el puntero de registro est en cada uno de los registros, el programa funcionar de la forma deseada. O bien, ahora puede envolver el cdigo de desplazamiento por la tabla en el resto de su programa:
SCAN cNumOnly = "" FOR nCnt = 1 TO LEN(TestField) cCharacter = SUBSTR(TestField, nCnt, 1) IF ISDIGIT(cCharacter)
file://C:\temp\~hh52BB.htm
30/05/2000
Pgina 21 de 83
Resultado
123-456-7 89 0 1234567890 456-789 22 45678922 -9221 9220 94321 99922192209432199 000001 98-99-234 0000019899234
Cuando tenga el programa completo, necesitar probarlo con los datos de ejemplo antes de probarlo con los datos reales.
Hay una tabla abierta en el rea de trabajo actual. La tabla tiene un campo de caracteres llamado TestField.
Si la tabla no est abierta en el rea de trabajo actual o si la tabla no tiene un campo de caracteres con
file://C:\temp\~hh52BB.htm
30/05/2000
Pgina 22 de 83
el nombre esperado, el programa generar un mensaje de error y no realizar la tarea prevista. Programa para eliminar los caracteres no numricos de todos los registros de un campo Cdigo
lFieldOK = .F.
Comentarios Esta variable determina si existen las condiciones necesarias para que el programa funcione. Inicialmente se establece la variable como falsa (.F.) para suponer que las condiciones necesarias no existen. Esta seccin de cdigo recorre todos los campos de la tabla actual hasta que encuentra un campo de caracteres llamado TestField. En cuanto se encuentra el campo correcto, lFieldOK se establece como verdadera (.T.) y EXIT finaliza el bucle (no hay ninguna razn para continuar con la comprobacin una vez identificado el campo correcto). Si ningn campo cumple el criterio, lFieldOK seguir siendo falso (.F.). La seccin de conversin del programa slo se ejecuta si en la tabla activa actualmente hay un campo de caracteres llamado TestField. El cdigo de conversin.
FOR nCnt = 1 TO FCOUNT( ) IF FIELD(nCnt) = ; UPPER("TestField") IF TYPE("TestField") = "C" lFieldOK = .T. ENDIF EXIT ENDIF ENDFOR
IF lFieldOK
SCAN cNumOnly = "" FOR nCnt = 1 TO LEN(TestField) cCharacter = ; SUBSTR(TestField, nCnt, 1) IF ISDIGIT(cCharacter) cNumOnly = cNumOnly + ; cCharacter ENDIF ENDFOR
ENDIF
La mayor limitacin de este programa es que slo puede utilizarlo para un campo. Si desea eliminar los caracteres no numricos de un campo distinto de TestField, tendr que recorrer el programa y cambiar cada aparicin de TestField por el nombre del otro campo. Convertir el programa a un procedimiento, segn se explica en las prximas secciones, permite hacer que el cdigo que ha escrito sea ms genrico y ms reutilizable, con lo que ahorrar trabajo ms adelante.
file://C:\temp\~hh52BB.htm
30/05/2000
Pgina 23 de 83
Tradicionalmente, los procedimientos contienen cdigo que usted escribe para realizar una operacin y funciones que calculan y devuelven un valor. En Visual FoxPro, las funciones son similares a los procedimientos:
FUNCTION mifuncin * Esto es un comentario, pero podra ser cdigo ejecutable ENDFUNC
Puede incluir procedimientos y funciones en un archivo de programa distinto o al final de un archivo de programa que contenga cdigo normal de programa. En un archivo de programa no puede tener cdigo ejecutable de programa a continuacin de los procedimientos y las funciones. Si incluye sus procedimientos y funciones en un archivo de programa distinto, podr hacer accesibles estos procedimientos y funciones desde su programa si utiliza el comando SET PROCEDURE TO. Por ejemplo, para un archivo llamado FUNPROC.PRG, utilice el siguiente comando en la ventana Comandos:
SET PROCEDURE TO funproc.prg
O bien
l
Cada uno de estos mtodos puede ampliarse enviando o recibiendo valores desde el procedimiento o la funcin.
file://C:\temp\~hh52BB.htm
30/05/2000
Pgina 24 de 83
Enviar valores a un procedimiento o a una funcin Para enviar valores a procedimientos o funciones se incluyen parmetros. Por ejemplo, el procedimiento siguiente acepta un solo parmetro:
PROCEDURE miproc( cString ) * La lnea siguiente muestra un mensaje MESSAGEBOX ("miproc" + cString) ENDPROC
Nota Incluir los parmetros dentro de los parntesis en la lnea de definicin de un procedimiento o una funcin, por ejemplo PROCEDURE miproc(cString), indica que el parmetro tiene alcance local al procedimiento o la funcin. Tambin puede permitir que una funcin o un procedimiento acepte parmetros de alcance local mediante LPARAMETERS. Los parmetros funcionan de manera idntica en una funcin. Para enviar un valor como un parmetro de este procedimiento o a una funcin, podra utilizar una cadena o una variable que contuviera una cadena, como se muestra en la tabla siguiente. Transferencia de parmetros Cdigo
DO miproc WITH cTestString DO miproc WITH "cadena de prueba"
Comentarios Llama a un procedimiento y transfiere una variable de caracteres o un literal de cadena. Llama a una funcin y transfiere una copia de una cadena literal o una variable de caracteres.
Nota Si llama un procedimiento o funcin sin usar el comando DO, la configuracin de UDFPARMS controla cmo se transfieren los parmetros. De forma predeterminada, UDFPARMS se establece como VALUE, por lo que se transferirn copias de los parmetros. Cuando utilice DO, se emplear el parmetro real (el parmetro se transfiere por referencia) y cualquier cambio realizado en el procedimiento o en la funcin se reflejarn en los datos originales, cualquiera que sea la configuracin de UDFPARMS. Puede enviar mltiples valores a un procedimiento o funcin si los separa mediante comas. Por ejemplo, el siguiente procedimiento espera tres parmetros: una fecha, una cadena de caracteres y un nmero.
PROCEDURE miproc( dDate, cString, nTimesToPrint ) FOR nCnt = 1 to nTimesToPrint ? DTOC(dDate) + " " + cString + " " + STR(nCnt) ENDFOR ENDPROC
file://C:\temp\~hh52BB.htm
30/05/2000
Pgina 25 de 83
Recibir valores desde una funcin El valor devuelto de forma predeterminada es verdadero (.T.), pero puede utilizar el comando RETURN para devolver cualquier valor. Por ejemplo, la siguiente funcin devuelve una fecha correspondiente a dos semanas despus de la fecha que se ha pasado como parmetro.
FUNCTION plus2weeks PARAMETERS dDate RETURN dDate + 14 ENDFUNC
La siguiente lnea de cdigo almacena el valor devuelto desde esta funcin en una variable:
dDeadLine = plus2weeks(DATE())
En la tabla siguiente se muestran las formas en que puede almacenar o mostrar valores devueltos por una funcin. Manipular valores devueltos Cdigo
var = mifuncin( )
Comentarios Almacena en una variable el valor devuelto por la funcin. Imprime en la ventana activa de salida el valor devuelto por la funcin.
? mifuncin( )
Comprobar parmetros en un procedimiento o en una funcin Es conveniente comprobar que los parmetros enviados a su procedimiento o a su funcin son los que espera recibir. Puede utilizar las funciones TYPE( ) y PARAMETERS( ) para comprobar el tipo y el nmero de parmetros enviados a su procedimiento o a su funcin. El ejemplo de la seccin anterior necesita recibir un parmetro de tipo Fecha. Puede utilizar la funcin TYPE( ) para asegurarse de que el valor que su funcin recibe es del tipo adecuado.
FUNCTION plus2weeks( dDate ) IF TYPE("dDate") = "D" RETURN dDate + 14 ELSE MESSAGEBOX( "requiere un parmetro de tipo Fecha" ) RETURN {} && Devuelve una fecha vaca ENDIF ENDFUNC
Si un procedimiento espera menos parmetros de los que recibe, Visual FoxPro generar un mensaje de error. Por ejemplo, si especific dos parmetros pero llam al procedimiento con tres parmetros, obtendr un mensaje de error. Pero si un procedimiento espera ms parmetros de los que recibe, los parmetros adicionales simplemente se inicializarn como falso (.F.). Puesto que no hay ninguna forma de decir si el ltimo parmetro se estableci como falso (.F.) o se omiti, el siguiente file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro procedimiento comprueba que se ha enviado el nmero correcto de parmetros:
PROCEDURE SaveValue( cStoreTo, cNewVal, lIsInTable ) IF PARAMETERS( ) < 3 MESSAGEBOX( "No se han pasado suficientes parmetros". ) RETURN .F. ENDIF IF lIsInTable REPLACE (cStoreTo) WITH (cNewVal) ELSE &cStoreTo = cNewVal ENDIF RETURN .T. ENDPROC
Pgina 26 de 83
Comentarios Principio de la funcin, que acepta una cadena de caracteres. Crea una cadena que slo tiene los caracteres numricos de la cadena original.
cNumOnly = "" FOR nCnt = 1 TO LEN(cMixedVal) cCharacter = ; SUBSTR(cMixedVal, nCnt, 1) IF ISDIGIT(cCharacter) cNumOnly = ; cNumOnly + cCharacter ENDIF ENDFOR
RETURN cNumOnly
ENDFUNC
Adems de permitirle utilizar este cdigo en mltiples situaciones, esta funcin mejora la legibilidad del programa:
SCAN REPLACE FieldName WITH NumbersOnly(FieldName) ENDSCAN
O, ms sencillo an:
REPLACE ALL FieldName WITH NumbersOnly(FieldName)
file://C:\temp\~hh52BB.htm
30/05/2000
Pgina 27 de 83
Cmo avanzar
La programacin por procedimientos, junto con la programacin orientada a objetos y las herramientas de diseo de Visual FoxPro, pueden ayudarle a programar una verstil aplicacin de Visual FoxPro. El resto de este manual explica temas con los que se encontrar a medida que programe aplicaciones de Visual FoxPro. Para obtener ms informacin acerca de la programacin orientada a objetos, consulte el captulo 3, Programacin orientada a objetos. Para aprender a disear formularios con el Diseador de formularios, consulte el captulo 9,Crear formularios.
Disear la aplicacin Crear bases de datos Crear clases Proporcionar acceso a la funcionalidad Proporcionar acceso a la informacin Pruebas y depuracin Para obtener informacin acerca de la programacin de aplicaciones con el Generador de aplicaciones y el Marco de aplicaciones mejorado, vea Programar aplicaciones con el Marco de aplicaciones.
Disear la aplicacin
Un diseo apropiado ahorra tiempo, esfuerzo, dinero y permite mantener la cordura al programar. Cuanto ms implique a los usuarios en el proceso de diseo, mejor. No importa lo cuidadosamente que se disee; aun as, acabar refinando las especificaciones a medida que avance el proyecto y los usuarios le proporcionen informacin adicional. Algunas de las decisiones de diseo que tome afectarn a la forma en que crear elementos de la aplicacin. Quin utilizar la aplicacin? Cul es el centro de actividad del usuario? Con qu cantidad de datos se supone que se trabajar? Se utilizarn servidores de datos de apoyo o los datos sern exclusivamente locales para un nico usuario o para mltiples usuarios a travs de una red? Considere estos factores antes de avanzar demasiado en el proyecto. Actividades frecuentes de usuario
file://C:\temp\~hh52BB.htm
30/05/2000
Pgina 28 de 83
Incluso si sus usuarios finales trabajan con clientes, pedidos y piezas, lo que determinar la forma en que la aplicacin deber tratar los datos es el modo en que los usuarios trabajan con esa informacin. Un formulario de entrada de pedidos, como el de Tastrade.app (en el directorio ...\Samples\Vfp98 \Tastrade de Visual Studio), puede ser necesario para algunas aplicaciones, pero no sera una buena herramienta para administrar inventarios o para hacer un seguimiento de las ventas, por ejemplo. Tamao de la base de datos Deber pensar ms en el rendimiento si trata con grandes conjuntos de datos. En el captulo 15, Optimizar aplicaciones, se explican los mtodos para optimizar el rendimiento. Tambin puede desear ajustar el modo en que los usuarios pueden desplazarse por los datos. Si tiene veinte o treinta registros en una tabla, est bien que permita que los usuarios desplacen el puntero de registro de una tabla un registro cada vez. Si tiene veinte o treinta mil registros, deber proporcionar otros sistemas para obtener los datos deseados: agregar listas o cuadros de dilogos de bsqueda, filtros, consultas personalizadas, etc. El captulo 10, Usar controles, explica la forma de utilizar una lista para seleccionar registros especficos de una tabla. En el captulo 8, Crear vistas, se explica la creacin de consultas parametrizadas. Usuario individual frente a mltiples usuarios Es conveniente crear la aplicacin pensando que mltiples usuarios tendrn acceso simultneo a la base de datos. Visual FoxPro facilita la programacin para acceso compartido. En el captulo 17, Programar para acceso compartido, se describen tcnicas para permitir que varios usuarios tengan acceso simultneo a la base de datos. Consideraciones internacionales Si sabe que su aplicacin slo se utilizar en el entorno de un nico idioma, no debe preocuparse de la internacionalizacin. Por otra parte, si desea ampliar su mercado, o si sus usuarios deben trabajar con datos o configuraciones de entorno internacionales, deber tener en cuenta estos factores al crear la aplicacin. En el captulo 18, Programar aplicaciones internacionales, se explican los puntos que debe tener en cuenta cuando programe aplicaciones internacionales. Datos locales frente a datos remotos Si su aplicacin trata con datos remotos, deber administrarlos de forma diferente a como administrara los datos nativos de Visual FoxPro. En el captulo 8, Crear vistas, se explica la forma de crear vistas para datos locales o remotos. En la parte 6 del Manual del programador, Crear soluciones cliente-servidor, se explica cmo disear aplicaciones que trabajen sin problemas con datos remotos.
Manual del programador, Parte 1: Programacin en Visual FoxPro rescritura. El proceso de creacin de una aplicacin
Pgina 29 de 83
Adems de tener en cuenta la imagen general durante la fase de diseo, tendrn que decidir cules son las funciones necesarias, qu datos estn implicados y cmo debe estar estructurada la base de datos. Tendr que disear una interfaz para que el usuario tenga acceso a la funcionalidad de la aplicacin. Puede crear informes y consultas para que los usuarios puedan extraer informacin til de sus datos.
Iniciar la programacin
Despus de haber pensado qu componentes son necesarios en la aplicacin, es posible que quiera configurar un conjunto de directorios y un proyecto para organizar los archivos componentes que desea crear para la aplicacin. Puede crear el conjunto de directorios mediante el Explorador de Windows y puede crear el proyecto en el Administrador de proyectos o usar el Asistente para aplicaciones para configurarlos a la vez. Este nuevo Asistente para aplicaciones abre el Generador de aplicaciones para que pueda personalizar an ms un proyecto y los componentes que inicie en el Asistente. Por compatibilidad con versiones anteriores, puede elegir el Asistente para aplicaciones (5.0) anterior.
file://C:\temp\~hh52BB.htm
30/05/2000
Pgina 30 de 83
El Administrador de proyectos permite compilar la aplicacin completa. En la fase de programacin de la aplicacin, el Administrador de proyectos facilita el diseo, la modificacin y la ejecucin de los componentes individuales de su aplicacin. El Administrador de proyectos
l l l l
Modificar y ejecutar partes de su aplicacin (formularios, mens, programas) con tan slo algunos clics. Arrastrar clases, tablas y campos desde el Administrador de proyectos hasta el Diseador de formularios o el Diseador de clases. Arrastrar clases entre bibliotecas de clases. Ver y modificar fcilmente sus tablas y bases de datos. Agregar descripciones para los componentes de la aplicacin. Arrastrar y colocar elementos entre proyectos.
Para obtener informacin detallada acerca del uso del Administrador de proyectos, consulte el captulo 1, Introduccin, del Manual del usuario. Para obtener informacin acerca de la compilacin de aplicaciones, consulte el captulo 13, Compilar una aplicacin, en este manual.
Pgina 31 de 83
de disear cualquier componente de interfaz o de manipulacin de datos. La creacin de una estructura slida de la base de datos har que el trabajo de programacin sea mucho ms sencillo. En el captulo 5, Disear bases de datos, el captulo 6, Crear bases de datos y el captulo 7, Trabajar con tablas, se explican los temas de diseo y uso de Visual FoxPro para disear tablas y bases de datos efectivas y eficaces.
Crear clases
Puede crear una aplicacin robusta, orientada a objetos y controlada por eventos utilizando nicamente las clases de base de Visual FoxPro. Es posible que no tenga que crear una clase, pero desear hacerlo. Adems de hacer que el cdigo sea ms manejable y sencillo de mantener, una biblioteca de clases slida le permite crear rpidamente prototipos e incorporar funciones a una aplicacin. Puede crear clases en un archivo de programa, en el Diseador de formularios (mediante el comando Guardar como clase del men Archivo) o en el Diseador de clases. El captulo 3, Programacin orientada a objetos, trata algunos de los beneficios de la creacin de clases y detalla su creacin con el Diseador de clases o mediante programacin.
Manual del programador, Parte 1: Programacin en Visual FoxPro OLE en una aplicacin.
Pgina 32 de 83
Probar y depurar
La prueba y depuracin es algo que la mayora de los programadores hace en cada paso del proceso de desarrollo. Es conveniente probar y depurar a medida se va avanzando. Si crea un formulario, querr asegurarse de que ste hace lo que se desea antes de continuar con otros elementos de su aplicacin. En el captulo 14, Probar y depurar aplicaciones, se explica el uso de las herramientas de depuracin de Visual FoxPro para depurar sus aplicaciones y se ofrecen sugerencias para que el proceso resulte ms sencillo.
Descripcin de los objetos de Visual FoxPro Descripcin de las clases de Visual FoxPro Adaptar la clase a la tarea Crear clases Agregar clases a formularios Definir clases mediante programacin
Cdigo ms compacto. Incorporacin ms sencilla del cdigo a las aplicaciones sin necesidad de elaborar esquemas de asignacin de nombres. Menos complejidad al integrar cdigo de distintos archivos en una aplicacin.
file://C:\temp\~hh52BB.htm
30/05/2000
Pgina 33 de 83
La programacin orientada a objetos es en gran medida un modo de empaquetar cdigo de manera que se pueda volver a utilizar y mantener ms fcilmente. Los paquetes principales se llaman clases.
file://C:\temp\~hh52BB.htm
Pgina 34 de 83
Visible
La tabla siguiente muestra algunos mtodos asociados a una casilla de verificacin: Mtodo Refresh SetFocus Descripcin El valor de la casilla de verificacin se actualiza para reflejar los cambios que se puedan haber producido en el origen de datos subyacente. El enfoque se establece en la casilla de verificacin como si el usuario hubiera presionado la tecla TAB hasta activar la casilla de verificacin.
Consulte el captulo 4, Descripcin del modelo de eventos si desea obtener una explicacin del orden file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro en que se producen los eventos.
Pgina 35 de 83
El encapsulamiento, que empaqueta el cdigo de mtodos y propiedades en un mismo objeto, contribuye a la abstraccin. Por ejemplo, las propiedades que determinan los elementos de un cuadro de lista y el cdigo que se ejecuta al elegir un elemento de la lista pueden encapsularse en un nico control que se agrega a un formulario.
file://C:\temp\~hh52BB.htm
30/05/2000
Pgina 36 de 83
La creacin de subclases es un modo de reducir la cantidad de cdigo que hay que escribir. Puede comenzar definiendo un objeto que sea similar al deseado y personalizarlo.
La herencia no funciona con el hardware, pero s en el software. Si descubre un error en una clase, en lugar de tener que cambiar el cdigo de todas las subclases podr corregirlo una nica vez en la clase y el cambio se propagar a todas las subclases pertenecientes a ella.
file://C:\temp\~hh52BB.htm
30/05/2000
Pgina 37 de 83
Contenedores y no contenedores
Los dos tipos principales de clases de Visual FoxPro y por extensin, de objetos de Visual FoxPro, son las clases de contenedor y las clases de control. Clases de contenedor y clases de control file://C:\temp\~hh52BB.htm 30/05/2000
Pgina 38 de 83
Clases de contenedor Los contenedores pueden incluir otros objetos y permiten el acceso a los objetos que contienen. Por ejemplo, si crea una clase de contenedor que consta de dos cuadros de lista y dos botones de comando y, a continuacin, agrega a un formulario un objeto basado en esta clase, cada objeto individual podr manipularse en tiempo de ejecucin y en tiempo de diseo. Puede cambiar fcilmente las posiciones de los cuadros de lista o los ttulos de los botones de comando. Tambin puede agregar objetos al control en tiempo de diseo; por ejemplo, puede agregar etiquetas para identificar los cuadros de lista. La tabla siguiente muestra los posibles componentes de cada clase de contenedor: Contenedor Grupos de botones de comando Contenedor Control Personalizado Conjuntos de formularios Formularios Columnas de cuadrcula Puede contener Botones de comando Cualquier control Cualquier control Cualquier control, marcos de pgina, contenedor, personalizado Formularios, barras de herramientas Marcos de pgina, cualquier control, contenedores, personalizado Encabezados de columnas, cualquier objeto excepto conjuntos de formularios, formularios, barras de herramientas, cronmetros y otras columnas
file://C:\temp\~hh52BB.htm
30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Cuadrculas Grupos de botones de opcin Marcos de pgina Pginas Proyecto Barras de herramientas Clases de control Columnas de cuadrcula Botones de opcin Pginas Cualquier control, contenedores, personalizado Archivos, servidores
Pgina 39 de 83
Las clases de control estn ms encapsuladas que las clases de contenedor, pero por esa misma razn es posible que sean menos flexibles. Las clases de control no tienen un mtodo AddObject.
Pgina 40 de 83
Visual FoxPro permite crear distintos tipos de clases, cada uno con sus propias caractersticas. Especifique el tipo de clase que desea crear en el cuadro de dilogo Nueva clase o en la clusula AS del comando CREATE CLASS.
* Estas clases son parte integral de un contenedor primario y no pueden usarse como subclases en el Diseador de clases. Todas las clases de base de Visual FoxPro reconocen el siguiente conjunto mnimo de eventos: Evento Init Destroy Error Descripcin Ocurre cuando se crea el objeto. Ocurre cuando el objeto se libera de la memoria. Ocurre siempre que tiene lugar un error en procedimientos de evento o de mtodo de la clase.
Todas las clases de base de Visual FoxPro tienen el siguiente conjunto mnimo de propiedades: Propiedad Class BaseClass Descripcin El tipo de clase de que se trata. La clase de base de la que se deriva, como Form, Commandbutton, Custom, etc.
file://C:\temp\~hh52BB.htm
30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro ClassLibrary ParentClass La biblioteca de clases en la que est almacenada.
Pgina 41 de 83
La clase de la que se deriva la clase actual. Si la clase se deriva directamente de una clase de base de Visual FoxPro, la propiedad ParentClass es la misma que la propiedad BaseClass.
Puede agregar este nuevo botn a cualquier formulario de la aplicacin. Botn de comando personalizado agregado a un formulario
file://C:\temp\~hh52BB.htm
30/05/2000
Pgina 42 de 83
Una clase basada en la clase personalizada de Visual FoxPro no tiene un elemento visual de tiempo de ejecucin. Puede crear mtodos y propiedades para la clase personalizada en el entorno del Diseador de clases. Por ejemplo, podra crear una clase personalizada llamada StrMethods e incluir en ella una serie de mtodos para manipular cadenas de caracteres. Podra agregar esta clase a un formulario con un cuadro de edicin y llamar a los mtodos cuando lo necesitara. Si tuviera un mtodo llamado WordCount, podra llamarlo cuando lo necesitara:
THISFORM.txtCount.Value = ; THISFORM.StrMethods.WordCount(THISFORM.edtText.Value)
Las clases no visuales (como el control personalizado y el control cronmetro) tienen una representacin visual, nicamente en tiempo de diseo, en el Diseador de formularios. Establezca la propiedad de imagen de la clase personalizada como el archivo .bmp que desea mostrar en el Diseador de formularios cuando se agregue la clase personalizada a un formulario.
Crear clases
Puede crear nuevas clases en el Diseador de clases y puede ver cmo ver el usuario cada objeto a medida que lo disea. Para crear una clase nueva
l
En el men Archivo, elija Nuevo, seleccione Clase y elija Nuevo archivo. O bien
El cuadro de dilogo Nueva clase le permite especificar el nombre de la nueva clase, la clase en la que se basa la nueva clase y la biblioteca en la que se almacenar. Crear una clase nueva
file://C:\temp\~hh52BB.htm
30/05/2000
Pgina 43 de 83
Utilice el comando CREATE CLASS. Por ejemplo, para basar una nueva clase, x, en parentclass de Mylibrary.vcx, use el cdigo siguiente:
CREATE CLASS x OF y AS parentclass ; FROM mylibrary
Pgina 44 de 83
El Diseador de clases proporciona la misma interfaz que el Diseador de formularios, que le permite ver y modificar las propiedades de la clase en la ventana Propiedades. La ventana de edicin de cdigo le permite escribir cdigo para que se ejecute cuando ocurran eventos o se llame a mtodos.
file://C:\temp\~hh52BB.htm
30/05/2000
Pgina 45 de 83
1. En el men Clase, elija Nueva propiedad. 2. En el cuadro de dilogo Nueva propiedad, escriba el nombre de la propiedad. 3. Especifique la visibilidad: Public, Protected o Hidden. Puede tener acceso a una propiedad Public desde cualquier lugar de la aplicacin. Las propiedades Protected y Hidden se tratan en "Proteger y ocultar miembros de clase" ms adelante en este mismo captulo. Cuadro de dilogo Nueva propiedad
4. Elija Agregar. Tambin puede incluir una descripcin de la propiedad que aparecer en la parte inferior de la ventana Propiedades en el Diseador de clases y en el Diseador de formularios cuando se agregue el control a un formulario. Solucin de problemas Cuando agregue una propiedad a una clase que un usuario de la clase pueda establecer, el usuario puede introducir un valor incorrecto para la propiedad que cause errores en tiempo de ejecucin. Tiene que documentar de forma explcita los valores vlidos de la propiedad. Si la propiedad puede establecerse como 0, 1 2, por ejemplo, indquelo en el cuadro Descripcin del cuadro de dilogo Nueva propiedad. Tambin es conveniente comprobar el valor de la propiedad en cdigo que haga referencia a ella. Para crear una propiedad de matriz
l
En el cuadro Nombre del cuadro de dilogo Nueva propiedad, especifique el nombre, el tamao y las dimensiones de la matriz. Por ejemplo, para crear una propiedad de matriz llamada mimatriz con diez filas y dos columnas, escriba lo siguiente en el cuadro Nombre:
mimatriz[10,2]
La propiedad de matriz es de slo lectura en tiempo de diseo y se muestra en cursiva en la ventana Propiedades. Se puede administrar y redimensionar en tiempo de ejecucin. Para ver un ejemplo del file://C:\temp\~hh52BB.htm 30/05/2000
Pgina 46 de 83
uso de una propiedad de matriz, consulte "Administrar varias instancias de un formulario" en el captulo 9, Crear formularios. Para agregar un mtodo nuevo a una clase 1. En el men Clase, elija Nuevo mtodo. 2. En el cuadro de dilogo Nuevo mtodo, escriba el nombre del mtodo. 3. Especifique la visibilidad: Public, Protected o Hidden. 4. Seleccione la casilla de verificacin Access para crear un mtodo de Access, seleccione la casilla de verificacin para crear un mtodo Assign o seleccione ambas casillas de verificacin para crear mtodos Access y Assign. Los mtodos Access y Assign le permiten ejecutar cdigo cuando se consulta el valor de una propiedad o cuando se intenta cambiar su valor. El cdigo de un mtodo Access se ejecuta cuando se consulta el valor de una propiedad, generalmente al utilizar la propiedad en una referencia de objeto, al almacenar el valor de una propiedad en una variable o al mostrar el valor de la propiedad con un signo de interrogacin (?). El cdigo de un mtodo Assign se ejecuta cuando intenta modificar el valor de una propiedad, generalmente mediante los comandos STORE o = para asignar un nuevo valor a la propiedad. Para obtener ms informacin acerca de los mtodos Access y Assign, consulte Mtodos Access y Assign. Tambin puede incluir una descripcin del mtodo.
file://C:\temp\~hh52BB.htm
30/05/2000
Pgina 47 de 83
La clase Stopwatch contiene etiquetas y un cronmetro. Valores de las propiedades de la clase Stopwatch Control lblSeconds lblColon1 lblMinutes lblColon2 lblHours tmrSWatch Propiedad Caption Caption Caption Caption Caption Interval Valor 00 : 00 : 00 1000
Esta clase tiene tambin tres propiedades protegidas, nSec, nMin y nHour, as como un mtodo protegido, UpdateDisplay. Los otros tres mtodos personalizados de la clase, Start, Stop y Reset no estn protegidos. Sugerencia Elija Informacin de clase en el men Clase para ver la visibilidad de todas las propiedades y mtodos de una clase. Las propiedades protegidas se utilizan en clculos internos en el mtodo UpdateDisplay y el evento Timer. El mtodo UpdateDisplay establece los ttulos de las etiquetas para que reflejen el tiempo transcurrido. Mtodo UpdateDisplay Cdigo
CSecDisplay = ALLTRIM(STR(THIS.nSec)) cMinDisplay = ALLTRIM(STR(THIS.nMin)) cHourDisplay = ALLTRIM(STR(THIS.nHour))
Comentarios Convierte las propiedades numricas al tipo Character para mostrarlas en los ttulos de etiqueta. Establece los ttulos de etiqueta, 30/05/2000
file://C:\temp\~hh52BB.htm
Pgina 48 de 83
La tabla siguiente muestra el cdigo del evento tmrSWatch.Timer. Evento Timer Cdigo
THIS.Parent.nSec = THIS.Parent.nSec + 1 IF THIS.Parent.nSec = 60 THIS.Parent.nSec = 0 THIS.Parent.nMin = ; THIS.Parent.nMin + 1 ENDIF
Comentarios Incrementa el valor de la propiedad nSec cada vez que se desencadena el evento de cronmetro cada segundo. Si nSec ha llegado a 60, lo restablece a 0 e incrementa la propiedad nMin. Si nMin ha llegado a 60, lo restablece a 0 e incrementa la propiedad nHour. Llama al mtodo UpdateDisplay cuando se establecen los nuevos valores de la propiedad.
La clase Stopwatch tiene tres mtodos que no estn protegidos: Start, Stop y Reset. Un usuario debe poder llamar directamente a estos mtodos para controlar el cronmetro. El mtodo Start contiene la lnea de cdigo siguiente:
THIS.tmrSWatch.Enabled = .T.
El usuario no puede establecer directamente estas propiedades o llamar a este mtodo, pero el cdigo del mtodo Reset s puede hacerlo. Especificar el valor predeterminado para una propiedad file://C:\temp\~hh52BB.htm 30/05/2000
Pgina 49 de 83
Al crear una nueva propiedad, su valor predeterminado es falso (.F.). Para especificar un valor predeterminado distinto para una propiedad, utilice la ventana Propiedades. En la ficha Otras, haga clic en la propiedad y establezca el valor deseado. Este ser el valor inicial de la propiedad cuando se agregue la clase a un formulario o a un conjunto de formularios. Tambin puede establecer cualquiera de las propiedades de clase de base en el Diseador de clases. Cuando un objeto basado en la clase se agregue al formulario, reflejar el valor de su propiedad en lugar del valor de la propiedad de la clase de base de Visual FoxPro. Sugerencia Si desea convertir el valor predeterminado de una propiedad en una cadena vaca, seleccione el valor en el cuadro Edicin de propiedades y presione la tecla RETROCESO.
file://C:\temp\~hh52BB.htm
30/05/2000
Pgina 50 de 83
Una biblioteca de clases puede crearse de una de estas tres formas. Para crear una biblioteca de clases
l
Cuando cree una clase, especifique un nuevo archivo de biblioteca de clases en el cuadro Almacenar en del cuadro de dilogo Nueva clase. O bien
Utilice el comando CREATE CLASS, especificando el nombre de la nueva biblioteca de clases. Por ejemplo, la instruccin siguiente crea una nueva clase llamada miclase y una nueva biblioteca de clases llamada nue_bib:
CREATE CLASS miclase OF nue_bib AS CUSTOM
O bien
l
Utilice el comando CREATE CLASSLIB. Por ejemplo, escriba el comando siguiente en la ventana Comandos para crear una biblioteca de clases llamada nue_bib:
CREATE CLASSLIB nue_bib
Copiar y quitar clases de bibliotecas de clases Cuando agregue una biblioteca de clases a un proyecto, podr copiar clases de una biblioteca a otra con facilidad o, simplemente, quitar clases de las bibliotecas. Para copiar una clase de una biblioteca a otra 1. Asegrese de que ambas bibliotecas estn en un proyecto (no necesariamente en el mismo). 2. En el Administrador de proyectos, seleccione la ficha Clases. 3. Haga clic en el signo ms (+) situado a la izquierda de la biblioteca de clases en la que se encuentra ahora la clase. 4. Arrastre la clase desde la biblioteca original y colquela en la nueva. Sugerencia Es conveniente guardar en una biblioteca de clases una clase y todas las subclases basadas en ella. Si tiene una clase que contiene elementos de muchas bibliotecas de clases distintas, estas bibliotecas debern estar abiertas, por lo que se tardar un poco ms en cargar inicialmente la clase en tiempo de ejecucin y en tiempo de diseo. Para quitar una clase de una biblioteca
file://C:\temp\~hh52BB.htm
30/05/2000
Pgina 51 de 83
Puede utilizar el comando RENAME CLASS para cambiar el nombre de una clase de una biblioteca de clases. Sin embargo, recuerde que cuando cambia el nombre de una clase, los formularios que contienen la clase y las subclases en otros archivos .vcx siguen haciendo referencia al nombre antiguo y no volvern a funcionar correctamente. Visual FoxPro incluye un Examinador de clases para facilitar el uso y la administracin de clases y bibliotecas de clases. Para obtener ms informacin, vea la ventana Examinador de clases.
Pgina 52 de 83
Por ejemplo, un usuario puede agregar a un formulario un objeto basado en su clase y cambiar la propiedad BackColor de blanco a rojo. Si cambia a verde la propiedad BackColor de la clase, el objeto del formulario del usuario seguir teniendo un valor rojo para BackColor. Por otra parte, si el usuario no cambia la propiedad BackColor del objeto y usted cambia a verde el color de fondo de la clase, la propiedad BackColor del objeto del formulario heredar el cambio y tambin ser verde.
Como los cambios se escriben en una tabla almacenada en bfer de forma predeterminada cuando se cierra la tabla, no tiene que agregar cdigo TABLEUPDATE( ) a cmdOk. El cdigo adicional de cmdCancel deshace los cambios realizados a la tabla antes de llamar al cdigo de cmdOk, la clase primaria, para liberar el formulario.
Pgina 53 de 83
La propiedad ActiveForm del objeto aplicacin (_VFP) le permite manipular el formulario activo aunque no conozca su nombre. Por ejemplo, la siguiente lnea de cdigo cambia el color de fondo del formulario activo, independientemente del conjunto de formularios al que pertenezca:
_VFP.ActiveForm.BackColor = RGB(255,255,255)
De forma similar, la propiedad ActiveControl permite manipular el control activo del formulario activo. Por ejemplo, la expresin siguiente introducida en la ventana Inspeccin muestra el nombre del control activo de un formulario a medida que se eligen interactivamente los distintos controles:
_VFP.ActiveForm.ActiveControl.Name
Referencias relativas
file://C:\temp\~hh52BB.htm
30/05/2000
Pgina 54 de 83
Cuando haga referencia a objetos desde la jerarqua de contenedores (por ejemplo, en el evento Click de un botn de comando de un formulario perteneciente a un conjunto de formularios), puede utilizar algunos mtodos abreviados para identificar el objeto que desea manipular. La tabla siguiente indica las propiedades o las palabras clave que facilitan la referencia a un objeto desde la jerarqua del objeto: Propiedad o palabra clave Parent THIS THISFORM THISFORMSET Referencia El contenedor ms inmediato del objeto El objeto El formulario que contiene el objeto El conjunto de formularios que contiene el objeto
Nota Slo puede utilizar THIS, THISFORM y THISFORMSET en cdigo de mtodos y eventos. La tabla siguiente proporciona ejemplos del uso de THISFORMSET, THISFORM, THIS y Parent para establecer propiedades de objetos: Comando
THISFORMSET.frm1.cmd1.Caption = "Aceptar"
Dnde incluir el comando En el cdigo de evento o de mtodo de cualquier control de cualquier formulario del conjunto de formularios. En el cdigo de evento o de mtodo de cualquier control del mismo formulario en el que est cmd1. En el cdigo de evento o de mtodo del control cuyo ttulo desee cambiar. En el cdigo de evento o de mtodo de un control de un formulario. El comando cambia a rojo oscuro el color de fondo del formulario.
THISFORM.cmd1.Caption = "Aceptar"
THIS.Caption = "Aceptar"
THIS.Parent.BackColor = RGB(192,0,0)
Establecer propiedades
Las propiedades de un objeto pueden establecerse en tiempo de ejecucin o en tiempo de diseo. Para establecer una propiedad
l
file://C:\temp\~hh52BB.htm
30/05/2000
Pgina 55 de 83
Por ejemplo, las instrucciones siguientes establecen varias propiedades de un a cuadro de texto llamado txtDate en un formulario llamado frmPhoneLog:
frmPhoneLog.txtDate.Value = DATE( ) && Muestra la frmPhoneLog.txtDate.Enabled = .T. && El control frmPhoneLog.txtDate.ForeColor = RGB(0,0,0) frmPhoneLog.txtDate.BackColor = RGB(192,192,192) fecha actual est activado && texto en negro && fondo en gris
Para la configuracin de propiedades de los ejemplos anteriores, frmPhoneLog es el objeto contenedor de mayor nivel. Si frmPhoneLog estuviera incluido en un conjunto de formularios, tambin debera incluir el conjunto de formularios en la ruta de acceso primaria:
frsContacts.frmPhoneLog.txtDate.Value = DATE( )
Llamar a mtodos
Una vez creado un objeto, puede llamar a los mtodos de ese objeto desde cualquier lugar de la aplicacin. Para llamar a un mtodo
l
Las instrucciones siguientes llaman a mtodos para mostrar un formulario y establecer el enfoque en un cuadro de texto:
frsFormSet.frmForm1.Show frsFormSet.frmForm1.txtGetText1.SetFocus
Los mtodos que devuelven valores y se utilizan en expresiones deben terminar en parntesis de apertura y de cierre. Por ejemplo, la instruccin siguiente establece el ttulo de un formulario como el valor devuelto por el mtodo definido por el usuario GetNewCaption:
Form1.Caption = Form1.GetNewCaption( )
file://C:\temp\~hh52BB.htm
30/05/2000
Pgina 56 de 83
Nota Los parmetros transferidos a mtodos deben incluirse entre parntesis despus del nombre del mtodo; por ejemplo, Form1.Show(nStyle). transfiere nStyle al cdigo del mtodo Show de Form1.
Responder a eventos
El cdigo incluido en un procedimiento de evento se ejecuta cuando se produce el evento. Por ejemplo, el cdigo incluido en el procedimiento de evento Click de un botn de comando se ejecutar cuando el usuario haga clic en el botn de comando. Puede activar los eventos Click, DblClick, MouseMove y DragDrop con el evento MOUSE o usar el comando ERROR para generar eventos Error y el comando KEYBOARD para generar eventos KeyPress. No puede hacer que se produzca ningn otro evento mediante programacin, pero s puede llamar al procedimiento asociado con el evento. Por ejemplo, la instruccin siguiente hace que se ejecute el cdigo del evento Activate de frmPhoneLog, pero no activa el formulario:
frmPhoneLog.Activate
Si desea activar el formulario, utilice el mtodo Show del formulario. Al llamar al mtodo Show se mostrar y activar el formulario, momento en el que tambin se ejecutar el cdigo del evento Activate:
frmPhoneLog.Show
file://C:\temp\~hh52BB.htm
30/05/2000
Pgina 57 de 83
Comentarios Establece como biblioteca de clases el archivo .vcx en el que se guard la definicin del formulario. La palabra clave ADDITIVE impide que este comando cierre otras bibliotecas de clases que estuvieran abiertas. Este cdigo supone que el nombre de la clase de formulario guardada en la biblioteca de clases es FormPrueba. Muestra el formulario.
frmTest.Show
file://C:\temp\~hh52BB.htm
30/05/2000
Pgina 58 de 83
Por ejemplo, la siguiente definicin de clase se basa en un formulario. El comando ADD OBJECT agrega dos botones de comando al formulario:
DEFINE CLASS miform AS FORM ADD OBJECT cmdOK AS COMMANDBUTTON ADD OBJECT PROTECTED cmdCancel AS COMMANDBUTTON ENDDEFINE
Utilice el mtodo AddObject para agregar objetos a un contenedor despus de crear el objeto contenedor. Por ejemplo, las lneas de cdigo siguientes crean un objeto formulario y le agregan dos botones de comando:
frmMessage = CREATEOBJECT("FORM") frmMessage.AddObject("txt1", "TEXTBOX") frmMessage.AddObject("txt2", "TEXTBOX")
Tambin puede utilizar el mtodo AddObject en el cdigo de mtodo de una clase. Por ejemplo, la definicin de clase siguiente utiliza AddObject en el cdigo asociado al evento Init para agregar un control a una columna de cuadrcula.
DEFINE CLASS micuad AS GRID ColumnCount = 3 PROCEDURE Init THIS.Column2.AddObject("cboCliente", "COMBOBOX") THIS.Column2.CurrentControl = "cboCliente" ENDPROC ENDDEFINE
El conjunto de eventos para las clases de base de Visual FoxPro es limitado y no puede ampliarse. 30/05/2000
file://C:\temp\~hh52BB.htm
Pgina 59 de 83
Todas las clases reconocen un conjunto limitado de eventos predeterminados, que incluye como mnimo los eventos Init, Destroy y Error. Al crear en una definicin de clase un mtodo con el mismo nombre que un evento reconocible por la clase, el cdigo del mtodo se ejecutar cuando se produzca el evento. Puede agregar mtodos a las clases mediante la creacin de un procedimiento o una funcin en la definicin de clase. Puede crear mtodos Access y Assign para sus clases si crea un procedimiento o una funcin con el mismo nombre que una propiedad de clase y anexa _ACCESS o _ASSIGN al nombre de procedimiento o de funcin.
Al agregar un objeto basado en esta clase a un formulario llamado, por ejemplo, cmdInferior1, podra decidir que tambin desea mostrar un mensaje para informar al usuario de que el puntero de registro est en la parte inferior de la tabla. Podra agregar el cdigo siguiente al evento Click del objeto para mostrar el mensaje:
WAIT WINDOW "En la parte inferior de la tabla" TIMEOUT 1
Sin embargo, al ejecutar el formulario se muestra el mensaje, pero el puntero de registro no se mueve porque nunca se ejecuta el cdigo del evento Click de la clase primaria. Para asegurarse de que tambin se ejecuta el cdigo del evento Click de la clase primaria, incluya las siguientes lneas de cdigo en el procedimiento del evento Click del objeto:
DODEFAULT( ) WAIT WINDOW "En la parte inferior de la tabla" TIMEOUT 1
Nota Puede utilizar la funcin ACLASS( ) para determinar todas las clases de la jerarqua de clases de un objeto.
Pgina 60 de 83
KeyPress de un cuadro de texto para impedir que se muestren en el cuadro los caracteres escritos:
frmKeyExample = CREATEOBJECT("prueba") frmKeyExample.Show READ EVENTS DEFINE CLASS prueba AS FORM ADD OBJECT texto1 AS TEXTBOX PROCEDURE texto1.KeyPress PARAMETERS nKeyCode, nShiftAltCtrl NODEFAULT IF BETWEEN(nKeyCode, 65, 122) && entre 'A' y 'z' This.Value = ALLTRIM(This.Value) + "*" ACTIVATE SCREEN && enviar el resultado a la ventana principal de Visual FoxPro ?? CHR(nKeyCode) ENDIF ENDPROC PROCEDURE Destroy CLEAR EVENTS ENDPROC ENDDEFINE
Diseo de los botones de desplazamiento Todos los botones tendrn algunas caractersticas y funciones comunes, por lo que es conveniente crear una clase de botones de desplazamiento. A continuacin, los botones individuales pueden aprovechar fcilmente esta apariencia y funcionalidad comunes. Esta clase primaria es la clase NavButton que se definir posteriormente en esta seccin. Una vez definida la clase primaria, las subclases siguientes definen la funcionalidad y apariencia especficas de cada uno de los cuatro botones de desplazamiento: navTop, navPrior, navNext,
navBottom.
Por ltimo se crea una clase de contenedor vcr, a la que se agregan todos los botones de desplazamiento. El contenedor puede agregarse a un formulario o una barra de herramientas para proporcionar funcionalidad de desplazamiento por tablas. Definicin de la clase NAVBUTTON Para crear NavButton, guarde las seis definiciones de clase siguientes (Navbutton, navTop, navBottom, navPrior, navNext y vcr) en un archivo de programa como Navclass.prg. Definicin de la clase genrica botn de comando de desplazamiento
file://C:\temp\~hh52BB.htm
30/05/2000
Pgina 61 de 83
Cdigo
DEFINE CLASS NavButton AS COMMANDBUTTON Height = 25 Width = 25 TableAlias = ""
Comentarios Define la clase primaria de los botones de desplazamiento. Asigna dimensiones a la clase. Incluye una propiedad personalizada, TableAlias, que contiene el nombre del alias por el que desplazarse.
Si se ha establecido TableAlias, este procedimiento de clase priamria selecciona el alias antes de ejecutar el cdigo real de desplazamiento en las subclases. De lo contrario, se supondr que el usuario desea desplazarse por la tabla del rea de trabajo seleccionada actualmente. Al emplear _SCREEN.ActiveForm.Refresh en lugar de THISFORM.Refresh puede agregar la clase a un formulario o una barra de herramientas y hacer que funcione con la misma precisin. Finaliza la definicin de clase.
ENDDEFINE
Los botones de desplazamiento especficos se basan en la clase NavButton. El cdigo siguiente define el botn Superior para el conjunto de botones de desplazamiento. Los tres botones de desplazamiento restantes se definen en la tabla siguiente. Las cuatro definiciones de clase son similares. Por ello, slo se ofrecen comentarios extensos para la primera definicin. Definicin de la clase botn de desplazamiento Superior Cdigo
DEFINE CLASS navTop AS BotDespl Caption = "|<"
Comentarios Define la clase botn de desplazamiento Superior y establece la propiedad Caption. Crea cdigo de mtodo que se ejecutar cuando se produzca el evento Click para el control. Llama al cdigo de evento Click de la clase primaria, Navbutton, de modo que se pueda seleccionar el alias adecuado si se ha establecido la propiedad TableAlias. Incluye el cdigo para establecer el puntero de registro en el primer registro de la tabla: GO TOP.
PROCEDURE Click
DODEFAULT( )
GO TOP
THIS.RefreshForm
file://C:\temp\~hh52BB.htm
30/05/2000
Pgina 62 de 83
Llama al mtodo RefreshForm de la clase primaria. No es necesario utilizar el operador de resolucin de alcance (::) en este caso porque no hay ningn mtodo en la subclase que tenga el mismo nombre que el mtodo de la clase primaria. Por otra parte, tanto la clase primaria como la subclase tienen cdigo de mtodo para el evento Click.
ENDPROC
ENDDEFINE
Los restantes botones de desplazamiento tienen definiciones de clase similares. Definicin de las dems clases de botones de desplazamiento Cdigo
DEFINE CLASS navNext AS Navbutton Caption = ">"
PROCEDURE Click DODEFAULT( ) SKIP 1 IF EOF( ) GO BOTTOM ENDIF THIS.RefreshForm ENDPROC ENDDEFINE
PROCEDURE Click DODEFAULT( ) SKIP -1 IF BOF( ) GO TOP ENDIF THIS.RefreshForm ENDPROC ENDDEFINE
file://C:\temp\~hh52BB.htm
30/05/2000
Pgina 63 de 83
Incluye el cdigo para establecer el puntero de registro en el ltimo registro de la tabla. Termina la definicin de clase.
La siguiente definicin de clase contiene los cuatro botones de desplazamiento para poder agregarlos como una unidad a un formulario. La clase tambin incluye un mtodo para establecer la propiedad TableAlias de los botones. Definicin de una clase de controles de desplazamiento por tabla Cdigo
DEFINE CLASS vcr AS CONTAINER Height = 25 Width = 100 Left = 3 Top = 3
Comentarios Comienza la definicin de clase. La propiedad Height se establece en el mismo alto que los botones de comando que contendr. Agrega los botones de desplazamiento.
ADD OBJECT cmdTop AS navTop ; WITH Left = 0 ADD OBJECT cmdPrior AS navPrior ; WITH Left = 25 ADD OBJECT cmdNext AS navNext ; WITH Left = 50 ADD OBJECT cmdBot AS navBottom ; WITH Left = 75
PROCEDURE SetTable(cTableAlias) IF TYPE("cTableAlias") = 'C' THIS.cmdTop.TableAlias = ; cTableAlias THIS.cmdPrior.TableAlias = ; cTableAlias THIS.cmdNext.TableAlias = ; cTableAlias THIS.cmdBot.TableAlias = ; cTableAlias ENDIF ENDPROC
Este mtodo se utiliza para establecer la propiedad TableAlias de los botones. TableAlias se define en la clase primaria Navbutton. Tambin podra utilizar el mtodo SetAll para establecer esta propiedad:
IF TYPE ("cTableAlias") = 'C' This.SetAll("TableAlias", "cTableAlias") ENDIF
Sin embargo, esto producira un error si se agregara a la clase un objeto que no tuviera la propiedad TableAlias.
ENDDEFINE
file://C:\temp\~hh52BB.htm
30/05/2000
Pgina 64 de 83
Crear una subclase basada en la nueva clase Tambin puede crear subclases basadas en vcr que tengan botones adicionales como Buscar, Modificar, Guardar y Salir. Por ejemplo, vcr2 incluye un botn Salir: Botones de desplazamiento por tablas con un botn para cerrar el formulario
ENDDEFINE
tiene todo lo de vcr ms el nuevo botn de comando y no es necesario volver a escribir ninguna parte del cdigo.
Vcr2
Cambios en VCR reflejados en la subclase A causa de la herencia, los cambios realizados en la clase primaria se reflejan en todas las subclases que se basan en ella. Por ejemplo, puede informar al usuario de que se ha llegado al final de la tabla si cambia la instruccin IF EOF( ) de navNext.Click por la siguiente:
IF EOF( ) GO BOTTOM SET MESSAGE TO "Final de la tabla" ELSE SET MESSAGE TO ENDIF
Puede indicar al usuario que ha llegado al principio de la tabla si cambia la instruccin IF BOF( ) de navPrior.Click por la siguiente:
IF BOF()
file://C:\temp\~hh52BB.htm
30/05/2000
Pgina 65 de 83
Si se realizan estos cambios en las clases navNext y navPrior, tambin se aplicarn automticamente a los botones apropiados de vcr y vcr2. Agregar vcr a una clase de formulario Una vez definido vcr como un control, el control puede agregarse a la definicin de un contenedor. Por ejemplo, el cdigo siguiente agregado a Navclass.prg define un formulario al que se han agregado botones de desplazamiento:
DEFINE CLASS NavForm AS Form ADD OBJECT oVCR AS vcr ENDDEFINE
Ejecutar el formulario que contiene VCR Una vez definida la subclase de formulario, podr mostrarla fcilmente con los comandos apropiados. Para mostrar el formulario 1. Cargue la definicin de clase:
SET PROCEDURE TO navclass ADDITIVE
Si no llama al mtodo SetTable de oVCR (el objeto VCR de NavForm), cuando el usuario haga clic en los botones de desplazamiento el puntero de registro se mover por la tabla del rea de trabajo seleccionada actualmente. Puede llamar al mtodo SetTable para especificar en qu tabla se va a desplazar.
frmPrueba.oVCR.SetTable("customer")
Nota Cuando el usuario cierre el formulario, frmPrueba se establecer a un valor nulo (.NULL.). Para liberar de la memoria la variable de objeto, utilice el comando RELEASE. Las variables de objeto creadas en los archivos de programa se liberan de la memoria cuando se completa el programa.
file://C:\temp\~hh52BB.htm
30/05/2000
Pgina 66 de 83
control. El control predeterminado contenido en una columna es un cuadro de texto, por lo que la funcionalidad predeterminada de la cuadrcula se aproxima a una ventana Examinar. Sin embargo, la arquitectura subyacente de la cuadrcula la abre hasta una extensin ilimitada. El ejemplo siguiente crea un formulario que contiene un objeto Grid (Cuadrcula) con dos columnas. La segunda columna contiene una casilla de verificacin para mostrar los valores en un campo lgico de una tabla. Control Grid (Cuadrcula) con una casilla de verificacin en una columna
Definicin de una clase Grid con una casilla de verificacin en una columna de cuadrcula Cdigo
DEFINE CLASS grdProducts AS Grid Left = 24 Top = 10 Width = 295 Height = 210 Visible = .T. RowHeight = 28 ColumnCount = 2
Comentarios Comienza la definicin de clase y establece las propiedades que determinan la apariencia de la cuadrcula. Al establecer la propiedad ColumnCount en 2, se agregan dos columnas a la cuadrcula. Cada columna contiene un encabezado con el nombre Header1. Adems, cada columna tiene un grupo de propiedades independiente que determina su apariencia y comportamiento. Al establecer la propiedad ControlSource de una columna, la columna muestra los valores de ese campo para todos los registros de la tabla. Discontinu es un campo lgico. Column2 contendr la casilla de verificacin. Establezca la propiedad Sparse de la columna 30/05/2000
Column2.Sparse = .F.
file://C:\temp\~hh52BB.htm
Pgina 67 de 83
en .F. de modo que la casilla de verificacin sea visible en todas las filas, no slo en la celda seleccionada.
Procedure Init THIS.Column1.Width = 175 THIS.Column2.Width = 68 THIS.Column1.Header1.Caption = ; "Nombre de producto" THIS.Column2.Header1.Caption = ; "Suspendido" THIS.Column2.AddObject("chk1", ; "checkbox") THIS.Column2.CurrentControl = ; "chk1" THIS.Column2.chk1.Visible = .T. THIS.Column2.chk1.Caption = "" ENDPROC
El mtodo AddObject permite agregar un objeto a un contenedor ; en este caso, una casilla de verificacin llamada chk1. Establece la propiedad CurrentControl de la columna en la casilla de verificacin, de modo que se muestre la casilla de verificacin. Comprueba que la casilla de verificacin es visible. Establece el ttulo en una cadena vaca de modo que no se muestre el ttulo predeterminado "chk1". Termina la definicin de clase.
ENDDEFINE
La siguiente definicin de clase es el formulario que contiene la cuadrcula. Ambas definiciones de clase pueden incluirse en el mismo archivo de programa. Definicin de una clase Form que contiene la clase Grid Cdigo
DEFINE CLASS GridForm AS FORM Width = 330 Height = 250 Caption = "Ejemplo de cuadrcula" ADD OBJECT grid1 AS grdProducts
Comentarios Crea una clase de formulario y le agrega un objeto basado en la clase de cuadrcula.
El programa que crea un objeto basado en esta clase utilizar READ EVENTS. Al incluir CLEAR EVENTS en el evento Destroy del formulario, el programa podr terminar cuando el usuario cierre el formulario. Termina la definicin de clase.
file://C:\temp\~hh52BB.htm
30/05/2000
Pgina 68 de 83
El programa siguiente abre la tabla donde estn incluidos los campos que se van a mostrar en las columnas de cuadrcula, crea un objeto basado en la clase GridForm y ejecuta el comando READ EVENTS.
CLOSE DATABASE OPEN DATABASE (SYS(2004) + "samples\data\testdata.dbc") USE products frmTest= CREATEOBJECT("GridForm") frmTest.Show READ EVENTS
Este programa puede incluirse en el mismo archivo en el que estn incluidas las definiciones de clase si aparece al principio del archivo. Tambin puede emplear el comando SET PROCEDURE TO para especificar el programa que contiene las definiciones de clase e incluir este cdigo en un programa distinto.
El programa siguiente establece una referencia al objeto creado en Newin.prg. La variable de referencia puede manipularse exactamente del mismo modo que la variable de objeto:
frmInvoice = NewInv() && almacena la referencia al objeto en una variable frmInvoice.SHOW
Tambin puede crear una referencia a un objeto de un formulario, como en el ejemplo siguiente.
txtCustName = frmInvoice.txtCompany txtCustName.Value = "Usuario de Fox"
Sugerencia Cuando ha creado un objeto, puede usar el comando DISPLAY OBJECTS para mostrar la jerarqua de clases del objeto, los valores de las propiedades, los objetos contenidos y los mtodos y eventos disponibles. Puede llenar una matriz con las propiedades (no los valores de las propiedades), eventos, mtodos y objetos contenidos de un objeto con la funcin AMEMBERS( ). file://C:\temp\~hh52BB.htm 30/05/2000
Pgina 69 de 83
Sin embargo, puesto que sigue existiendo una referencia a un objeto perteneciente a frmFactura, el objeto no se liberar de la memoria hasta que se libere txtNombrePers con el comando siguiente:
RELEASE txtNombrePers
Nota El comando ISNULL( ) es necesario porque .NULL. se almacena en la variable de objeto de formulario cuando un usuario cierra un formulario, pero el tipo de variable sigue siendo "O".
Cuando un usuario hace clic en un control incluido en una matriz de controles, Visual FoxPro transfiere el nmero de ndice del control al procedimiento de evento Click. En este procedimiento,
file://C:\temp\~hh52BB.htm
30/05/2000
Pgina 70 de 83
puede utilizar una instruccin CASE para ejecutar cdigo distinto segn el botn en el que se haya hecho clic.
Hay una serie de consideraciones que conviene tener en cuenta con respecto a las matrices de objetos:
l
No se puede asignar un objeto a una matriz completa mediante un comando. Es necesario asignar individualmente el objeto a cada miembro de la matriz. No se puede asignar un valor a una propiedad de una matriz completa. El comando siguiente producira un error:
MiMatriz.Enabled = .F.
Al redimensionar una matriz de objetos para que sea ms grande que la matriz original, los elementos nuevos se inicializarn como falso (.F.), como ocurre con todas las matrices de Visual FoxPro. Cuando redimensione una matriz de objetos para que sea ms pequea que la matriz original, se liberarn los objetos cuyo subndice sea mayor que el mayor subndice nuevo.
Sin embargo, los datos almacenados en objetos que se basan en la clase de cliente slo se almacenan en memoria. Si estos datos estuvieran en una tabla, sta se almacenara en disco. Si tuviera que hacer un seguimiento de varios clientes, la tabla le dara acceso a todos los comandos y las funciones de administracin de bases de datos de Visual FoxPro. De este modo, podra localizar informacin rpidamente, ordenarla, agruparla, realizar clculos, crear informes y consultas basndose en la file://C:\temp\~hh52BB.htm 30/05/2000
Pgina 71 de 83
Visual FoxPro ofrece un resultado incomparable en cuanto al almacenamiento y la manipulacin de datos de bases de datos y tablas. Sin embargo, en determinadas ocasiones desear almacenar datos en objetos. Generalmente, los datos slo sern significativos mientras se est ejecutando la aplicacin y pertenecern a una nica entidad. Por ejemplo, en una aplicacin que incluye un sistema de seguridad, normalmente tendra una tabla de los usuarios que tienen acceso a la aplicacin. La tabla incluira la identificacin, la contrasea y el nivel de acceso del usuario. Cuando un usuario haya iniciado una sesin no necesitar toda la informacin de la tabla. Lo nico que necesitar es la informacin sobre el usuario actual y esta informacin se puede almacenar y manipular fcilmente en un objeto. Por ejemplo, la definicin de clase siguiente inicia una sesin al crear un objeto basado en la clase:
DEFINE CLASS NuevoUsuario AS CUSTOM PROTECTED LogonTime, AccessLevel UserId = "" PassWord = "" LogonTime = { - - : : } AccessLevel = 0 PROCEDURE Init DO FORM LOGON WITH ; && suponiendo que ha creado este formulario This.UserId, ; This.PassWord, ; This.AccessLevel This.LogonTime = DATETIME( ) ENDPROC * Crear mtodos para devolver valores de propiedad protegidos. PROCEDURE GetLogonTime RETURN This.LogonTime ENDPROC PROCEDURE GetAccessLevel RETURN This.AccessLevel ENDPROC ENDDEFINE
En cualquier parte de la aplicacin, cuando necesite informacin sobre el usuario actual, podr obtenerla del objeto oUser. Por ejemplo:
IF oUser.GetAccessLevel( ) >= 4 DO ADMIN.MPR ENDIF
file://C:\temp\~hh52BB.htm
30/05/2000
Pgina 72 de 83
Propiedades para integrar datos de clases y bases de datos de Visual FoxPro Clase Cuadrcula Todos los dems controles Cuadro de lista y cuadro combinado Formulario y conjunto de formularios Propiedades de datos RecordSource, ChildOrder, LinkMaster ControlSource ControlSource, RowSource DataSession
Puesto que estas propiedades de datos pueden cambiarse en tiempo de diseo o en tiempo de ejecucin, puede crear controles genricos con funcionalidad encapsulada que opere con datos diversos. Para obtener ms informacin sobre la integracin de datos y objetos, consulte el captulo 9, Crear formularios y el captulo 10, Usar controles.
Pgina 73 de 83
Cundo se desencadena el evento Al crear un objeto. Al liberar de la memoria un objeto. Cuando el usuario hace clic en el objeto con el botn principal del mouse. Cuando el usuario hace doble clic en el objeto con el botn principal del mouse. Cuando el usuario hace clic en el objeto con el botn secundario del mouse. Cuando el objeto recibe el enfoque, ya sea como resultado de una accin del usuario o al hacer clic, o porque se cambie el enfoque en el cdigo mediante el mtodo SetFocus. Cuando el objeto pierde el enfoque, ya sea como resultado de una accin del usuario o al hacer clic, o porque se cambie el enfoque en el cdigo mediante el mtodo SetFocus. Cuando el usuario presiona y suelta una tecla. Cuando el usuario presiona el botn del mouse mientras el puntero del mouse se encuentra sobre el objeto. Cuando el usuario mueve el mouse sobre el objeto. Cuando el usuario libera un botn del mouse mientras el puntero del mouse se encuentra sobre el objeto.
LostFocus
Contenedores y eventos de objeto A la hora de escribir cdigo de eventos para los controles se deben tener en cuenta dos reglas bsicas:
l l
Los contenedores no procesan los eventos asociados a los controles que contienen. Si no hay cdigo de evento asociado a un control, Visual FoxPro comprobar si hay cdigo asociado al evento en algn nivel superior de la jerarqua de clase para dicho control.
Cuando un usuario interacta con un objeto de alguna forma, ya sea presionando la tecla tab, haciendo clic en l, moviendo el puntero del mouse sobre l, etc., tienen lugar los eventos de objeto. Cada objeto recibe sus eventos de forma independiente. Por ejemplo, aunque un botn de comando se encuentre en un formulario, el evento Click del formulario no se desencadenar cuando un usuario haga clic en el botn de comando; slo se desencadenar el evento Click del botn de comando. El cdigo de evento del contenedor es distinto del cdigo de evento del control
file://C:\temp\~hh52BB.htm
30/05/2000
Pgina 74 de 83
Si no hay ningn cdigo de evento Click asociado al botn de comando, cuando el usuario haga clic en el botn no ocurrir nada, incluso cuando haya un cdigo de evento Click asociado al formulario. Esta regla tambin es aplicable a los controles cuadrcula. La cuadrcula contiene columnas que a su vez contienen encabezados y controles. Cuando ocurren los eventos, slo el objeto ms interno implicado en el evento reconoce el evento. Los contenedores de mayor nivel no reconocen el evento. La ilustracin siguiente muestra qu objetos procesan los eventos MouseMove que se generan cuando un usuario mueve el puntero del mouse por la cuadrcula. Eventos MouseMove para una cuadrcula
No obstante, hay una excepcin a esta regla. Si ha escrito cdigo de evento para un grupo de botones de opcin o para un grupo de botones de comando pero no hay cdigo para el evento en un determinado botn del grupo, el cdigo de evento del grupo se ejecutar cuando se produzca el evento del botn. Por ejemplo, podra tener un grupo de botones de opcin con un cdigo de evento Click asociado. Slo uno de los dos botones de opcin del grupo tienen asociado cdigo de evento Click:
file://C:\temp\~hh52BB.htm
30/05/2000
Pgina 75 de 83
El cdigo de evento para los grupos de botones puede utilizarse como valor predeterminado
Si un usuario hace clic en Opcin1, se ejecutar el cdigo de evento Click asociado a Opcin1. El cdigo de evento Click asociado al grupo de botones de opcin no se ejecutar. Puesto que no hay cdigo de evento Click asociado a Opcin2, si el usuario hace clic en Opcin2 se ejecutar el cdigo de evento Click del grupo de opciones. Nota Cuando se inicia una secuencia de eventos, como MouseDown y MouseUp, para un control, toda la secuencia de eventos pertenece al control. Por ejemplo, si presiona el botn primario del mouse en un botn de comando y arrastra el puntero del mouse hacia fuera del botn de comando, los eventos MouseMove del botn de comando seguirn producindose, aunque el puntero del mouse se est moviendo fuera del formulario. Si suelta el botn primario del mouse sobre el formulario en lugar de hacerlo sobre el botn de comando, el evento MouseUp que ocurrir ser el asociado al botn de comando, no al formulario. Clases y eventos de controles Si un control de un formulario est basado en una clase definida por el usuario (que, a su vez, est basada en otra clase definida por el usuario), cuando se produzca un evento, Visual FoxPro comprobar el cdigo de evento del control inmediato. Si hay cdigo en ese procedimiento de evento, Visual FoxPro lo ejecutar. Si no existe cdigo en el procedimiento de evento, Visual FoxPro comprobar un nivel superior en la jerarqua de clases. Si en algn lugar de la jerarqua de clases Visual FoxPro encuentra cdigo para el evento, se ejecutar dicho cdigo. Cualquier cdigo que haya ms all dentro de la jerarqua no se ejecutar. Si no hay cdigo de evento asociado a un objeto, Visual FoxPro comprobar la clase primaria.
file://C:\temp\~hh52BB.htm
30/05/2000
Pgina 76 de 83
No obstante, puede incluir cdigo en un procedimiento de evento y llamar explcitamente al cdigo en clases en las cuales se base el control; para ello se utiliza la funcin DODEFAULT( ).
file://C:\temp\~hh52BB.htm
30/05/2000
Pgina 77 de 83
Nota En este ejemplo, los eventos MouseMove y Paint han sido eliminados de la lista Eventos para seguir porque ocurren con tanta frecuencia que hacen ms difcil ver las secuencias de los otros eventos.
En esta situacin de ejemplo, el usuario realiza las siguientes acciones en el formulario: 1. Ejecuta el formulario.
file://C:\temp\~hh52BB.htm
30/05/2000
Pgina 78 de 83
2. Escribe texto en Text1. 3. Selecciona el campo y lo copia al Portapapeles. 4. Va a Text2. 5. Pega el texto en Text2. 6. Cierra el formulario haciendo clic en Command2. Estas acciones desencadenan uno o ms eventos del sistema para cada objeto. En las tablas siguientes se describen los eventos desencadenados como respuesta a cada accin del usuario. Accin 1 El usuario ejecuta el formulario escribiendo el siguiente comando en la ventana Comandos:
DO FORM form1 NAME frmObject
Visual FoxPro carga el formulario, inicializa cada objeto y despus inicializa el formulario; el formulario se activa y el primer campo recibe el enfoque de entrada. Objeto DataEnvironment Form1 DataEnvironment Text1 Text2 Command1 Command2 Form1 Form1 Form1 Text1 Text1 Accin 2 El usuario escribe Test en Text1. Cada pulsacin de teclas genera dos eventos. El evento KeyPress Evento BeforeOpenTables Load Init Init Init Init Init Init Activate GotFocus When GotFocus
file://C:\temp\~hh52BB.htm
30/05/2000
Pgina 79 de 83
recibe 2 parmetros: la tecla presionada y el estado de las teclas MAYS, ALT y CTRL. Objeto Text1 Text1 Text1 Text1 Text1 Text1 Text1 Text1 Accin 3 El usuario hace doble clic en Text1 para seleccionar el texto y presiona CTRL+C para copiar el texto al Portapapeles. Los eventos Mouse y un evento Click acompaan al evento DblClick. Los eventos MouseMove y MouseDown reciben cuatro parmetros: qu botn, el estado de MAYS y las ubicaciones X e Y. Las ubicaciones X e Y son relativas al formulario y reflejan el modo de escala (por ejemplo, pxeles) del formulario. Slo se presenta un evento MouseMove para cada control. En realidad, este evento se activara probablemente media docena de veces o ms. Objeto Form1 Text1 Text1 Text1 Text1 Text1 Text1 Text1 Accin 4 El usuario presiona TAB para pasar a Text2. Evento MouseMove(0, 0, 100, 35) MouseMove(0,0,44,22) MouseDown(1, 0, 44, 22) MouseUp(1, 0, 44, 22) Click MouseDown(1, 0, 44, 22) MouseUp(1, 0, 44, 22) DblClick Evento KeyPress(84, 1) T InteractiveChange KeyPress(101, 0) e InteractiveChange KeyPress(115,0) s InteractiveChange KeyPress(116,0) t InteractiveChange
file://C:\temp\~hh52BB.htm
30/05/2000
Pgina 80 de 83
El usuario pega en Text2 el texto copiado al presionar CTRL+V. Objeto Text2 Accin 6 El usuario hace clic en Command2, que cierra el formulario. Objeto Form1 Command2 Text2 Command2 Text2 Command2 Command2 Command2 Command2 Command2 Command2 Evento MouseMove MouseMove Valid When LostFocus GotFocus MouseDown(1, 0, 143, 128) MouseUp(1, 0, 143, 128) Click Valid When Evento InteractiveChange
Cuando se cierra el formulario y se libera el objeto se producen estos eventos adicionales, en orden inverso a los eventos de la Accin 1.
file://C:\temp\~hh52BB.htm
30/05/2000
Pgina 81 de 83
file://C:\temp\~hh52BB.htm
30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Object1 Object1 Object2 3 Object2 Object2 Object2 Object2 Form Form Object 5 Form FormSet DataEnvironment DataEnvironment Cursores DataEnvironment
1 2
Pgina 82 de 83
Valid 3 LostFocus When GotFocus Message Valid 4 LostFocus QueryUnload Destroy Destroy Unload Unload AfterCloseTables Destroy Destroy
Para cada objeto, desde el objeto ms interno hasta el contenedor ms externo Primer objeto segn el orden de tabulacin 3 Siguiente objeto que va a recibir el enfoque 4 Cuando el objeto pierde el enfoque 5 Para cada objeto, desde el contenedor ms externo hasta el objeto ms interno
El evento Init de todos los controles del formulario se ejecuta antes que el evento Init del formulario, por lo que puede incluir cdigo en el evento Init del formulario para manipular cualquier control del formulario. Por ejemplo, si va a agregar controles para columnas de cuadrcula, podr hacerlo en el evento Init del formulario. 30/05/2000
file://C:\temp\~hh52BB.htm
Pgina 83 de 83
Si quiere que se procese parte del cdigo siempre que el valor de cuadro de lista, cuadro combinado o casilla de verificacin cambia, asciela al evento InteractiveChange. El evento Click puede no tener lugar o puede ser llamado incluso si el valor no ha cambiado. Cuando arrastra un control, los otros eventos de mouse se paran. Por ejemplo, los eventos MouseUp y MouseMove no tienen lugar durante una operacin de arrastrar y colocar. Los eventos Valid y When devuelven un valor, verdadero (.T.) de forma predeterminada. Si devuelve falso (.F.) 0 desde el evento When, el control no puede tener el enfoque. Si devuelve falso (.F.) 0 desde el evento Valid, el enfoque no puede abandonar el control.
Para obtener ms informacin acerca del uso del Diseador de formularios, consulte el captulo 9, Crear formularios. Para obtener informacin acerca de la codificacin de clases y la forma de agregar cdigo de eventos, consulte el captulo 3, Programacin orientada a objetos.
file://C:\temp\~hh52BB.htm
30/05/2000