Ingeniero en Informática


Procedimiento y funciones de usuario


Capitulo 1

Programación orientada a eventos

La principal característica de FoxPRO es la filosofía de programación orientada a eventos que propone.

Si te esfuerzas por adoptar esta filosofía, lograras nítidas ventajas respecto a la programación tradicional, orientada a menús jerárquicos y anidados como ocurre con sus antecesores (FoxBASE, dBASE, Clipper y otros DBMS)

Esta filosofía esta apoyada básicamente por la programación de teclas (ON KEY LABEL) y el uso de las cláusulas VALID y WHEN de algunos comandos como GET y BROW básicamente con funciones de usuario.

Procedimientos y funciones de usuario

Un programa es un conjunto de códigos que realiza una tarea especifica, la cual se puede llamar con el comando DO <nombre> ya sea desde la ventana de comando o desde otro programa. Es por eso que a los procedimientos también se les llama subprogramas.

El inconveniente de usar subprogramas es el tiempo que demora FoxPRO en acceder al disco en busca del código.

Para solucionar este problema FoxPRO permite usar procedimientos, que son subprogramas ubicados en el mismo archivo que el programa principal, de manera que son cargados en memoria junto con el programa principal y FoxPRO los lee muy rápidamente desde memoria.

También es posible usar procedimientos contenidos en otros archivos con el comando DO <nombre> IN <archivo> lo cual no aporta nada en cuanto a velocidad, por lo que es mucho mejor usar el concepto de librería que es un archivo PRG donde se ponen todos los procedimientos que requerimos sean llamados desde cualquiera de nuestros programas de una aplicación, el cual se carga en memoria con el comando SET PROCEDURE TO <archivo librería> normalmente ubicado en el programa principal.

Existen dos maneras de transferir información desde y hacia los procedimiento:

1. Usando mismas variables:

Inicializamos una serie de variables y luego tenemos el cuidado de usar exactamente las mismas en el procedimiento, para que al volver mantengan los valores calculados en el procedimiento.

PRINCIPAL.PRG

xNUM=2

*****************

xPOT=3

PROC OPERA

RESP=0

*****************

DO OPERA

RESP=xNUM^xPOT

? RESP

RETURN

RETURN

Nota: Las variables creadas en un procedimiento padre, son publicas para los procedimientos llamados desde el. Las variables creadas en un procedimiento hijo, NO existirán al retornar al procedimiento padre.

2. Pasando parámetros:

Pasándole paramentos al procedimiento, para que opere los valores y devuelva el valor, sin importar las variables que es cada lado se usen.

PRINCIPAL.PRG

xNUM=2

*****************

xPOT=3

PROC OPERA

RESP=0

*****************

DO OPERA WITH xNUM,xPOT,RESP

PARA X,Y,Z

? RESP

Z=X^Y

RETURN

RETURN

FUNCIONES DE USUARIO

Una función se reconoce porque lleva () al final de su nombre y porque retorna un valor que puede ser numérico, carácter, fecha o lógico.

Su estructura es muy similar a la de los procedimientos solo que se usara FUNCTION en lugar de PROCEDURE para definirla.

Para ejecutar una función no se usa DO, simplemente se le llama por su nombre con el () al final.

1. Usando mismas variables:

PRINCIPAL.PRG

*****************

xNUM=2

FUNC OPERA

xPOT=3

*****************

? OPERA()

RETURN xNUM^xPOT

RETURN

2. Pasando parámetros:

Para transferir parámetros no se usa la cláusula WITH simplemente se introducen dichos parámetros en el paréntesis.

PRINCIPAL.PRG

*****************

xNUM=2

FUNC OPERA

xPOT=3

*****************

? OPERA(xNUM,xPOT)

PARA X,Y

RETURN

RETURN X^Y

Quizás donde son mas interesantes de usar las funciones de usuario sea en la validación, osea cláusulas VALID y WHEN de comandos como GET y BROW.

Justamente el uso de esta filosofía es a la que se le da el nombre de programación orientada a eventos y no a menús jerárquicos o anidaciones, como es habitual en un principiante de FoxPRO o al que usa FoxBASE, Clipper y otros gestores de bases de datos del mercado.

Elección entre procedimientos y funciones

Algunas veces nos encontraremos en la duda de crear un procedimiento o una función de usuario, para realizar una tarea concreta. Existen algunas reglas para determinar el uso de uno u otro:

Usemos procedimientos cuando sea necesario:

  • Dividir un programa en módulos: Ya que es mas fácil mantener el código posteriormente, debido a la separación de operaciones y el reducido tamaño de los programas, acelerando la ejecución y se documenta mejor.

  • Realizar tareas repetitivas: Los formatos empleados para mostrar datos en pantalla con un modelo determinado son un ejemplo del uso de procedimientos.

Usemos funciones cuando sea necesario:

  • Validar datos o procesos: Dado que las funciones se llaman directamente por su nombre sin requerir del comando DO.

  • Realizar cálculos: Las operaciones en general son mas cómodas de hacer con funciones.

  • Sumar procesos: En informes es el único camino para sumar procesos.

Capitulo 2

CONTROL SAY/GET

@ <fila>,<columna> SAY <Exp> GET <var>/<campo>

SAY visualiza la expresión en las coordenadas indicadas

GET asigna a la variable o campo el valor tecleado

La lectura se hace cuando se encuentra el comando READ.

FUNCTION/PICTURE <Exp>

Ambas clausulas nos proporcionan un formateo especial de presentacion de la variable, la diferencia fundamental entre ambas clausulas es que FUNCTION actua de forma global, miestras que PICTURE actua elemento a elemento.

En <Exp> se usa un codigo especial definido en las tablas siguientes:

Function:

A

Solo caracteres alfabéticos, no espacios ni símbolos

B

Justifica los números a la izquierda

D

Usa el formato de fecha activo

L

Muestra ceros a la izquierda

I

Centra texto

T

Elimina los espacios en blanco iniciales y finales.

S<n>

Limita el ancho a n caracteres, aunque puedes poner mas.

J

Justifica texto a la derecha

X

Cualquier carácter

Z

Presenta blanco en lugar de cero

!

Convierte a mayúsculas

Picture:

A

Solo caracteres alfabéticos

L

Solo datos lógicos

N

Solo letras o dígitos

X

Cualquier carácter

!

Convierte a mayúsculas

9

Dígitos o en blanco

#

Dígitos, blanco o signo

*

Muestra asteriscos a la izquierda de números.

.

Separador decimal

,

Separador de miles

Los codigos de FUNCTION pueden ser introducidas en PICTURE con un símbolo @. Se puede poner varias condiciones solo hay que separarlas por ;

DEFAULT <Exp>

Si no existe esta cláusula deberá ser definida previamente la variable usada en el GET u obtendrás un error. En caso de ya existir la variable, esta cláusula es ignorada.

MESSAGE <mensaje>

Muestra <Exp> como un mensaje sobre la línea 24. Este mensaje podría ser presentado en otra línea con SET MESS TO

SIZE <Exp1>,<Exp2>

