Visual fox-pro para clases

806
Visual Foxpro 6 , Manual del Programador - Microsoft Press Titulo : Visual Foxpro 6 , Manual del Programador Autor : Microsoft Press ISBN : 84-481-2089-2 Editora : Mc Graw Hill Nº Paginas : 847 CONTENIDO Introducción. PARTE 1. Programación con Visual FoxPro. Capí tulo 1. Introducción a la programación. Capí tulo 2. Programar una aplicación. Capí tulo 3. Programación orientada a objetos. Capí tulo 4. Descripción del modelo de eventos. PARTE 2. Trabajar con datos. Capí tulo 5. Diseñar una base de datos. Capí tulo 6. Crear bases de datos. Capí tulo 7. Trabajar con tablas. Capí tulo 8. Crear vistas. PARTE 3. Crear la interfaz. Capí tulo 9. Crear formularios. Capí tulo 10. Usar controles. Capí tulo 11. Diseñar menús y barras de herramientas. PARTE 4. Agrupar todos los elementos. Capí tulo 12. Agregar consultas e informes. Capí tulo 13. Compilar una aplicaci ón. Capí tulo 14. Probar y depurar aplicaciones.

Transcript of Visual fox-pro para clases

  • 1. Visual Foxpro 6 , Manual del Programador - Microsoft PressTitulo : Visual Foxpro 6 , Manual del ProgramadorAutor : Microsoft PressISBN : 84-481-2089-2Editora : Mc Graw HillN Paginas : 847CONTENIDOIntroduccin.PARTE 1. Programacin con Visual FoxPro.Captulo 1. Introduccin a la programacin.Captulo 2. Programar una aplicacin.Captulo 3. Programacin orientada a objetos.Captulo 4. Descripcin del modelo de eventos.PARTE 2. Trabajar con datos.Captulo 5. Disear una base de datos.Captulo 6. Crear bases de datos.Captulo 7. Trabajar con tablas.Captulo 8. Crear vistas.PARTE 3. Crear la interfaz.Captulo 9. Crear formularios.Captulo 10. Usar controles.Captulo 11. Disear mens y barras de herramientas.PARTE 4. Agrupar todos los elementos.Captulo 12. Agregar consultas e informes.Captulo 13. Compilar una aplicacin.Captulo 14. Probar y depurar aplicaciones.