Con <Exp1> manejamos al alto (# de filas), pero siempre debera ser de 1 fila para FoxPRO DOS y con <Exp2> puedemos manejar el ancho (# de columnas) de <var>/<campo>. Si no usas esta cláusula el ancho lo determina la cláusula PICTURE. Si tampoco se uso esta cláusula el ancho queda definido por el contenido actual de la variable o campo.

RANGE <Exp1>,<Exp2>

Solo se usa para datos numéricos o de tipo fecha y es el rango en el cual deberá estar contenido el dato. Esta condición solo se evalúa cuando se cambia de valor y no cuando solo aceptas el valor inicial vía <Enter>. En caso de error devuelve el error estándar o la <Exp> de la cláusula ERROR impidiendo que se abandone el GET. Es decir es una post-condicion.

VALID <Cond>

Es una post-condicion es decir que una vez ingresado un valor y se intente salir del GET se evaluara <Cond>. Si esta es verdadera, permitirá la salida, pero si es falsa se devuelve un mensaje de error estándar o la <Exp> de la cláusula ERROR impidiendo que se abandone el GET. Nota que se puede salir del GET con <Esc>, pero no aceptara el cambio.

Es posible devolver un numero en lugar de un valor lógico, si es 0 el curso no avanzara, quedándose en el mismo objeto, si el numero es positivo avanzara y si es negativo retrocederá según el numero.

ERROR <mensaje>

Si se añade esta cláusula junto con VALID se mostrara <mensaje> en lugar del mensaje estándar.

WHEN <Cond>

Solo permitirá editar la <var>/<campo> si <Cond> es verdadera antes de entrar a dicho GET. Es decir es una pre-condicion.

COLOR

Permite determinar una serie de pares de color, que afectan a diversas partes según la siguiente tabla:

Colores

Atributos

N

Negro

+

Mas intenso primer plano

W

Blanco

*

Aclarar color de fondo

B

Azul

R

Rojo

Monocromáticos

G

Verde

N

Negro

GR+

Amarillo

W

Blanco

RB

Magenta

U

Subrayado

BR

Cyan

I

Vídeo inverso

GR

Marrón

+

Mas intenso primer plano

X

Invisible

*

Parpadeante

Pares de color

1

Expresión de SAY

2

Región GET

5

Texto de mensaje

6

Región GET seleccionado

10

Región GET desactivado

WINDOWS <nombre>

Esta cláusula es usada para editar un campo MEMO. La ventana deberá ser creada previamente y debes usar <Ctrl><W> para guardar los cambios.

ENABLE/DISABLE

Permite acceder o no al GET. Normalmente se activa desactiva desde una función de usuario que esta como VALID de otro GET vía el comando SHOW GET <var> ENABLE/DISABLE

SHOW GET

SHOW GET <var>/<campo> [,<#> [PROMPT <exp>]] [ENABLE/DISABLE] [LEVEL <#>] [COLOR <pares>]

Vuelve a mostrar el objeto representado por la <var> o <campo> de manera que actualiza la pantalla si se cambio su valor o cambia el texto de un boton (<#> especifica la opcion en caso de un boton multiple como RADIO o PUSH) o cambiar el estado de abilitado a desabilitado y viseversa.

Tipicamente se usa una funcion de usario en una clausula VALID de otro boton, la clausula WHEN del mismo boton o la clausula en READ.

SHOW GETS [ENABLE/DISABLE] [LEVEL <#>] [OFF / ONLY] [LOCK] [WINDOW <nombre>] [COLOR <pares>]

Refresca todos los objetos pendientes y ejecuta la rutina SHOW del READ activo.

Cuando se incluye OFF no se refrescan los objetos, solo se ejecuta la rutina de SHOW del READ activo. Con ONLY solo se refrescan los objetos y no se ejecuta la rutina SHOW del READ activo.

Cuando se incluye LOCK se bloquea el registro si se uso <campo> en lugar de <var>

SHOW OBJECT <#> [ENABLE/DISABLE] [LEVEL <#>] [PROMPT <exp>][ COLOR <pares>]

Funciona igual que SHOW GET solo que la referencia no se hace con <var> o <campo> sino por el numero de objeto segun OBJNUM() o _CUROBJ.

CLEAR GETS/READ

CLEAR GETS

Cancela todas los GET pendientes

CLEAR READ [ALL]

Cancela el READ actual y retorno el control al antior o cancela todos de incluir la clausula ALL.

RDLEVEL()

Retorna el nivel READ actual.

OBJNUM() y _CUROBJ

Capitulo 3

BOTONES OBJETO

BOTON DE RADIO (*R)

Son un conjunto de opciones precedidas de paréntesis y solo una de ellas podrá seleccionarse a la vez, vía un punto. Por omision no termina el READ CYCLE.

@ f,c GET <var>/<campo> [FUNC <formato> / PICT <formato>] [DEFA <exp>] [SIZE <n1,n2,n3>] [ENAB / DISA] [MESS <mensaje>] [VALID <cond>] [WHEN <cond>] [COLOR <pares>]

SIZE

Con esta clausula manejamos el tamaño. n1 determina el alto en filas (siempre 1 en DOS), n2 determina el ancho y n3 determina el espacio entre las opciones.

Pares de color

5

Texto de mensaje

6

Botón seleccionado

7

Tecla caliente

9

Botón habilitado

10

Botón desactivado

x=1

@ 5,5 GET x PICT `@*R \<Masculino;\<Femenino'

READ

IF x=1

? `Varón'

ELSE

? `Mujer'

ENDIF

o también:

x=`Masculino'

@ 5,5 GET x PICT `@*R \<Masculino;\<Femenino'

READ

? x

BOTON DE CONFIRMACION o CHECK BOX (*C)

Representa una sola opción independiente que puede tomar el valor de verdadero o falso, 1 o 0, vía una aspa. Por omision no termina el READ CYCLE.

@ f,c GET <var>/<campo> [FUNC <formato> / PICT <formato>] [DEFA <exp>] [SIZE <n1,n2>] [ENAB / DISA] [MESS <mensaje>] [VALID <cond>] [WHEN <cond>] [COLOR <pares>]

SIZE

Con esta clausula manejamos el tamaño. n1 determina el alto en filas (siempre 1 en DOS), n2 determina el ancho en columnas.

Pares de color

5

Texto de mensaje

6

Botón seleccionado

7

Tecla caliente

9

Botón habilitado

10

Botón desactivado

STORE .F. TO x1,x2,x3

@ 5,5 GET x1 PICT `@*C Uno'

@ 6,5 GET x2 PICT `@*C Dos'

@ 7,5 GET x3 PICT `@*C Tres'

READ

? `Quiere: '

IF x1

?? `Uno'

ENDIF

IF x2

IF x1

?? ` y `

ENDIF

?? `Dos'

ENDIF

IF x3

IF x1 .OR. x2

?? ` y `

ENDIF

?? `Tres'

ENDIF

IF !(x1 .OR. x2 .OR. x3)

?? ` ninguno'

ENDIF

Nota: También puedes inicializar las variables con 0 o 1.

BOTON PULSADOR o PUSH BUTTONS (*)

Es un conjunto de opciones que por omision terminan el GET CYCLE cuando se selecciona alguna.

@ f,c GET <var>/<campo> [FUNC <formato> / PICT <formato>] [DEFA <exp>] [SIZE <n1,n2,n3>] [ENAB / DISA] [MESS <mensaje>] [VALID <cond>] [WHEN <cond>] [COLOR <pares>]

SIZE

Con esta clausula manejamos el tamaño. n1 determina el alto en filas (siempre 1 en DOS), n2 determina el ancho en columnas y n3 el espaciamiento entre elementos.

Pares de color

5

Texto de mensaje

6

Opción seleccionada

7

Tecla caliente

9

Opción habilitado

10

Opción desactivado

ok=1

DO WHILE .T.

@ 5,5 GET ok PICT `@* \!\<Ejecutar;\?\<Cancelar'

READ

IF ok=2

EXIT

ENDIF

? `Bien, continuamos...'

ENDDO

Nota: Hay dos opciones predeterminadas:

Descripcion

Activa con

\!

Opcion por defecto, que estara resaltada

<Ctrl><Enter>

\?

Opcion de escape

<Esc>

MENU DESPLEGABLE o BOTON POPUP (^)

Un marco en cuyo interior están las opciones en forma vertical. Por omision no termina el READ CYCLE. Se puede incluir SIZE <ignorado>,<ancho>

@ f,c GET <var>/<campo> [FROM <matriz> [RANGE <n1[,n2]>]] / [POPUP <nombre>] [FUNC <formato> / PICT <formato>] [DEFA <exp>] [SIZE <n1,n2>] [ENAB / DISA] [MESS <mensaje>] [VALID <cond>] [WHEN <cond>] [COLOR <pares>]

RANGE

Por omision el POPUP toma la primera columna de la matriz. Tu puedes cambiar esto determinado de que elemento quieres empezar con n1 y opcionalmente tambien puedo determinar cuantos elementos tomar con n2.

Por ejemplo si tenemos una matriz 3 x 3 asi:

a

b

c

d

e

f

g

h

i

Si uso n1=3, el POPUP toma los elementos c, f, i.

Si uso n1=5, el POPUP toma los elementos e, h.

Si uso n1=2 y n2=2, el POPUP toma los elementos b, e.

SIZE

Con esta clausula manejamos el tamaño. n1 es ignorado y n2 determina el ancho en columnas.

Pares de color

1

Opción desactivada

2

Opción habilitada

3

Borde

5

Texto de mensaje

6

Opción seleccionada

7

Tecla caliente

9

POPUP habilitado

10

POPUP desactivado

Hay tres maneras de definir las opciones de un popup:

  • Desde la clausula FUNC o PICT

  • Desde una matriz

  • Desde un menu POPUP

X=1

@ 5,5 GET x PICT `@^ opc1; opc2; opc3'

READ

@ 5,5 GET y PICT `@^' FROM w

READ

Nota: Si w fuera una matriz bidireccional se mostraran solo los valores de la primera columna de la matriz.

@ 5,5 GET z PICT `@^' FROM w RANGE 2

READ

Nota: Si w fuera una matriz bidireccional se mostraran solo los valores de la columna indicada en RANGE <n1>.

@ 5,5 GET z PICT `@^' FROM w RANGE 3,3

READ

Nota: Si w fuera una matriz bidireccional se mostraran solo los valores de la columna indicada con RANGE <n1> y el numero de elementos con <n2>.

Ejemplo:

USE alumnos

DIMM x(FCOUNT())

FOR a=1 to FCOUNT()

x(a)=FIELD(a)

ENDFOR

@ 5,5 GET y PICT `@^' FROM x SIZE 1,20

READ

Una interesante opción aquí es el uso del parámetro POPUP, donde previamente se debió definir dicho POPUP con:

DEFI POPUP <nombre> PROMPT

FILES [LIKE <esqueleto>]

STRUCTURE

FIELD <campo>

SIZE <f>,<c>

Alto en filas y ancho en columnas del popup

MARG

Añade un margen adicional

SCROLL

Permite manejar una barra de desplazamiento

MARK <Exp>

Simbolo a usar al seleccionar

SHADOW

Pone una sobra

TITLE <Exp>

Pone <Exp> como titulo del popup

FOOT <Exp>

Pone <Exp> como pie del popup

para luego llamar:

@ 5,5 GET <var> POPUP <nombre> SIZE <alto>,<ancho>

READ

BOTON DE LISTAS (&)

Es muy parecido al anterior, solo que aquí todas las opciones son visibles todo el tiempo. Por omision no termina el READ CYCLE.

@ f,c GET <var>/<campo> FROM <matriz> [RANGE <n1,n2>] [FUNC <formato> / PICT <formato>] [DEFA <exp>] [SIZE <n1,n2>] [ENAB / DISA] [MESS <mensaje>] [VALID <cond>] [WHEN <cond>] [COLOR <pares>]

SIZE

Con esta clausula manejamos el tamaño. n1 determina el alto en filas y n2 determina el ancho en columnas.

Pares de color

1

Opción desactivada

2

Opción habilitada

3

Borde y barra de desplazamiento

5

Texto de mensaje

6

Opción seleccionada

9

Lista habilitado

10

Lista desactivado

@ 5,5 GET x PICT `@&' FROM w SIZE 5,20

READ

BOTON INVISIBLE (*I)

Es un conjunto de opciones de pantalla que pone en vídeo inverso lo que hay en esa posición, permitiendo que sea cualquier cosa lo que se muestre. Después de *Y hay un espacio seguido de tantos ; como botones -1 hay. Aquí es muy importante usar la cláusula SIZE <alto>, <ancho>, <separación>. Por omision no termina el READ CYCLE.

@ f,c GET <var>/<campo> [FUNC <formato> / PICT <formato>] [DEFA <exp>] [SIZE <n1,n2,n3>] [ENAB / DISA] [MESS <mensaje>] [VALID <cond>] [WHEN <cond>] [COLOR <pares>]

SIZE

Con esta clausula manejamos el tamaño. n1 determina el alto en filas, n2 determina el ancho en columnas y n3 determina el espacio entre las opciones en columnas.

Pares de color

5

Texto de mensaje

6

Botón seleccionado

FOR y=0 TO 32 STEP 8

@ 5,5+i TO 8+i,9

ENDFOR

@ 5,5 GET x PICT `@*I ;;;' SIZE 3,4,5

READ

Nota: 4 rectángulos de 3 caracteres de alto, 4 de ancho, separados 5 caracteres entre ellos.

Opciones:

T

Termina:

Después de seleccionada una opción termina el READ

N

No termina:

Continua el READ CYCLE

H

Horizontal:

Acomoda las opciones una bajo otra.

V

Vertical:

Acomoda las opciones una al lado de otra.

\<

Tecla caliente:

Se ilumina y calienta la letra siguiente a este símbolo.

\!

Por defecto:

Se marca con << >> y un <Ctrl><Enter> la activa.

\?

Salida por defecto:

Cuando se pulsa <Esc> se ejecutara esta opción.

\\

Desactivada:

Opción desactivada

Resumen de botones objeto:

Botón

Picture

Omisión

Especiales

Radio

@*R

NV

TH

\<, \\

Check

@*C

N

T

\<, \\

Push

@*

TV

NH

\<, \\, \!, \?

Popup

@^

N

T

\<,\

Lista

@&

T

N

Invisible

@*I

NV

TH

\\

Capitulo 4

Activar botones: READ

Activa todos los objetos creados desde el último READ o CLEAR GETS. Los objetos son campos GET, casillas de verificación, listas, emergentes, botones de comando, botones de radio y regiones de edición de texto definidas con @ ... GET.

Un usuario puede salir de un READ de varias formas:

  • Moviéndose hacia adelante/atrás mas allá del primero/último objeto. Solo si no se añadió la cláusula CYCLE.

  • Al presionar <Esc>, <Ctrl><W> o elegir un botón que estaba definido para terminar el READ.

  • También se temían el READ emitiendo CLEAR READ o debido a la cláusula TIMEOUT.

Notas:

  • Un READ puede abarcar varias ventanas.

  • Cuando mueva el cursor de objeto a objeto, los objetos se activaran en el orden en el que se crearon, independientemente de la ventana en la que estén situados.

  • Cuando mueva el cursor a un objeto, la ventana que lo contiene se convertirá en la ventana de salida.

  • Los READ anidados se crean definiendo objetos y emitiendo READ en una rutina que se llamará mientras que el READ esté activo. Los comandos READ pueden anidarse hasta cinco niveles de profundidad. RDLEVEL() devuelve el nivel READ actual.

Orden de ejecución de los eventos:

Cláusula WHEN del nivel READ

Primer GET de la ventana

Cláusula ACTIVATE del nivel READ

Cláusula SHOW del nivel READ

Cláusula WHEN del nivel GET para el primer GET

La lista siguiente muestra el orden en el que se llama a las cláusulas READ cuando se activa una ventana nueva:

Cláusula VALID del campo del que se sale

Se desactiva la ventana del campo del que se sale

Se activa la ventana del nuevo campo GET

Cláusula DEACTIVATE del nivel READ

Cláusula ACTIVATE del nivel READ

Cláusula WHEN del campo nuevo

ACTIVATE <ExpL1>

Esta cláusula se ejecuta cuando se emite el READ y cada vez que cambia la ventana. Puede verse como una cláusula WHEN a nivel de ventana.

La expresión lógica <ExpL1> es normalmente una función definida por el usuario, que usa WOUTPUT() para determinar qué ventana está activa y puede desactivar objetos @ ... GET de otras ventanas, ocultar ventanas, mostrar un mensaje, etc.

DEACTIVATE <ExpL2>

Esta cláusula se ejecutará siempre que intente traer hacia adelante cualquier otra ventana (esto es, siempre que cambie WONTOP()). Puede verse como una cláusula VALID a nivel de ventana.

La expresión lógica <ExpL2> es normalmente una función definida por el usuario, que puede usarse para validar el contenido de campos de una ventana antes de permitirle poner delante otra ventana. El READ terminara o no dependiendo de la respuesta de la función: verdadero (.T.) o falso (.F).

MODAL

Esta cláusula impide que se activen las ventanas que no están involucradas en el READ.

WITH <lista títulos de ventana>

De forma predeterminada, todas las ventanas interjectivas (ventanas Examinar, accesorios de escritorio y ventanas abiertas con MOD FILE, MODI REPORT, etc.) pueden participar en un READ. Incluya la cláusula WITH para restringir las ventanas que participan en el READ. Las ventanas incluidas en la cláusula WITH pueden incluir ventanas del sistema (Examinar, accesorios y ventanas de edición texto y memo). La inclusión de la cláusula WITH crea automáticamente un READ MODAL.

Incluya el título de la ventana Examinar (de forma predeterminada, el alias de la tabla) en la lista de ventanas para que esté accesible la ventana Examinar.

Incluya el alias de la tabla en la lista de ventanas para que esté accesible la ventana Memo.

Si el título de una ventana contiene un carácter que no es alfabético, numérico o un subrayado, incluya la parte del título hasta el primer carácter que no sea alfabético, numérico o subrayado en la lista de ventanas. Por ejemplo, si el título de la ventana es 'Lista de clientes', incluya Lista en la lista de ventanas (el espacio entre 'Lista' y 'de' no es alfabético, numérico o un subrayado).

Si el título de una ventana contiene un carácter que no es alfabético, numérico o un subrayado, puede situar el título entre comillas en la lista de ventanas. Por ejemplo si el título de la ventana es 'Lista de clientes', puede incluir "Lista de clientes" en la lista de ventanas.

SHOW <ExpL3>

Esta cláusula se ejecuta siempre que se emite SHOW GETS. El valor devuelto por una rutina SHOW se ignora. Una rutina SHOW puede usarse para refrescar @ ... SAY o para activar o desactivar objetos.

VALID <ExpL4> | <ExpN1>

Esta cláusula se evalúa cuando intenta salir del READ actual o cuando se emite READ sin una cláusula @ ... GET que excede el tiempo. La cláusula VALID puede especificar una expresión lógica o numérica o una función definida por el usuario (FDU) que devuelve un valor lógico o numérico.

El READ se terminará si la expresión <ExpL4> se evalúa verdadera (.T.). Si VALID <ExpL4> se evalúa como falsa (.F.), el objeto actual permanecerá activo, si es posible.

Si el objeto no puede permanecer activo (quizá la rutina VALID desactivó el objeto), se moverá al primer objeto.

Si la cláusula VALID devuelve un número, se moverá al objeto correspondiente. El READ se terminará si no existe un objeto correspondiente al número. Una cláusula VALID que devuelve un

valor que no sea de tipo Lógico o Numérico tiene el mismo efecto que si devolviera verdadero (.T.).

WHEN <ExpL5>

Esta cláusula determina si se ejecuta el READ. <ExpL5> debe evaluarse verdadera (.T.) al emitir el READ para que se ejecute el READ. Si <ExpL5> se evalúa falsa (.F.), se ignorará el READ y la ejecución del programa continuará con el comando que sigue inmediatamente a READ.

OBJECT <ExpN2>

Incluya esta cláusula para especificar el objeto que se selecciona inicialmente cuando emita READ. <ExpN2> determina el objeto que estará seleccionado inicialmente. Los números de los objetos se determinan por el orden en el que se crean los objetos.

Cada botón de comando, botón radio e invisible individual se considera un objeto. En el ejemplo de programa siguiente, se crean un campo y tres botones radio. El botón radio central se selecciona inicialmente incluyendo la cláusula OBJECT 3 con el READ. El campo NOMBRE es el objeto número 1, el primer botón radio es el objeto número 2, el segundo botón radio es el objeto número 3 y el último botón radio es el objeto número 4.

radio=1

nombre=SPACE(10)

CLEAR

@ 2,2 SAY 'Introduzca un nombre: ' GET name

@ 4,2 GET radio PICTURE '@*R Manzanas;Naranjas;Limones'

READ CYCLE OBJECT 3

TIMEOUT <ExpN3>

Esta cláusula determina cuanto tiempo estará en efecto un READ. <ExpN3> especifica el número de segundos que pueden transcurrir sin que el usuario introduzca nada antes de que se termine el READ. Si el READ se termina por una cláusula TIMEOUT, READKEY() devuelve 20 si no se han hecho cambios a ninguno de los objetos. Si se han hecho cambios, READKEY() devolverá 276.

Cuando se termina READ por una cláusula TIMEOUT, se descartarán todos los cambios hechos en el campo que se estaba editando cuando terminó el READ. Sin embargo, se guardan los cambios hechos en otros campos.

SAVE

Todas las definiciones de objetos se eliminan cuando se termina un READ a menos que se incluya la palabra clave SAVE. Puede remitir READ sin recrear los objetos si incluye SAVE con el READ previo.

NOMOUSE

Incluya la palabra clave NOMOUSE para impedir que se seleccionen objetos con el Mouse. Debe utilizar el teclado para moverse de objeto en objeto. Puede, no obstante, utilizar el Mouse dentro de los campos para cortar, copiar y pegar y para posicionar el cursor.

LOCK | NOLOCK

Las palabras clave LOCK y NOLOCK le permiten especificar si un registro que contiene campos especificados en los objetos se bloquea automáticamente durante un READ cuando la tabla está abierta para uso compartido en una red.

Si se incluye LOCK, se intentarán bloqueos de registro para cada registro utilizado en los objetos. Si los bloqueos se realizan con éxito, podrá editar los registros. SET REPROCESS determina cuantas veces o durante cuanto tiempo se intentarán los bloqueos. Si no se incluye LOCK o NOLOCK, READ asumirá, de forma predeterminada READ LOCK.

Si se incluye NOLOCK, no se bloquearán los registros utilizados en los objetos. En su lugar, todos los objetos que utilicen campos de los registros se harán de solo lectura y no podrá seleccionarse el control y se mostrará en colores desactivados.

Si emite READ NOLOCK y modifica un campo memo, el registro se bloqueará automáticamente.

READ de fundación

FoxPRO te permite crear fácilmente interfaces controladas por eventos (como el interfase FoxPRO) para sus aplicaciones.

Con versiones anteriores de FoxPRO, algunos usuarios sofisticados usaban un bucle de eventos para controlar las opciones de menú y las selecciones de ventana al crear una interfaz controlada por eventos. El bucle de eventos debía sondear constantemente el estado del sistema y luego actuar basándose en la ventana que estaba encima o en la opción de menú elegida por el usuario.

DO WHILE se usa para crear el bucle de eventos (a menudo un bucle grande). Deben evitarse los bucles de eventos por las razones siguientes:

Un solo READ con varias ventanas

Es muy raro necesitar programación de bucles de eventos en FoxPRO. Puede usarse un solo READ que soporte varias ventanas para eliminar la mayoría de los bucles de eventos. Un solo READ con múltiples ventanas proporciona versatilidad y flexibilidad sin programación compleja.

Sugerimos que delimite todas las ventanas con las que quiere interactuar. FoxPRO puede coordinar ventanas que contienen objetos (@..GET, casillas de verificación, botones radio, emergentes, etc.) con otras ventanas que no están asociadas habitualmente con un READ. De forma predeterminada, todas las ventanas interactivas (ventanas Examinar, accesorios del escritorio, ventanas de edición memo y ventanas abiertas con MODIFY FILE, MODIFY REPORT) pueden participar en un READ.

Coordinar ventanas con un solo READ

Para coordinar mediante programa ventanas que contienen objetos @ ... GET con un solo READ:

Cree las ventanas que contendrán los objetos @ ... GET.

Active una de las ventanas y emita los @ ... GET que crean los objetos de la ventana.

Active otra ventana y emita los @ ... GET que crean los objetos de esa ventana.

Continúe de esta forma con el resto de las ventanas.

Emita READ.

El código de programa de conjunto de pantalla generado por GENSCRN proporciona un buen ejemplo de esta secuencia.

Las ventanas creadas y activadas están ahora coordinadas por un solo READ. Cada uno de los objetos GET aparece en su ventana respectiva y el usuario puede moverse entre los objetos @...GET de cada una de las ventanas. Cuando el usuario se mueve de un objeto a otro con el teclado, los objetos se atraviesan en el orden en que se han emitido los @...GET, independientemente de la ventana en la que estén. Una ventana se activa y se convierte en la ventana de salida actual cuando el objeto actual está en la ventana.

Cuando el usuario presiona <Tab>, <Enter> o Flecha abajo cuando el cursor está posicionado en el último objeto de una ventana, el cursor se posicionará sobre el primer objeto @...GET de la ventana siguiente. Cuando el usuario presiona Mayús+Tab o Flecha arriba en el primer objeto de una ventana, el cursor se posicionará en el último objeto @...GET de la ventana anterior. El usuario pude moverse también entre objetos @...GET diferentes de ventanas diferentes haciendo clic sobre los objetos.

El acceso a otras ventanas durante un solo READ puede controlarse con la cláusula READ MODAL.

Al incluir MODAL en READ impide la interacción con las ventanas que no pertenezcan al conjunto de ventanas coordinadas del READ. Cuando se incluye MODAL con READ, el usuario no podrá cerrar, ampliar, minimizar o mover ventanas que no estén involucradas en el READ. Al hacer clic sobre una ventana no involucrada en el READ sonará el tono, si BELL está SET ON.

De forma predeterminada, todas las ventanas interactivas (ventanas Examinar, accesorios del escritorio y ventanas abiertas con MODIFIY FILE, MODIFY REPORT, etc.) pueden participar en un READ.

Puede indicar explícitamente las ventanas que participan en el READ especificando sus nombres con la cláusula WITH. El comando READ se hace automáticamente MODAL si incluye la cláusula WITH para especificar otras ventanas involucradas en el READ. Las ventanas incluidas en la cláusula WITH pueden incluir ventanas del sistema FoxPRO (ventanas Examinar, accesorios del escritorio y ventanas de edición texto y memo).

ACTIVATE y DEACTIVATE

Cuando una ventana involucrada en el READ se trae hacia delante, la acción realizada puede controlarse con las cláusulas ACTIVATE y DEACTIVATE. El usuario podrá traer una ventana hacia adelante haciendo clic sobre la ventana, recorriendo cíclicamente las ventanas con Ctrl+F1 o eligiendo un control o una opción de menú que active la ventana.

Cuando una ventana que contiene el objeto esté encima del todo e intente poner encima otra ventana, la cláusula DEACTIVATE se ejecuta después de que se traiga hacia adelante la nueva ventana.

El valor devuelto por la cláusula DEACTIVATE determina si el READ está terminado. Si la cláusula DEACTIVATE devuelve verdadero (.T.), se termina el READ. Si la cláusula devuelve falso (.F.), el READ no se terminará.

Cuando se ejecuta la cláusula DEACTIVATE, WONTUP() devuelve el nombre de la nueva ventana que se ha puesto delante y WLAST() el nombre de la ventana que estaba antes delante del todo. Las funciones de ventana (WONTOP(), WOUTPUT() ...) devolverán falso (.F.) si incluye el nombre de una ventana que no existe.

Si su cláusula DEACTIVATE deja que la nueva ventana permanezca delante y la ventana nueva contiene objetos, se ejecutará la cláusula ACTIVATE.

Sugerencia Cuando se trae una ventana hacia adelante, puede retornar la ventana a su posición anterior emitiendo el comando siguiente en la cláusula DEACTIVATE.

ACTIVATE WINDOW (WLAST())

La función WREAD() facilita la manipulación de ventanas que participan en un READ. WREAD() le permite determinar si una ventana específica está participando en el READ actual.

Coordinar READ múltiples/READs de fundación

La sección anterior sobre un solo READ con múltiples ventanas recomienda una solución al control de múltiples ventanas con un solo comando READ. La solución mediante un solo READ funciona en la mayoría de las aplicaciones.

Sin embargo, en algunas aplicaciones puede ser necesario un READ de fundación. Un READ de fundación es un READ sin objetos. Un READ de fundación se utiliza para coordinar varios READ en una sola sesión interactiva.

Un READ de fundación incorpora normalmente código en la rutina de su cláusula VALID que activa los controles de los READ hijos. Los READ hijos también se denominan READ anidados.

Un READ de fundación tiene normalmente una cláusula VALID, La cláusula VALID se ejecuta cuando se produce el evento que en otro caso terminaría con el READ. Estos son los eventos que terminan un READ de fundación:

Cualquier clic de Mouse o pulsación de teclas que no sea una selección de menú o no ejecute una instrucción ON KEY LABEL.

Durante un READ de fundación, el menú del sistema FoxPRO está accesible.

Seleccionar un elemento de un menú o ejecutando un comando ON KEY LABEL no termina un READ de fundación. Si se activa un menú pero no se hace una selección del menú, el READ de fundación no se terminará.

Al terminar un READ hijo. Sin embargo, el READ de fundación no se terminará si se termina un READ nieto.

El valor devuelto por la cláusula READ VALID determina si se termina o no un READ de fundación.

Si la cláusula READ VALID devuelve verdadero (.T.), se terminará el READ de fundación; si devuelve falso (.F.), el comando READ de fundación permanecerá activo.

READKEY() facilita la gestión de los comandos READ. Especificando un argumento numérico en READKEY(), podrá determinar si se terminó el último READ. Por ejemplo, el valor puede indicar que el último READ se terminó cerrando una ventana, por un CLEAR READ, por una cláusula READ VALID o DEACTIVATE que devuelva el valor lógico verdadero (.T.).

Estos son los valores que devuelve READKEY(<expN>) con la causa de terminación de READ

correspondiente:

Valor

Causa

1

Ninguna de las siguientes

2

Se ha emitido CLEAR READ

3

Se ha elegido el control de terminación

4

Se ha cerrado la ventana READ

5

La cláusula DEACTIVATE ha devuelto .T.

6

Se ha excedido el tiempo del READ

Capitulo 5

Otros objetos en FoxPRO

GETFILE(C1[,C2] [,C3] [,N])

Muestra el cuadro de dialogo `Abrir archivo' y devuelve la unidad, ruta, nombre y extensión del archivo elegido o una cadena nula si presionas <Esc> o elige el botón "Nada" o "Cancelar". Si eliges el botón "Nuevo", devolverá 'Anónimo' como nombre de archivo

C1: Designa la extensión de filtro, si no se pone ninguna mostrara todos los archivos. Ej:

  • PRG solo mostrara los archivos con esa extensión.

  • PRG;FXP mostrara los archivos de ambas extensiones, a no ser que tengan el mismo nombre en cuyo caso solo se mostrara el que lleva la extensión PRG.

  • PRG|FXP Muestra los archivos con ambas extensiones.

  • *P Muestra todas las extensiones que cumplen ese filtro. También puedes usar ? como comodín igual que DOS.

  • ; Mostraran solo los archivos que no tengan extensión.

  • Si no especificar nada, se mostraran todos los archivos

C2: Es el titulo en la parte superior del cuadro de dialogo.

C3: Texto en lugar del botón principal (Abrir por omisión)

N1: Numero y tipo de botón a usar.

  • 0 = <C3 o Abrir> y Cancelar

  • 1 = <C3 o Abrir>, Nuevo y Cancelar

  • 2 = <C3 o Abrir>, Nada y Cancelar

Ejemplo:

xDBF=GETFILE(`DBF','Ver una tabla','Ver',1)

DO CASE

CASE `Anonimo'$xDBF

CREATE ?

CASE EMPTY(xDBF)

RETURN

OTHER

USE &xDBF

BROW

ENDCASE

PUTFILE(C1[,C2] [,C3])

Muestra el cuadro de dialogo `Guardar como' y devuelve la unidad, ruta y nombre del archivo seleccionado.

Si no se introduce un nombre de archivo, se devuelve el nombre de archivo predeterminado (C2) y la extensión (C3).

Si se elige el botón de comando "Cancelar" o se presiona <Esc>, se devuelve la cadena nula.

C1 es el titulo en la parte superior del cuadro de diálogo.

C2 es el nombre de archivo predeterminado que se muestra en el cuadro de texto.

La primera extensión en C3 se añade automáticamente al nombre del archivo si no se incluye una extensión en C2. Unicamente se mostrarán los archivos con las extensiones especificadas.

  • PRG solo mostrara los archivos con esa extensión.

  • PRG;FXP mostrara los archivos de ambas extensiones, a no ser que tengan el mismo nombre en cuyo caso solo se mostrara el que lleva la extensión PRG.

  • PRG|FXP Muestra los archivos con ambas extensiones.

  • *P Muestra todas las extensiones que cumplen ese filtro. También puedes usar ? como comodín igual que DOS.

  • ; Mostraran solo los archivos que no tengan extensión.

  • Si no especificar nada, se mostraran todos los archivos

Este ejemplo crea un archivo de datos delimitado a partir de una tabla existente elegida por el usuario. GETFILE() se usa para encontrar y abrir una tabla y PUTFILE() se usa para devolver el nombre del archivo objetivo.

xDBF=GETFILE('DBF', 'Abrir tabla:')

USE (xDBF)

xNOM = ALIAS() + '.TMP'

xSAL = PUTFILE('Archivo de salida:', xNOM, 'TMP')

*--- Se ha presionado Esc

IF EMPTY(xSAL)

CANCEL

ENDIF

*--- Crear archivo delimitado

COPY TO (xSAL) DELI

MODI FILE (xSAL) NOEDIT

GETDIR(C1 [,C2])

Muestra el cuadro de diálogo “Seleccionar directorio” y devuelve el nombre de un directorio que se elija como una cadena de tipo Carácter.

Si no elige ningún directorio, ya sea que haces <Esc> o presionar el boton "Cancelar" se devolverá la cadena nula.

C1 especifica el directorio que se mostrará inicialmente en el cuadro de diálogo. Cuando no se especifica, se mostrara el directorio de trabajo.

C2 es el titulo en la parte superior del cuadro de diálogo.

LOCFILE(C1[,C2] [,C3])

Busca el archivo especificado y devuelve su ruta y nombre. Si no lo encuentra llama al cuadro de dialogo abrir (GETFILE()).

C1 especifica el nombre del archivo a buscar

C2 si no se especifico una extension en C1, esta es la lista de extensiones que se usaran para la busqueda

C3 es el titulo en la parte superior del cuadro de diálogo.

CREATE [<nombre>/?]

Muestra el cuadro de dialogo de crear una tabla.

GETEXPR C1 TO <var> [TYPE “C2 [,C3]”] [DEFAULT C4]

Llama el cuadro de dialogo `Generador de expresiones' y guarda la expresión construida por el usuario en la variable <var>.

C1 es el titulo que aparece en el cuadro, normalmente usado para recordar la clase de expresión a construir.

La expresión que se cree se guardará como una cadena de caracteres en la variable <var>. Si la variable de memoria no existe todavía, se creará.

Si sale del cuadro via "Cancelar", se almacenará la cadena C4 (si existe) o una cadena nula en la variable.

C2 especifica el tipo de expresión: C para carácter, N para numérico, D para fecha y L para lógico.

C3 es un mensaje de error que puedes usar solo si se uso tambien C2 y la expresión no es válida. C2 y C3 deben separase con punto y coma (;) y toda esta combinación debe encerrarse entre comillas.

C4 le permite mostrar la expresión inicial predeterminada, la cual se puede aceptar o sobrescribir una propia. Si se incluye la cláusula DEFAULT, C4 se almacenará en la variable de memoria si se sale del cuadro presionando ESC o eligiendo "Cancelar".

Ejemplo:

En este ejemplo, GETEXPT se usa para obtener una expresión LOCATE del tipo apropiado. Si LOCATE tiene éxito, se muestra el nombre de la empresa; en caso contrario, se muestra un mensaje.

CLOSE DATA

USE clientes

GETEXPR 'Escriba la condición a localizar ' TO x;

TYPE 'L;Error debe ser una condicion';

DEFA 'EMPRESA = " "'

LOCATE FOR &x

IF FOUND()

? 'Empresa:', empresa

ELSE

? 'La condición', x, ' no se encontró'

ENDIF

Capitulo 6

VENTANAS

DEFINE WINDOW

Crea una ventana y especifica sus atributos.

DEFINE WINDOW <nombre>

FROM <f1,c1> TO <f2,c2> / AT <f3,c3> SIZE <f4,c4>

[IN <ventana> | IN SCREEN]

[TITLE <Exp>]

[FOOTER <Exp>]

[DOUBLE | PANEL | NONE | SYSTEM | <cadena borde>]

[FLOAT]

[GROW]

[ZOOM]

[MINIMIZE]

[CLOSE]

[SHADOW]

[FILL <Exp>]

[COLOR <lista de pares de colores>]

El número de ventanas definidas por el usuario que puede crear está limitado únicamente por la cantidad de memoria y los recursos del sistema disponibles.

Las definiciones de ventana se sitúan en memoria y los nombres de las ventanas definidas por el usuario aparecen listados en la parte inferior del menú emergente Ventana. El nombre de la ventana de usuario creada en primer lugar aparece en la parte superior de la lista, seguido del nombre de cada ventana definida por el usuario adicional. El nombre de la ventana de usuario a la que se dirige actualmente la salida está marcado con un rombo. Si no hay ventana de salida, la salida se dirige al escritorio.

Especifique el nombre de la ventana a crear con <nombre>. Los nombres de ventana pueden tener hasta 10 caracteres de largo, debiendo empezar con una letra o subrayado y no pueden comenzar con un número. Pueden contener cualquier combinación de letras, números y subrayados.

La esquina superior izquierda de la ventana sobre el escritorio viene determinada por las coordenadas especificadas con <f1,c1> y la esquina inferior derecha se especifica con <f2,c2>. Estas coordenadas determinan el tamaño de la ventana.

Es posible definirse una ventana con coordenadas que caigan fuera del borde o que sean mayor que el escritorio. También pueden definirse ventanas situadas dentro de otras ventanas definidas por el usuario.

AT y SIZE pueden usarse también para especificar la posición y tamaño de una ventana.

IN <ventana>

Esta cláusula situar una ventana en otra ventana. Una ventana hija no puede moverse fuera de la ventana madre. Si se mueve la ventana madre, la ventana hija se moverá con ella.

Las coordenadas de la ventana hija especificadas con las cláusulas FROM y TO o AT y SIZE son relativas a la ventana madre, no al escritorio.

TITLE <Exp> asigna un título a la ventana, el cual se centra sobre el borde superior de la ventana. Si el título es más ancho que la ventana, se truncará el título.

FOOTER <Exp> asigna un pie a la ventana, el cual se centra sobre el borde inferior de la ventana. Si el pie es más ancho que la ventana, se truncará el pie.

DOUBLE | PANEL | NONE | SYSTEM | <cadena borde>

Puede especificar un borde incluyendo la cláusula DOUBLE, PANEL, NONE, SYSTEM o <cadena borde>. El borde predeterminado es una línea sencilla.

Nota: Si incluye otras cláusulas determinadas (GROW, ZOOM y así sucesivamente), los controles de ventana apropiados se situarán en el borde superior de la ventana.

FLOAT

Para mover una ventana, elija Mover del menú Ventana, presione <CTRL><F7> y use las teclas de flecha o con el Mouse puede arrastrar una ventana desde el borde superior o titulo.

Omita FLOAT para impedir que pueda moverse una ventana.

GROW

Para cambiar el tamaño de una ventana, elija Tamaño del menú Ventana o presione <Ctrl><F8>. Para cambiar el tamaño de una ventana con el Mouse, coloque el puntero sobre cualquier lado o ángulo de la ventana y arrástrelo.

Omita GROW para impedir que pueda cambiarse el tamaño de una ventana.

CLOSE

Si se incluye la cláusula CLOSE, podrá cerrar una ventana definida por el usuario desde el menú de Archivo, con las teclas <Ctrl><F4> o con un click en la esquina superior izquierda.

Si la ventana se creó con la cláusula SYSTEM, aparecera un cuadrado en el ángulo superior izquierdo, si no es asi se dispondrá del mismo cuadrado para cierre solo que "oculto" en el mismo lugar.

Al cerrar una ventana se quitará del escritorio o la ventana madre definida por el usuario y su definición se quitará de memoria.

Omite CLOSE para impedir que se cierre una ventana.

ZOOM

Una ventana definida por el usuario puede agrandarse hasta llenar por completo el escritorio. Si una ventana está agrandada a tamaño completo, también puede reducirse a su tamaño original.

Para agrandar una ventana elija Zoom flecha arriba del menú Ventana o presione <Ctrl><F10>.

Si la ventana se creó con la cláusula SYSTEM, puede hacer clic sobre el control de Zoom del ángulo superior derecho del borde de la ventana, si no es asi se dispondrá de un control Zoom "oculto" en el ángulo superior derecho del borde de la ventana. Al hacer clic sobre ese ángulo la ventana se agrandará hasta llenar todo el escritorio.

Repita estos pasos para volver la ventana a su tamaño original. Para agrandar una ventana hasta que llene por completo la ventana principal de FoxPRO, elija Maximizar del menú de control de la ventana, presione <CTRL><F10>, haga clic sobre el botón "Maximizar" de la ventana o haga doble clic sobre el borde superior de la ventana.

Para volver la ventana a su tamaño original, elija Restablecer del menú de control, presione <Ctrl><F5> o haga clic sobre el botón "Restaurar".

MINIMIZE

Para minimizar una ventana haga doble clic sobre el borde superior de la ventana, presione <Ctrl><F9> o elija Zoom hacia abajo del menú Ventana. Para volver la ventana a su tamaño original, repita los mismos pasos. Puede minimizar una ventana y "apartarla" en el ángulo inferior derecho del escritorio presionando la tecla MAYÚSCULAS cuando haga doble clic sobre el borde superior de la ventana.

SHADOW

De forma predeterminada, las ventanas no tienen sombra. Puede cambiar el estado predeterminado de las sombras con SET SHADOWS. Cualquier texto u objeto cubierto por la sombra será, no obstante, visible.

FILL <Exp>

Con esta cláusula se rellena con un carácter el fondo de la ventana. Si <Exp> contiene más de un carácter, únicamente se usará el primer carácter como carácter de relleno. También puede especificar un carácter de relleno con CHR().

COLOR <pares> / SCHEME <#>

De forma predeterminada, los colores de las ventanas se controlan mediante el esquema de color 1.

ACTIVATE WINDOW

Muestra y activa una o más ventanas definidas por el usuario.

ACTIVATE WINDOW [<nombre1> [,<nombre2> ...]] | ALL

[IN <ventana> | SCREEN]

[BOTTOM | TOP | SAME]

[NOSHOW]

Las ventanas activadas permanecen en el escritorio o en la ventana madre hasta que se emita DEAC WIND o HIDE WIND. Esto quita la ventana del escritorio o ventana madre pero no de la memoria. Las ventanas pueden volver a mostrarse con ACTI WIND o SHOW WIND.

Activar una ventana la convierte en la ventana frontal y dirige hacia ella toda la salida. La salida puede dirigirse a una sola ventana a la vez. Una ventana continúa siendo la ventana activa de salida hasta que se desactiva con DEAC WIND, se libera con RELE WIND o hasta que se activa otra ventana o el escritorio. Si no hay ventana de salida activa, la salida se dirigirá al escritorio.

Nota: Para asegurarse de que los resultados se dirigen a una ventana específica cuando se desactiva la ventana de salida, deberá activar explícitamente la ventana a la que desee enviar los resultados con ACTI WIND.

Todas las ventanas activadas se muestran hasta que se emite DEAC WIND o HIDE WIND para eliminarlas de la vista. La emisión de estos comandos elimina las ventanas de la vista, pero no de la memoria. Es posible volver a mostrar las ventanas emitiendo ACTI WIND o SHOW WIND.

Para eliminar las ventanas de la vista y de la memoria, use CLEAR WIND, RELE WIND o CLEAR ALL. Las ventanas que se eliminen de la memoria deberán redefinirse para volverlas a traer al escritorio.

ALL activará todas las ventanas definidas. La última ventana activada será la ventana de salida activa.

IN <ventana>

Cuando se incluye esta cláusula, la ventana se sitúa y activa en la ventana madre especificada con <nombre3>. La ventana activada se denomina ventana hija. Una ventana madre puede tener múltiples ventanas hijas. Una ventana hija activada dentro de una ventana madre no se puede desplazar fuera de ella. Si se desplaza la ventana madre, la ventana hija se moverá con ella.

Nota: La ventana madre debe estar visible para que cualquiera de sus ventanas hijas sean visibles.

IN SCREEN

Con esta cláusula es posible situar explícitamente una ventana en el escritorio, pero por omisión las ventanas se activan en el escritorio.

Es posible usar ACTI WIND para situar los accesorios de escritorio de FoxPRO y las ventanas del sistema en el escritorio o en una ventana madre. FoxPRO tiene los siguientes accesorios: Archivador, Calculadora, Calendario / Agenda, Caracteres especiales, Tabla ASCII y Puzzle. Ej: ACTI WIND calculadora

BOTTOM | TOP | SAME

Cuando activamos una ventana esta se convierte en la ventana frontal. Es posible incluir BOTTOM, TOP o SAME para especificar dónde se activan las ventanas respecto a otras ventanas previamente activadas.

Incluya NOSHOW para activar y dirigir la salida a una ventana sin mostrar la ventana.

Nota: Active una ventana usando NOSHOW para dibujar una ventana de entrada. Una vez dibujada la pantalla, emita SHOW WINDOW para que la ventana abierta "emerja". Esta técnica mostrará la ventana rápidamente.

DEACTIVATE WINDOW

Desactiva ventanas definidas por el usuario o ventanas de sistema quitándolas de la pantalla pero no de la memoria.

DEAC WIND <nombre1>[,<nombre2> ...] | ALL

En el escritorio puede situarse más de una ventana a la vez, pero la salida se dirige solamente a la ventana activada más recientemente. Cuando está presente más de una ventana, la desactivación de la ventana de salida actual limpia el contenido de la ventana, quita la ventana de la pantalla y envía la salida subsecuente a la ventana activada con anterioridad. Si no hay ventana de salida, la salida se dirige al escritorio.

Si incluye ALL se desactivarán todas la ventanas activas.

HIDE WINDOW

Oculta una o mas ventana definida por el usuario o de sistema que esté activa. No es lo mismo ocultar una ventana que cerrarla. Cuando se oculta una ventana, permanece residente en memoria y activa. La salida puede enviarse a una ventana oculta, pero no podrá verla.

HIDE WIND <nombre1> [,<nombre2>] ... | ALL

[IN <ventana> | IN SCREEN]

[BOTTOM | TOP | SAME]

[SAVE]

IN <ventana>

Las ventanas pueden ocultarse en una ventana madre. Puede especificar la ventana madre en la que se ocultará una ventana hija incluyendo IN WIND.

IN SCREEN

También puede ocultar específicamente una ventana en el escritorio.

BOTTOM | TOP | SAME

Incluya BOTTOM, TOP o SAME para especificar donde se ocultan las ventanas, con respecto a otras ventanas.

  • BOTTOM sitúa la ventana detrás de las otras ventanas

  • TOP la sitúa delante de todas las demás ventanas.

  • SAME oculta la ventana sin afectar su posición actual.

  • SAVE muestra una imagen de una ventana en el escritorio o en una ventana definida por el usuario después de que la ventana se ha ocultado.

Normalmente, las ventanas se quitan del escritorio o de una ventana definida por el usuario después de ocultarlas. Use CLEAR para quitar una imagen de ventana del escritorio o de una ventana definida por el usuario. No puede guardar una imagen de la ventana de salida actual.

RELEASE WINDOWS [<lista de ventanas>]

Esto deja disponible la memoria que tuvieran asignada previamente. Las variables de memoria del sistema no pueden liberarse. Las ventanas quitadas de memoria deberán definirse de nuevo para volver a mostrarse.

CLEAR WINDOWS

Libera de la memoria todas las definiciones de ventanas definidas por el usuario y borra las ventanas del escritorio.

SAVE WINDOWS

Guarda las definiciones de ventanas en un archivo o campo memo para su uso posterior.

RESTORE WINDOWS

Repone en memoria las definiciones de ventanas previamente almacenadas en un archivo o campo memo.

En el ejemplo siguiente, se crea una ventana madre, PRUEBA1. Una ventana hija, PRUEBA2, se sitúa en la ventana madre.

CLEAR

---ventana madre ---

DEFI WIND prueba1 FROM 1, 1 TO 20, 30 TITLE "Prueba1"

ACTI WIND prueba1

--- ventana hija ---

DEFI WIND prueba2 FROM 1, 1 TO 20, 20 TITLE "Prueba2" IN WIND prueba1

ACTI WIND prueba2

ACTIV SCRE

WAIT WIND 'Presione una tecla para borrar las ventanas.'

RELE WIND prueba1, prueba2

CLEAR

USO DE BROWSE EN UNA VENTANA

Esta es quizás una de las mejores maneras de manejar un browse ya que este toma las dimensiones de la ventana en la que fue metida:

Ejemplo 1: En este ejemplo se muestra los registros cuyos nombres empiecen con las letras de la A a la D inclusive, ordenados alfabeticamente, no se permitira modificar (NOMO) ni añadir (NOAP).

USE prueba ORDE nom

DEFI WIND W1 FORM 0,0 TO 10,40 TITLE `El titulo aqui' FOOT 'El pie aqui'

ACTI WIND W1

BROW IN WIND W1 FIEL nom,ape,fono KEY `A','D' NOMO NOAP

RELE WIND W1

Ejemplo 2: En este ejemplo la informacion es mostrada en un BROW que termina inmediatante (NOWA) pero no se borra (NOCL), queda visible.

USE prueba

DEFI WIND W2 FORM 5,20 TO 15,60

ACTI WIND W2

BROW IN WIND W2 FIEL nom,ape,fono NOWA NOCL

FUNCIONES DE VENTANA

WEXIST() = Dice si ventana estas definida o no

WONTOP() = Dice si ventana es la primera o no

WOUTPUT() = Dice si datos se dirigen o no a ventana

WVISIBLE() = Dice si esta visible o no una ventana

WCOLS() = # de columnas disponibles en ventana

WROWS() = # de filas disponibles en ventana

WLCOL() = Localización de columna mas a la izquierda

WLROW() = Localización de fila mas arriba

MWINDOW() = Da el nombre de ventana donde esta el Mouse

MDOWN() = Cuando haces clic, da un .T.

MCOL() = Columna donde esta el puntero del Mouse (0 a 79)

MROW() = Fila donde esta el puntero del Mouse (0 a 24)

ACCESORIOS DE ESCRITORIO

Es posible activar los accesorios disponibles desde el escritorio desde dentro de un programa con el comando:

ACTI WIND <nombre>

Accesorio

Nombre

Archivador

FILER

Calculadora

CALCULATOR

Calendario/Agenda

CALENDAR

Caracteres especiales

SPECIAL

Tabla ASCII

ASCII

Rompecabezas

PUZZLE

Nota: No sera necesario definir estas ventanas para usarlas.

VENTANAS DE SISTEMA

Tambien es posible activar ventanas del sistema por el mismo metodo para eso usar los nombre de la siguinte tabla.

Ventana

Nombre

Comandos

COMMAND

Depuracion

DEBUG

Seguimiento

TRACE

Presentacion

VIEW

Nota: No sera necesario definir estas ventanas para usarlas.

Capitulo 7

Practica

Crear un programa que muestre las opciones Siguiente, Anterior, Primero, Ultimo y luego la opcion <Salir>. Luego usando una tabla cualquiera, verificar su funcionamiento mirando el STATUS.

  • Basado en el programa anterior, añadir una opcion <Ver> junto al boton salir, de modo que al pulsarlo se muestren los campos del registro actual.

  • Crear un programa que muestre las tablas (DBF) existentes en el disco, permita abrir una, luego muestre sus campos permitiento seleccionar uno de ellos, para luego mostra todos los registros del campos seleccionado.

  • Crear un programa que muestre las tablas (DBF) existentes en el disco, permita abrir una, luego muestre todas sus etiquetas de indice, para luego de seleccionar una de ellas me informe sobre el campos o expresión que la componen.

  • Crear un programa que pida el monto a pagar, el monto entregado, las monedas y billetes disponibles, para determinar el vuelto y el numero de monedas y billetes a entregar (segun la disponibilidad)

  • Crear un programa que sea capaz de convertir metros a pies, kilos a libras, litros a galones y viseversa, segun la eleccion del usuario.

  • Crear un programa que muestre en una primera ventana el codigo, nombre y sexo del alumnos, en una segunda ventana los codigos, nombres y nota de cursos en los que esta matriculado, en una tercera ventana el total de creditos aprobados y el promedio ponderado y en una cuarta ventana las opciones: Siguiente, Anterior, Primero, Ultimo, Buscar y Salir. la opcion buscar sera por nombre de alumno.

  • Bibliografía:

    Programación en base a eventos

    - Cesar A. Bustamante Gutierrez - UNI

    FoxPRO 2.6 para DOS y Windows a su alcance

    - José Javier García Badell - McGraw Hill

    Programación basica con FoxPRO

    - Ramón M. Chordá - Rama

    Al dia en una hora en FoxPRO 2.6

    - José Carlos Corrales - Anaya Multimedia

    Guia practica FoxPRO 2.6

    - Alejandro Dominguez - Anaya Multimedia

    Diseño de programas: 200 algoritmos y un proyectos

    - Julio Vasquez Paragulla - Editorial San Marcos

    Microsoft FoxPRO for DOS and Windows, lenguage reference

    - Microsoft Press




    Descargar
    Enviado por:El remitente no desea revelar su nombre
    Idioma: castellano
    País: Perú

    Te va a interesar