2. Captulo 15. Optimizar aplicaciones.PARTE 5. Ampliar aplicaciones.Captulo 16. Agregar OLE.Captulo 17. Programar para acceso compartido.Captulo 18. Programar aplicaciones internacionales.PARTE 6. Crear soluciones cliente-servidor.Captulo 19. Disear aplicaciones cliente-servidor.Captulo 20. Upsizing de bases de datos de VisualFoxPro.Captulo 21. Implementar una aplicacin cliente-servidor.Captulo 22. Optimizar el rendimiento cliente-servidor.PARTE 7. Crear archivos de Ayuda.Captulo 23. Crear Ayuda grfica.Captulo 24. Crear Ayuda de tipo .DBF.PARTE 8. Distribuir aplicaciones.Captulo 25. Generar una aplicacin para su distribucin.Captulo 26. Crear discos de distribucin.PARTE 9. Acceso a las bibliotecas API.Captulo 27. Extender Visual FoxPro con bibliotecas externas.Captulo 28. Acceso a la API de Visual FoxPro.PARTE 10. Crear soluciones empresariales.Captulo 29. Programar en equipo.Captulo 30. Soluciones empresariales de Visual FoxPro.PARTE 11. Lo nuevo en Visual FoxPro.Captulo 31. Interoperabilidad e Internet.Captulo 32. Programacin de aplicaciones y productividad del programador.Captulo 33. Mejoras para la programacin. 3. Manual del programador, Parte 1: Programacin en Visual FoxProPgina 1 de 83 Manual del programador, Parte 1: Programacin en Visual FoxPro 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. Captulo 1: Introduccin a la programacin En Visual FoxPro funcionan juntas la programacin por procedimientos y la programacin orientada a objetos para permitirle crear aplicaciones potentes y flexibles. Conceptualmente, puede imaginarse que la programacin consiste en escribir una secuencia de instrucciones con el fin de realizar tareas especficas. A un nivel estructural, la programacin en Visual FoxPro precisa la manipulacin de los datos almacenados. Si no tiene experiencia en programacin, este captulo le ayudar a ponerse en marcha. Si ya conoce otros lenguajes de programacin y desea compararlos con Visual FoxPro, vea el tema Visual FoxPro y otros lenguajes de programacin. Si desea una descripcin de la programacin orientada a objetos, consulte el captulo 3, Programacin orientada a objetos.file://C:temp~hh52BB.htm 30/05/2000 4. Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 2 de 83 En este captulo se abordan los temas siguientes:l Ventajas de la programacinl La mecnica de la programacin en Visual FoxProl Conceptos bsicos de programacinl El proceso de la programacinl Usar procedimientos y funciones definidos por el usuariol 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 ErnstHandel. 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 enel campo. Para conseguir el mismo resultado mediante programacin, escriba el siguiente comando de Visual FoxPro en la ventana Comandos:file://C:temp~hh52BB.htm30/05/2000 5. Manual del programador, Parte 1: Programacin en Visual FoxProPgina 3 de 83 REPLACE max_ord_amt WITH max_ord_amt * 1,03 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 clientesCdigo ComentariosUSE customer Abre la tabla CUSTOMER.SCAN Examina todos los registros de la tabla y realiza todas las instrucciones comprendidas entre SCAN y ENDSCAN para cada registro.REPLACE max_ord_amt WITH ; Incrementa la cantidad mxima de pedido en unmax_ord_amt * 1.03 3%. (El punto y coma (;) indica que el comando sigue en la lnea siguiente).ENDSCANFinal del cdigo que se ejecuta para cada registro contenido en la tabla. La ejecucin de un programa ofrece numerosas ventajas en comparacin con la introduccin de distintos comandos en la ventana Comandos:lLos programas se pueden modificar y volver a ejecutar.lSe pueden ejecutar programas desde los mens, formularios y barras de herramientas.lLos 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. La mecnica de la programacin en Visual FoxPro Puede programar en Visual FoxPro escribiendo cdigo: instrucciones en forma de comandos, funciones u operaciones que Visual FoxPro puede entender. Puede incluir estas instrucciones en:lLa ventana Comandos.lArchivos de programalVentanas de cdigo de eventos o de mtodos en el Diseador de formularios o en el Diseador de claseslVentanas de cdigo de procedimientos en el Diseador de menslVentanas de cdigo de procedimientos en el Diseador de informesfile://C:temp~hh52BB.htm 30/05/2000 6. Manual del programador, Parte 1: Programacin en Visual FoxProPgina 4 de 83 Usar la ventana Comandos Puede ejecutar un comando de Visual FoxPro si lo escribe en la ventana Comandos y presiona ENTRAR. Para volver a ejecutar el comando, lleve el cursor a la lnea que contiene el comando y presione nuevamente ENTRAR. Puede ejecutar varias lneas de cdigo en la ventana Comandos como si constituyeran un programa. Para ejecutar varias lneas de cdigo en la ventana Comandos 1. Seleccione las lneas de cdigo. 2. Presione ENTRAR o elija Ejecutar seleccin en el men emergente. Como la ventana Comandos es una ventana de edicin, puede modificar comandos con las herramientas disponibles en Visual FoxPro. Puede modificar, insertar, eliminar, cortar, copiar o pegar texto en la ventana Comandos. La ventaja que supone poder escribir cdigo en la ventana Comandos radica en el hecho de que las instrucciones se ejecutan de inmediato. No es necesario guardar un archivo y ejecutarlo como un programa. Adems, las opciones que elige en los mens y los cuadros de dilogo aparecen en la ventana Comandos como comandos. Puede copiar y pegar estos comandos en un programa de Visual FoxPro y a continuacin ejecutar el programa repetidamente, lo cual facilita la ejecucin de miles de comandos, una y otra vez. 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 bienfile://C:temp~hh52BB.htm 30/05/2000 7. Manual del programador, Parte 1: Programacin en Visual FoxProPgina 5 de 83l En la ventana Comandos, escriba:MODIFY COMMAND 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 programal En el men Archivo, elija Guardar. 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 programal Si el programa forma parte de un proyecto, seleccinelo en el Administrador de proyectos yelija Modificar.O bienl En el men Archivo, elija Abrir. Aparecer un cuadro de dilogo en el que se muestra unalista de los archivos disponibles. En la lista Archivos de tipo, elija Programa. En la lista dearchivos, seleccione el programa que desea modificar y elija Abrir.O bienl En la ventana Comandos, escriba el nombre del programa que desea modificar:MODIFY COMMAND miprogramO bienfile://C:temp~hh52BB.htm30/05/2000 8. Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 6 de 83l En la ventana Comandos, escriba:MODIFY COMMAND ?Cuando aparezca la lista de archivos, seleccione el programa que desea modificar y acontinuacin 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 programal Si el programa forma parte de un proyecto, seleccinelo en el Administrador de proyectos yelija Ejecutar.O bienl En el men Programa, elija Ejecutar. Cuando aparezca la lista de programas, seleccione elprograma que desea ejecutar y a continuacin elija Ejecutar.O bienl En la ventana Comandos, escriba DO y el nombre del programa que desea ejecutar:DO miprogram Escribir cdigo en las herramientas de diseo de Visual FoxPro El Diseador de formularios, el Diseador de clases y el Diseador de mens le permiten integrar fcilmente cdigo de programas mediante la interfaz de usuario, de forma que el cdigo apropiado se ejecute como respuesta a las acciones del usuario. El Diseador de informes le permite crear informes complejos y personalizados integrando cdigo en el archivo del informe. Para aprovechar plenamente la eficacia de Visual FoxPro, debe utilizar estas herramientas de diseo. Si desea ms informacin sobre el Diseador de informes, consulte el captulo 7, Disear informes y etiquetas, del Manual del usuario. Para obtener informacin ms detallada sobre el Diseador de formularios, consulte el captulo 3, Programacin orientada a objetos, de este manual. Para obtener informacin ms detallada sobre el Diseador de formularios, consulte el captulo 9, Crear formularios, y si desea ms informacin acerca del Diseador de mens, consulte el captulo 11, Disear mens y barras de herramientas. Conceptos bsicos de programacinfile://C:temp~hh52BB.htm 30/05/2000 9. Manual del programador, Parte 1: Programacin en Visual FoxProPgina 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 datosTipo EjemplosNumeric123 3,1415 7CharacterPrueba 123 01/01/98Logical.T. (verdadero) .F. (falso)Date {^1998-01-01}DateTime {^1998-01-01 12:30:00 p} Contenedores de datos 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 10. Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 8 de 83Tipo DescripcinVariablesElementos individuales de datos almacenados en la memoria RAM (memoria de acceso aleatorio) del PC.Registros de tabla Varias filas de campos predeterminados, cada uno de los cuales puede contener un dato definido previamente. Las tablas se guardan en disco.Matrices 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 Ejemplo Resultado=Todos? n = 7 Imprime .T. si el valoralmacenado en lavariable es 7; de locontrario, imprime .F.+Numeric, ? "Fox" + "Pro" Imprime FoxPro Character,Date, DateTime! or NOT Logical? !.T.Imprime .F. (falso)*, / Numeric? 5 * 5 Imprime 25? 25 / 5Imprime 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 = 45file://C:temp~hh52BB.htm30/05/2000 11. Manual del programador, Parte 1: Programacin en Visual FoxProPgina 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:lAsignar 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( )lIncluir 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.htm30/05/2000 12. Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 10 de 83CD GETDIR( )l Imprimir el valor devuelto en la ventana de salida activa. La siguiente lnea de cdigo imprimela hora actual del sistema en la ventana principal de Visual FoxPro:? TIME( )l Llamar a la funcin sin almacenar en ningn lugar el valor devuelto. La siguiente llamada defuncin desactiva el cursor:SYS(2002)l Incluir la funcin dentro de otra funcin. La siguiente lnea de cdigo imprime el da de lasemana:? DOW(DATE( )) A continuacin se enumeran otros ejemplos de funciones utilizados en este captulo:Funcin DescripcinISDIGIT( )Devuelve el valor verdadero (.T.) si el carcter situado al comienzo deuna cadena es un nmero; de lo contrario, devuelve el valor falso (.F.).FIELD( )Devuelve el nombre de un campo.LEN( )Devuelve el nmero de caracteres de una expresin de caracteres.RECCOUNT( ) Devuelve el nmero de registros de la tabla que est activa en estemomento.SUBSTR( ) Devuelve el nmero especificado de caracteres a partir de una cadena decaracteres, 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 DescripcinUSE Cierra la tabla que aparece en el rea de trabajoactual.USE customerAbre la tabla CUSTOMER en el rea de trabajoactual y cierra cualquier tabla que ya est abiertafile://C:temp~hh52BB.htm30/05/2000 13. Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 11 de 83en el rea de trabajo.USE customer IN 0 Abre la tabla CUSTOMER en la siguiente rea detrabajo disponible.USE customer IN 0 ; Abre la tabla CUSTOMER en la siguiente rea deALIAS miClientetrabajo disponible y asigna al rea de trabajo elalias miCliente. A continuacin se muestran algunos ejemplos de comandos utilizados en este captulo:ComandoDescripcinDELETE Selecciona registros especificados de una tabla para su eliminacin.REPLACESustituye el valor almacenado en el campo del registro por un nuevo valor.Go Coloca el puntero de registro en una posicin especfica de la tabla. Control del flujo del programa Visual FoxPro incluye una categora especial de comandos que "envuelven" a otros comandos y funciones, y determinan cundo y con qu frecuencia se ejecutan. Estos comandos permiten realizar bifurcaciones condicionales y bucles, dos herramientas de programacin muy eficaces. El siguiente programa muestra el uso de las bifurcaciones y los bucles condicionales. Estos conceptos se describen de forma ms detallada despus del ejemplo. Suponga que su empresa cuenta con 10.000 empleados y desea conceder a todos aqullos que ganan 3.000.000 de pesetas o ms un aumento salarial del 3%, y a todos los que ganan menos de 3.000.000 de pesetas un aumento del 6%. El siguiente ejemplo de programa le permite hacerlo. Este programa presupone que en el rea de trabajo actual est abierta una tabla que contiene un campo numrico denominado salario. Si desea obtener informacin sobre las reas de trabajo, consulte "Usar mltiples tablas" en el captulo 7, Trabajar con tablas.. Programa de ejemplo para aumentar el salario de los empleadosCdigoObservacionesSCANEl cdigo comprendido entre SCAN y ENDSCANse ejecuta tantas veces como registros haya en latabla. Cada vez que se ejecuta el cdigo, elpuntero de registro se desplaza al siguienteregistro de la tabla. IF salario >= 3000000Para cada registro, si el salario es mayor o igualREPLACE salary WITH ; salario * 1,03 que 3.000.000, este valor se sustituye por unnuevo salario que es un 3% superior.file://C:temp~hh52BB.htm30/05/2000 14. Manual del programador, Parte 1: Programacin en Visual FoxProPgina 12 de 83 El signo de punto y coma (;) que aparece despus de WITH indica que el comando contina en la siguiente lnea.ELSE Para cada registro, si el salario no es mayor o igual REPLACE salario WITH ;salario * 1,06 que 3.000.000, se sustituye este valor por un nuevo salario que es un 6% superior. ENDIF Final de la instruccin condicional IF.ENDSCAN Final del cdigo que se ejecuta para cada registro de la tabla. 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:lIF ... ELSE ... ENDIFlDO CASE ... ENDCASE 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 >= 100lEbullicin = .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 Visualfile://C:temp~hh52BB.htm 30/05/2000 15. Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 13 de 83 FoxPro hay tres comandos que permiten realizar bucles:l SCAN ... ENDSCANl FOR ... ENDFORl DO WHILE ... ENDDO 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 nicoCdigoComentariosnAqu = RECNO() Guardar la posicin del registro.cIniciales = LEFT(nombre,1) + ; Obtener las iniciales de la persona a partir de las LEFT(apellido,1)nSufijo = 0 primeras letras de los campos nombre y apellido.Si es necesario, establecer una variable quecontenga el nmero que se debe agregar al final delas iniciales de una persona.LOCATE FOR id_persona = cInicialesComprobar si hay otra persona en la tabla cuyasiniciales son las mismas.DO WHILE FOUND( ) Si en otro registro de la tabla hay un valorid_persona que coincide con cIniciales, lafile://C:temp~hh52BB.htm30/05/2000 16. Manual del programador, Parte 1: Programacin en Visual FoxPro 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 + 1Preparar un sufijo nuevo y anexarlo al final de lascIniciales = ; LEFT(cIniciales,2); iniciales. + 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.ENDDOFinal del bucle DO WHILE.GOTO nAqu Volver al registro y almacenar el cdigo deREPLACE id_persona WITH cIniciales identificacin nico en el campo id_persona. 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:lDefinir el problema.lDesglosar el problema en elementos discretos.lConstruir los elementos.lComprobar y perfeccionar los elementos.lEnsamblar los elementos.file://C:temp~hh52BB.htm30/05/2000 17. Manual del programador, Parte 1: Programacin en Visual FoxProPgina 15 de 83l Comprobar el programa en su conjunto. 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 realizarnumerosos cambios, desechar cdigo, tendr que empezar de nuevo o bien terminar con unresultado que no es realmente lo que deseaba.l Desglose el problema en pasos manejables, en lugar de intentar resolver todo el problema deuna sola vez.l Pruebe y depure secciones de cdigo a medida que desarrolla el programa. Compruebe que elcdigo hace lo que quiere que haga. La depuracin es el proceso de encontrar y solucionarproblemas que impiden que el cdigo se ejecute correctamente.l Perfeccione los datos y el almacenamiento de datos para facilitar la manipulacin de estosdatos a travs del cdigo del programa. Esto suele implicar estructurar las tablas de formaadecuada. 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, msfile://C:temp~hh52BB.htm 30/05/2000 18. Manual del programador, Parte 1: Programacin en Visual FoxProPgina 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 cadenaoriginal con la cadena que slo contiene valores numricos. 5. Repetir estos pasos para todos los registros de la tabla. Construir los elementos Cuando sepa qu debe hacer, puede empezar a formular los elementos en trminos de comandos, funciones y operadores de Visual FoxPro. Como los comandos y funciones se usan para manipular datos, tiene algunos datos de prueba para trabajar con ellos. Los datos de prueba sirven para simular los datos verdaderos lo mejor posible. Para este ejemplo puede almacenar en una variable una cadena de prueba introduciendo el siguiente comando en la ventana Comandos: cTest = "123-456-7 89 0" 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 lafile://C:temp~hh52BB.htm30/05/2000 19. Manual del programador, Parte 1: Programacin en Visual FoxProPgina 17 de 83 ventana Comandos: ? SUBSTR(cTest, 1, 1) ? SUBSTR(cTest, 3, 1) ? SUBSTR(cTest, 8, 1) 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 2. En la ventana que aparecer, escriba las siguientes lneas de cdigo:FOR nCnt = 1 TO 14 ? SUBSTR(cTest, nCnt, 1)ENDFOR 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 programafile://C:temp~hh52BB.htm 30/05/2000 20. Manual del programador, Parte 1: Programacin en Visual FoxProPgina 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 variablefile://C:temp~hh52BB.htm 30/05/2000 21. Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 19 de 83 para almacenar los valores numricos: cNumOnly. Para crear la variable, debe asignarle un valor inicial, una cadena de longitud cero: cNumOnly = "" 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 Hasta ahora, el programa es el siguiente: cNumOnly = "" FOR nCnt = 1 TO 14cCharacter = SUBSTR(cTest, nCnt, 1)IF ISDIGIT(cCharacter)cNumOnly = cNumOnly + cCharacterENDIF ENDFOR Prueba de los elementos Si agrega un par de comandos al final para imprimir las cadenas y ejecutar el programa, podr ver que el programa funciona con la cadena de prueba: cNumOnly = "" FOR nCnt = 1 TO 14cCharacter = SUBSTR(cTest, nCnt, 1)IF ISDIGIT(cCharacter)cNumOnly = cNumOnly + cCharacterENDIF ENDFOR ? cTest ? cNumOnly 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 22. Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 20 de 83 cTest = "456-789 22" 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 + cCharacterENDIF ENDFOR ? cTest ? cNumOnly Agrupar los elementos Para completar la solucin de programacin para este problema, quiz desee volver a leer sus datos de una tabla. Cuando tenga una tabla, explore los registros y aplique su cdigo de programa a un campo de la tabla, en lugar de a una variable. En primer lugar, podra crear una tabla temporal que contuviera diversas cadenas de prueba. Dicha tabla podra contener un nico campo de caracteres llamado Testfield y cuatro o cinco registros:Contenido de Testfield123-456-7 89 0-9221 9220 94321 99-456-789 22000001 98-99-234 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 + cCharacterENDIF 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: SCANcNumOnly = ""FOR nCnt = 1 TO LEN(TestField) cCharacter = SUBSTR(TestField, nCnt, 1) IF ISDIGIT(cCharacter)file://C:temp~hh52BB.htm30/05/2000 23. Manual del programador, Parte 1: Programacin en Visual FoxProPgina 21 de 83 cNumOnly = cNumOnly + cCharacter ENDIFENDFOR ? TestField ? cNumOnly ? ENDSCAN Resultado 123-456-7 89 0 1234567890 456-789 22 45678922 -9221 9220 94321 99- 922192209432199 000001 98-99-234 0000019899234 Comprobar todo el programa En lugar de imprimir la cadena al final del programa, quiz desee guardarla en la tabla. Para ello, utilice la siguiente lnea de cdigo: REPLACE TestField WITH cNumOnly El programa completo ser el siguiente: SCANcNumOnly = ""FOR nCnt = 1 TO LEN(TestField) cCharacter = SUBSTR(TestField, nCnt, 1) IF ISDIGIT(cCharacter) cNumOnly = cNumOnly + cCharacter ENDIFENDFORREPLACE TestField WITH cNumOnly ENDSCAN Cuando tenga el programa completo, necesitar probarlo con los datos de ejemplo antes de probarlo con los datos reales. Aumentar la robustez del programa Un programa robusto hace lo que usted quiere que haga, pero tambin se anticipa a posibles problemas y se encarga de ellos. Este programa hace lo que usted quiere, pero hace algunas suposiciones que deben ser verdaderas para que funcione:l Hay una tabla abierta en el rea de trabajo actual.l 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 confile://C:temp~hh52BB.htm 30/05/2000 24. Manual del programador, Parte 1: Programacin en Visual FoxPro 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 campoCdigo ComentarioslFieldOK = .F. 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.FOR nCnt = 1 TO FCOUNT( )Esta seccin de cdigo recorre todos los campos IF FIELD(nCnt) = ; UPPER("TestField")de la tabla actual hasta que encuentra un campo IF TYPE("TestField") = "C"de caracteres llamado TestField. En cuanto selFieldOK = .T. encuentra el campo correcto, lFieldOK se ENDIF establece como verdadera (.T.) y EXIT finaliza EXIT ENDIF el bucle (no hay ninguna razn para continuarENDFOR con la comprobacin una vez identificado el campo correcto). Si ningn campo cumple el criterio, lFieldOK seguir siendo falso (.F.).IF lFieldOKLa seccin de conversin del programa slo se ejecuta si en la tabla activa actualmente hay un campo de caracteres llamado TestField.SCAN El cdigo de conversin. cNumOnly = "" FOR nCnt = 1 TO LEN(TestField)cCharacter = ; SUBSTR(TestField, nCnt, 1)IF ISDIGIT(cCharacter)cNumOnly = cNumOnly + ;cCharacterENDIF ENDFOR REPLACE TestField WITH ;cNumOnlyENDSCANENDIFFin de la condicin IF lFieldOK. 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.htm30/05/2000 25. Manual del programador, Parte 1: Programacin en Visual FoxProPgina 23 de 83 Usar procedimientos y funciones definidas por el usuario Los procedimientos y funciones permiten mantener en un nico lugar el cdigo que utiliza con frecuencia y llamarlo a travs de su aplicacin siempre que lo necesite. Esto hace que su cdigo sea ms fcil de leer y mantener, ya que en un procedimiento el cambio se realiza una sola vez, no varias veces como ocurre en un programa. En Visual FoxPro, los procedimientos son similares a ste: PROCEDURE miproc * Esto es un comentario, pero podra ser cdigo ejecutable ENDPROC 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 Llamar a un procedimiento o a una funcin Hay dos formas de llamar a un procedimiento o a una funcin en sus programas:l Utilizar el comando DO. Por ejemplo:DO miprocO bienl Incluir detrs del nombre de la funcin un par de parntesis. Por ejemplo:mifuncin( ) 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 26. Manual del programador, Parte 1: Programacin en Visual FoxPro 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 mensajeMESSAGEBOX ("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 parmetrosCdigo ComentariosDO miproc WITH cTestString Llama a un procedimiento y transfiere unaDO miproc WITH "cadena de prueba" variable de caracteres o un literal de cadena.mifuncin("cadena de prueba")Llama a una funcin y transfiere una copia demifuncin( cTestString ) 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 Podra llamar a este procedimiento mediante la siguiente lnea de cdigo: DO miproc WITH DATE(), "Hola", 10file://C:temp~hh52BB.htm30/05/2000 27. Manual del programador, Parte 1: Programacin en Visual FoxProPgina 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 dDateRETURN 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 devueltosCdigo Comentariosvar = mifuncin( ) Almacena en una variable el valor devuelto por la funcin.? mifuncin( ) Imprime en la ventana activa de salida el valor devuelto por la funcin. 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 + 14ELSE MESSAGEBOX( "requiere un parmetro de tipo Fecha" ) RETURN {}&& Devuelve una fecha vacaENDIF 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 siguientefile://C:temp~hh52BB.htm 30/05/2000 28. Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 26 de 83 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.ENDIFIF lIsInTable REPLACE (cStoreTo) WITH (cNewVal)ELSE &cStoreTo = cNewValENDIFRETURN .T. ENDPROC Convertir el programa NUMONLY en una funcin NUMONLY.PRG, el programa de ejemplo descrito en la seccin El proceso de la programacin, puede hacerse ms robusto y til si crea una funcin para la parte del programa que elimina los caracteres no numricos de una cadena. Procedimiento de ejemplo para devolver caracteres numricos de una cadenaCdigo ComentariosFUNCTION NumbersOnly( cMixedVal )Principio de la funcin, que acepta una cadena de caracteres.cNumOnly = ""Crea una cadena que slo tiene los caracteresFOR nCnt = 1 TO LEN(cMixedVal) cCharacter = ;numricos de la cadena original.SUBSTR(cMixedVal, nCnt, 1)IF ISDIGIT(cCharacter) cNumOnly = ; cNumOnly + cCharacterENDIF ENDFORRETURN cNumOnlyDevuelve la cadena que slo tiene caracteres numricos.ENDFUNCFin de la funcin. Adems de permitirle utilizar este cdigo en mltiples situaciones, esta funcin mejora la legibilidad del programa: SCANREPLACE FieldName WITH NumbersOnly(FieldName) ENDSCAN O, ms sencillo an: REPLACE ALL FieldName WITH NumbersOnly(FieldName)file://C:temp~hh52BB.htm30/05/2000 29. Manual del programador, Parte 1: Programacin en Visual FoxPro 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. Captulo 2: Programar una aplicacin Una aplicacin de Visual FoxPro incluye normalmente una o ms bases de datos, un programa principal que configura el entorno del sistema para la aplicacin y una interfaz de usuario compuesta por formularios, barras de herramientas y mens. Las consultas y los informes permiten que los usuarios extraigan informacin de sus datos. Este captulo trata los temas siguientes:l Disear la aplicacinl Crear bases de datosl Crear clasesl Proporcionar acceso a la funcionalidadl Proporcionar acceso a la informacinl Pruebas y depuracinl Para obtener informacin acerca de la programacin de aplicaciones con el Generador deaplicaciones y el Marco de aplicaciones mejorado, vea Programar aplicaciones con el Marco deaplicaciones. 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 usuariofile://C:temp~hh52BB.htm 30/05/2000 30. Manual del programador, Parte 1: Programacin en Visual FoxProPgina 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 ...SamplesVfp98 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. Descripcin general del proceso El proceso de crear una aplicacin es muy repetitivo. Puesto que no hay dos aplicaciones exactamente iguales, lo que har probablemente ser definir prototipos y refinar algunos componentes varias veces antes de obtener un producto final. Las expectativas de los usuarios finales, o sus solicitudes, tambin pueden cambiar, lo que har necesario redefinir aspectos de la aplicacin. Adems, nadie escribe cdigo libre de errores, por lo que las pruebas y la depuracin conducen a algn tipo de rediseo ofile://C:temp~hh52BB.htm 30/05/2000 31. Manual del programador, Parte 1: Programacin en Visual FoxProPgina 29 de 83 rescritura. El proceso de creacin de una aplicacin 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. Usar el Administrador de proyectosfile://C:temp~hh52BB.htm 30/05/2000 32. Manual del programador, Parte 1: Programacin en Visual FoxPro 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 Cuando utilice el Administrador de proyectos, podr:l Modificar y ejecutar partes de su aplicacin (formularios, mens, programas) con tan sloalgunos clics.l Arrastrar clases, tablas y campos desde el Administrador de proyectos hasta el Diseador deformularios o el Diseador de clases.l Arrastrar clases entre bibliotecas de clases.l Ver y modificar fcilmente sus tablas y bases de datos.l Agregar descripciones para los componentes de la aplicacin.l 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. Crear bases de datos Puesto que una aplicacin de base de datos depende tanto de los datos subyacentes, la mejor forma de empezar a disear su aplicacin es comenzar por los datos. Puede configurar su propia base de datos y determinar cules sern las relaciones entre las tablas, qu reglas comerciales va a exigir, etc. antesfile://C:temp~hh52BB.htm30/05/2000 33. Manual del programador, Parte 1: Programacin en Visual FoxPro 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. Proporcionar acceso a la funcionalidad La satisfaccin del usuario se ver influenciada en gran medida por la interfaz que le proporcione para la funcionalidad de su aplicacin. Puede tener un modelo de clases muy limpio, cdigo muy elegante y soluciones muy inteligentes para los problemas difciles de su aplicacin, pero esto casi siempre est oculto a los clientes. Lo que ellos ven es la interfaz que usted les proporciona. Afortunadamente, las herramientas de diseo de Visual FoxPro facilitan la creacin de interfaces atractivas y ricas en caractersticas. La interfaz de usuario consiste principalmente en formularios, barras de herramientas y mens. Puede asociar toda la funcionalidad de su aplicacin con controles o comandos de men en la interfaz. En el captulo 9, Crear formularios, se describe la creacin de formularios y conjuntos de formularios. La utilizacin de controles de Visual FoxPro en los formularios se trata en el captulo 10, Usar controles. Consulte el captulo 11, Disear mens y barras de herramientas, para dar los ltimos retoques a la aplicacin. Proporcionar acceso a la informacin Probablemente muestre cierta informacin para los usuarios en formularios, pero tambin desear ofrecer a los usuarios la posibilidad de especificar exactamente la informacin que desean ver, as como la opcin de imprimirla en informes o etiquetas. Las consultas, especialmente las consultas que aceptan parmetros definidos por el usuario, permiten a los usuarios tener ms control sobre sus datos. Los informes permiten a los usuarios imprimir imgenes totales, parciales o de resumen de sus datos. Los controles ActiveX y la automatizacin permiten que su aplicacin comparta informacin y funciones con otras aplicaciones. El Diseador de consultas y el Diseador de informes se describen en los captulos 4 a 7 del Manual del usuario. En el captulo 12 de este manual, Agregar consultas e informes, se explica la integracin de consultas e informes en una aplicacin. El captulo 16, Agregar OLE describe la integracin defile://C:temp~hh52BB.htm30/05/2000 34. Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 32 de 83 OLE en una aplicacin. 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. Captulo 3: Programacin orientada a objetos Aunque Visual FoxPro admite la programacin estndar por procedimientos, se ha ampliado la capacidad del lenguaje para proporcionar la potencia y la flexibilidad propias de la programacin orientada a objetos. El diseo orientado a objetos y la programacin orientada a objetos representan un cambio de perspectiva con respecto a la programacin estndar por procedimientos. En lugar de pensar en el flujo del programa desde la primera hasta la ltima lnea de cdigo, se debe pensar en la creacin de objetos: componentes autocontenidos de una aplicacin que tienen funcionalidad privada adems de la funcionalidad que se puede exponer al usuario. En este captulo se tratan los temas siguientes:l Descripcin de los objetos de Visual FoxProl Descripcin de las clases de Visual FoxProl Adaptar la clase a la tareal Crear clasesl Agregar clases a formulariosl Definir clases mediante programacin Descripcin de los objetos de Visual FoxPro En Visual FoxPro, los formularios y los controles son objetos que puede incluir en sus aplicaciones. Puede manipular estos objetos a travs de sus propiedades, eventos y mtodos. Las mejoras en el lenguaje orientado a objetos de Visual FoxPro proporcionan un mayor control sobre los objetos de las aplicaciones. Asimismo, facilitan la creacin y el mantenimiento de bibliotecas de cdigo reutilizable, proporcionando:l Cdigo ms compacto.l Incorporacin ms sencilla del cdigo a las aplicaciones sin necesidad de elaborar esquemas deasignacin de nombres.l Menos complejidad al integrar cdigo de distintos archivos en una aplicacin.file://C:temp~hh52BB.htm 30/05/2000 35. Manual del programador, Parte 1: Programacin en Visual FoxPro 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. Clases y objetos: los bloques funcionales de las aplicaciones Las clases y los objetos estn estrechamente relacionados, pero no son lo mismo. Una clase contiene informacin sobre cul debe ser la apariencia y el comportamiento de un objeto. Una clase es el plano o esquema de un objeto. Por ejemplo, el esquema elctrico y de diseo de un telfono sera algo similar a una clase. El objeto o una instancia de la clase sera el telfono. La clase determina las caractersticas del objeto. Los objetos tienen propiedades Un objeto tiene ciertas propiedades o atributos. Por ejemplo, un telfono tiene un color y un tamao determinados. Cuando se instala un telfono en la oficina, tiene una determinada posicin sobre la mesa. El receptor puede estar colgado o descolgado. Los objetos que se crean en Visual FoxPro tambin tienen propiedades que estn determinadas por la clase en la que se basa el objeto. Estas propiedades pueden establecerse en tiempo de diseo o en tiempo de ejecucin. Por ejemplo, en la tabla siguiente se indican algunas propiedades que puede tener una casilla de verificacin.PropiedadDescripcinCaptionTexto descriptivo que aparece junto a la casilla de verificacin.EnabledEspecifica si un usuario puede elegir o no la casilla de verificacin.ForeColorColor del texto del ttulo.Left Posicin del extremo izquierdo de la casilla de verificacin.MousePointer Apariencia del puntero del mouse (ratn) cuando est situado sobre la casilla de verificacin.TopPosicin de la parte superior de la casilla de verificacin.file://C:temp~hh52BB.htm 30/05/2000 36. Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 34 de 83Visible Especifica si la casilla de verificacin es visible o no. Los objetos tienen eventos y mtodos asociados Cada objeto reconoce y puede responder a determinadas acciones denominadas eventos. Un evento es una actividad especfica y predeterminada, iniciada por el usuario o por el sistema. Los eventos, en la mayor parte de los casos, se generan por interaccin del usuario. Por ejemplo, con un telfono, se desencadena un evento cuando un usuario descuelga el receptor. Los eventos tambin se desencadenan cuando el usuario presiona los botones para efectuar una llamada. En Visual FoxPro, las acciones del usuario que desencadenan eventos incluyen clics, movimientos del mouse y pulsaciones de teclas. Inicializar un objeto y encontrar una lnea de cdigo que produce un error son eventos iniciados por el sistema. Los mtodos son procedimientos asociados a un objeto. Los mtodos se diferencian de los procedimientos normales de Visual FoxPro en que estn vinculados inseparablemente a un objeto y tienen nombres distintos que los procedimientos normales de Visual FoxPro. Los eventos pueden tener mtodos asociados. Por ejemplo, si escribe cdigo de mtodo para el evento Click, ese cdigo se ejecutar cuando se produzca el evento Click. Los mtodos tambin pueden existir independientemente de los eventos. Se debe llamar a estos mtodos de forma explcita en el cdigo. El conjunto de eventos es limitado, aunque amplio. No es posible crear nuevos eventos. Sin embargo, el conjunto de mtodos puede ampliarse indefinidamente. La tabla siguiente muestra algunos de los eventos asociados a una casilla de verificacin:EventoDescripcinClick El usuario hace clic en la casilla de verificacin.GotFocusEl usuario activa la casilla de verificacin al hacer clic en ella o al llegar aella a travs de la tecla TAB.LostFocus El usuario selecciona otro control. La tabla siguiente muestra algunos mtodos asociados a una casilla de verificacin:MtodoDescripcinRefresh El valor de la casilla de verificacin se actualiza para reflejar los cambiosque se puedan haber producido en el origen de datos subyacente.SetFocusEl enfoque se establece en la casilla de verificacin como si el usuariohubiera 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 ordenfile://C:temp~hh52BB.htm30/05/2000 37. Manual del programador, Parte 1: Programacin en Visual FoxProPgina 35 de 83 en que se producen los eventos. Descripcin de las clases de Visual FoxPro Todas las propiedades, eventos y mtodos de un objeto se especifican en la definicin de clase. Adems, las clases tienen las siguientes caractersticas que las hacen especialmente tiles para crear cdigo reutilizable y fcil de mantener:l Encapsulamientol Subclasesl Herencia Ocultar la complejidad innecesaria Cuando instale un telfono en la oficina, lo ms probable es que no le interese el funcionamiento interno del aparato para la recepcin de llamadas, la realizacin o la finalizacin de conexiones con centralitas electrnicas o la conversin de las pulsaciones de tecla en seales electrnicas. Lo nico que necesitar saber es que puede levantar el auricular, marcar los nmeros apropiados y hablar con la persona con la que desea hablar. La complejidad de realizar esa conexin queda oculta. La ventaja de ignorar los detalles internos de un objeto para poder centrarse en los aspectos del objeto que necesita utilizar se denomina abstraccin. La complejidad interna puede estar oculta 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. Aprovechar la potencia de las clases existentes Una subclase puede tener toda la funcionalidad de una clase existente, adems de la funcionalidad y los controles adicionales que quiera darle. Si la clase es un telfono bsico, podr tener subclases que tengan toda la funcionalidad del telfono original y todas las caractersticas especializadas que desee darles. Las subclases le permiten reutilizar cdigo.file://C:temp~hh52BB.htm 30/05/2000 38. Manual del programador, Parte 1: Programacin en Visual FoxPro 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. Simplificar el mantenimiento de cdigo Con la herencia, si realiza un cambio en una clase, ese cambio se reflejar en todas las subclases que se basen en ella. Esta actualizacin automtica ahorra tiempo y trabajo. Por ejemplo, si un fabricante de telfonos quisiera cambiar los telfonos de tipo marcacin por aparatos de pulsacin, se ahorrara mucho trabajo si pudiera hacer el cambio en el diagrama original y hacer que todos los telfonos fabricados anteriormente con ese diagrama heredaran automticamente la nueva caracterstica, en lugar de tener que agregarla a todos los telfonos existentes individualmente. La herencia facilita el mantenimiento del cdigo. 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.htm30/05/2000 39. Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 37 de 83 Jerarqua de clases de Visual FoxPro A la hora de crear clases definidas por el usuario, resulta til comprender la jerarqua de clases de Visual FoxPro. Jerarqua de clases de Visual FoxPro 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 controlfile://C:temp~hh52BB.htm30/05/2000 40. Manual del programador, Parte 1: Programacin en Visual FoxProPgina 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:ContenedorPuede contenerGrupos de botones de comandoBotones de comandoContenedorCualquier controlControl Cualquier controlPersonalizado Cualquier control, marcos de pgina, contenedor,personalizadoConjuntos de formulariosFormularios, barras de herramientasFormularios Marcos de pgina, cualquier control, contenedores,personalizadoColumnas de cuadrculaEncabezados de columnas, cualquier objeto exceptoconjuntos de formularios, formularios, barras deherramientas, cronmetros y otras columnasfile://C:temp~hh52BB.htm 30/05/2000 41. Manual del programador, Parte 1: Programacin en Visual FoxProPgina 39 de 83CuadrculasColumnas de cuadrculaGrupos de botones de opcinBotones de opcinMarcos de pgina PginasPginasCualquier control, contenedores, personalizadoProyecto Archivos, servidoresBarras de herramientas Cualquier control, marcos de pgina, contenedor Clases de control 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. Adaptar la clase a la tarea Es conveniente poder usar clases en muchos contextos distintos. Un diseo inteligente le permitir decidir con mayor efectividad qu clases desea disear y qu funcionalidad va a incluir en la clase. Decidir cundo crear clases Puede crear una clase para cada control y cada formulario que utilice, aunque ste no es el modo ms efectivo de disear aplicaciones. Es muy probable que acabe con mltiples clases que tengan prcticamente la misma funcin y que deban mantenerse por separado. Encapsular funcionalidad genrica Cree una clase de control para funcionalidad genrica. Por ejemplo, los botones de comando que permiten al usuario mover el puntero de registro en una tabla, un botn para cerrar un formulario y un botn de ayuda pueden guardarse como clases y agregarse a formularios en cualquier momento que desee que los formularios tengan esta funcionalidad. Puede exponer las propiedades y los mtodos en una clase de modo que el usuario pueda integrarlos en el entorno de datos concreto de un formulario o un conjunto de formularios. Proporcionar una apariencia y un uso coherentes Puede crear clases de conjunto de formularios, de formulario y de control con una apariencia caracterstica, de modo que todos los componentes de la aplicacin tengan la misma apariencia. Por ejemplo, podra agregar grficos y patrones de color especficos a una clase de formulario y utilizarla como plantilla para todos los formularios que cree. Podra crear una clase de cuadro de texto con una apariencia caracterstica, como un efecto de sombreado, y usar esta clase en la aplicacin en cualquier momento que desee agregar un cuadro de texto. Decidir qu tipo de clase va a crearfile://C:temp~hh52BB.htm30/05/2000 42. Manual del programador, Parte 1: Programacin en Visual FoxProPgina 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. Clases de base de Visual FoxPro En el Diseador de clases puede crear subclases para la mayora de las clases de base de Visual FoxPro. Clases de base de Visual FoxProActiveDocCustomLabelPageFrameCheckBox EditBox Line ProjectHookColumn*FormListBoxSeparatorCommandButtonFormSet OLEBoundControlShapeCommandGroup GridOLEContainerControlSpinnerComboBox Header* OptionButton*TextBoxContainerHyperlink ObjectOptionGroupTimerControlImage Page*ToolBar * 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 DescripcinInit Ocurre cuando se crea el objeto.DestroyOcurre cuando el objeto se libera de la memoria.ErrorOcurre 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:PropiedadDescripcinClassEl tipo de clase de que se trata.BaseClassLa clase de base de la que se deriva, como Form, Commandbutton, Custom, etc.file://C:temp~hh52BB.htm30/05/2000 43. Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 41 de 83ClassLibrary La biblioteca de clases en la que est almacenada.ParentClassLa 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. Extensin de las clases de base de Visual FoxPro Puede convertir en subclases estas clases para establecer sus propias propiedades de control predeterminadas. Por ejemplo, si quiere que los nombres predeterminados de controles que agregue a formularios de sus aplicaciones reflejen automticamente sus convenciones de nombres, puede crear clases basadas en las clases de base de Visual FoxPro para hacerlo. Puede crear clases de formulario con una apariencia o un comportamiento personalizado para que sirvan como plantillas para todos los formularios que cree. Tambin podra convertir en subclases las clases de base de Visual FoxPro para crear controles con funcionalidad encapsulada. Si quiere que un botn libere formularios cuando haga clic en l, puede crear una clase basada en la clase de botn de comando de Visual FoxPro, establecer como ttulo "Salir" e incluir el siguiente comando en el evento Click: THISFORM.Release Puede agregar este nuevo botn a cualquier formulario de la aplicacin. Botn de comando personalizado agregado a un formulario Crear controles con mltiples componentes Las subclases no estn limitadas a clases de base nicas. Puede agregar mltiples controles a una nica definicin de clase de contenedor. Muchas de las clases de la biblioteca de clases de ejemplo de Visual FoxPro estn incluidas en esta categora. Por ejemplo, la clase VCR de Buttons.vcx, ubicada en la carpeta ...SamplesVfp98Classes de Visual Studio, contiene cuatro botones de comando para desplazarse por los registros de una tabla. Creacin de clases no visualesfile://C:temp~hh52BB.htm 30/05/2000 44. Manual del programador, Parte 1: Programacin en Visual FoxPro 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 nueval En el Administrador de proyectos, seleccione la ficha Clases y elija Nuevo.O bienl En el men Archivo, elija Nuevo, seleccione Clase y elija Nuevo archivo.O bienl Utilice el comando CREATE CLASS. 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 nuevafile://C:temp~hh52BB.htm 30/05/2000 45. Manual del programador, Parte 1: Programacin en Visual FoxProPgina 43 de 83 Modificar una definicin de clase Cuando haya creado una clase, podr modificarla. Los cambios realizados a una clase afectan a todas las subclases y a todos los objetos basados en esta clase. Puede agregar una mejora a una clase o reparar un error en la clase, y todas las subclases y los objetos basados en dicha clase heredarn el cambio. Para modificar una clase en el Administrador de proyectos 1. Seleccione la clase que desea modificar. 2. Elija Modificar.Se abrir el Diseador de clases. Tambin puede modificar una definicin de clase visual mediante el comando MODIFY CLASS. Importante No cambie la propiedad Name de una clase si la usan otros componentes de la aplicacin. De lo contrario, Visual FoxPro no podr encontrar la clase cuando la necesite. Subclases de una definicin de clase Hay dos formas de crear una subclase de una clase definida por el usuario. Para crear una subclase de una clase definida por el usuario 1. En el cuadro de dilogo Nueva clase, haga clic en el botn de tres puntos situado a la derechadel cuadro Basada en. 2. En el cuadro de dilogo Abrir, elija la clase en la que desea basar la nueva clase.O bienl Utilice el comando CREATE CLASS.Por ejemplo, para basar una nueva clase, x, en parentclass de Mylibrary.vcx, use el cdigosiguiente:CREATE CLASS x OF y AS parentclass ;FROM mylibrary Utilizar el Diseador de clases Cuando especifica la clase en la que est basada la nueva clase y la biblioteca en la que se va a almacenar, se abre el Diseador de clases. Diseador de clasesfile://C:temp~hh52BB.htm30/05/2000 46. Manual del programador, Parte 1: Programacin en Visual FoxPro 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. Agregar objetos a una clase de control o a una clase de contenedor Si basa la nueva clase en una clase de control o en una clase de contenedor, podr agregarle controles del mismo modo que en el Diseador de formularios: elija el botn del control en la barra de herramientas Controles de formularios y arrastre para ajustar el tamao en el Diseador de clases. Independientemente del tipo de clase en el que base la nueva clase, puede establecer propiedades y escribir cdigo de mtodo. Tambin podr crear nuevas propiedades y mtodos para la clase. Agregar propiedades y mtodos a una clase Puede agregar tantas propiedades y mtodos nuevos a la nueva clase como desee. Las propiedades contienen valores, mientras que los mtodos contienen cdigo de procedimiento que se ejecutar cuando llame al mtodo. Crear propiedades y mtodos nuevos Cuando crea propiedades y mtodos nuevos para clases, las propiedades y los mtodos tienen como alcance la clase, no los componentes individuales de la misma. Para agregar una propiedad nueva a una clasefile://C:temp~hh52BB.htm 30/05/2000 47. Manual del programador, Parte 1: Programacin en Visual FoxPro 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. Laspropiedades Protected y Hidden se tratan en "Proteger y ocultar miembros de clase" msadelante 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 laventana Propiedades en el Diseador de clases y en el Diseador de formularios cuando seagregue 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 matrizl En el cuadro Nombre del cuadro de dilogo Nueva propiedad, especifique el nombre, eltamao y las dimensiones de la matriz.Por ejemplo, para crear una propiedad de matriz llamada mimatriz con diez filas y doscolumnas, 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 delfile://C:temp~hh52BB.htm 30/05/2000 48. Manual del programador, Parte 1: Programacin en Visual FoxPro 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 lacasilla de verificacin para crear un mtodo Assign o seleccione ambas casillas de verificacinpara 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. Proteger y ocultar miembros de clases Las propiedades y mtodos de una definicin de clase son Public de forma predeterminada: el cdigo de otras clases u otros procedimientos puede establecer las propiedades o llamar a los mtodos. A las propiedades y los mtodos definidos como Protected slo pueden tener acceso otros mtodos de la definicin de la clase o de subclases de la clase. A las propiedades y los mtodos definidos como Hidden slo pueden tener acceso otros miembros de la definicin de la clase. Las subclases de la clase no pueden "ver" o hacer referencia a miembros ocultos. Para asegurar un correcto funcionamiento en algunas clases, deber impedir que los usuarios cambien las propiedades o llamen al mtodo desde fuera de la clase mediante programacin. El ejemplo siguiente ilustra el uso de propiedades y mtodos protegidos de una clase La clase Stopwatch incluida en Samples.vcx, en el directorio ...SamplesVfp98Classes de Visual Studio, incluye un cronmetro y cinco etiquetas que muestran el tiempo transcurrido: La clase Stopwatch de Samples.vcxfile://C:temp~hh52BB.htm30/05/2000 49. Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 47 de 83 La clase Stopwatch contiene etiquetas y un cronmetro. Valores de las propiedades de la clase StopwatchControlPropiedadValorlblSeconds Caption00lblColon1Caption:lblMinutes Caption00lblColon2Caption:lblHours Caption00tmrSWatchInterval 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 UpdateDisplayCdigoComentariosCSecDisplay = ALLTRIM(STR(THIS.nSec)) Convierte las propiedades numricas alcMinDisplay = ALLTRIM(STR(THIS.nMin))cHourDisplay = ALLTRIM(STR(THIS.nHour)) tipo Character para mostrarlas en losttulos de etiqueta.THIS.lblSeconds.Caption = ; Establece los ttulos de etiqueta, IIF(THIS.nSec < 10, ;file://C:temp~hh52BB.htm 30/05/2000 50. Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 48 de 83 IIF(THIS.nSec < 10, ; "0" ,"") + cSecDisplay conservando los 0 iniciales si el valor deTHIS.lblMinutes.Caption = ; la propiedad numrica es menor que 10.IIF(THIS.nMin < 10, ; "0", "") + cMinDisplay