| MICROSOFT VISUAL FOXPRO |

NIVEL I
INTRODUCCI�N A LAPROGRAMACI�N
INTRODUCCI�N
La presente Gu�a de Laboratorio, se elabor� con la finalidadde complementar la parte te�rica con la parte pr�ctica delcurso. Contiene una gran variedad de ejemplos pr�cticos .
Desde ya les deseo la mejor de las suertes en el aprendizajede Microsoft Visual FoxPro.
Lima, Setiembre del 2002
Microsoft
GU�A DE LABORATORIO N� 1
Objetivos
Luego de completar este laboratorio, el estudiante ser� capazde:
Consideraciones
Para el desarrollo del presente laboratorio Ud. deber� crearuna carpeta C:\FundVFP\Lab1, para guardar sus trabajoscorrespondientes a este laboratorio.
Aplicaci�n N� 1
En este primer ejercicio vamos a escribir un programa que leatres n�meros enteros y determine el n�mero mayor, el n�merocentral y el n�mero menor. Debemos asumir que los tres n�merosson siempre distintos.
Para el desarrollo de la presente aplicaci�n ingresar aMicrosoft Visual FoxPro. En la Ventana de Comandos digite lasiguiente orden:
Modify Command Aplica01
A continuaci�n se debe presentar el Editor de programas. Endicha ventana proceda a ingresar el c�digo que se indica:
Close All
Clear
Input "Ingrese el valor de A?" To nA
Input "Ingrese el valor de B?" To nB
Input "Ingrese el valor de C?" To nC
If nA > nB Then
nMay = nA
nMen = nB
Else
nMay = nB
nMen = nA
EndIf
If nC > nMayThen
nCen = nMay
nMay = nC
Else
If nC> nMen Then
nCen = nC
Else
nCen = nMen
nMen = nC
EndIf
EndIf
? "Mayor =" + Str(nMay)
? "Central =" + Str(nCen)
? "Menor =" + Str(nMen)
Para ejecutar su programa dar click en el bot�n Ejecutar (!)de la Barra de herramientas Est�ndar.
Para volver a ejecutar su programa digitar la siguiente ordendesde la Ventana de Comandos:
Do Aplica01
Aplicaci�n N� 2
Un restaurante ofrece un descuento del 10% para consumos entreS/. 30.00 y S/. 50.00; un descuento del 20% para consumos mayoresa S/. 50.00 nuevos soles; para todos los dem�s casos no seaplica ning�n tipo de descuento. El ejercicio consiste enelaborar una programa que permita determinar el importe a pagarpor el consumidor.
Para el desarrollo de la presente aplicaci�n abrir una nuevaventana de edici�n e ingresar el siguiente c�digo:
Close All
Clear
Do While .T.
Input "Consumo S/." To nConsumo
If Type ("nConsumo") = "N"
Exit
EndIf
EndDo
Do Case
Case nConsumo >= 30 And nConsumo <= 50
nImporte = nConsumo * 0.9
Case nConsumo > 50
nImporte = nConsumo * 0.8
Otherwise
nImporte = nConsumo
EndCase
? "Importe a pagar S/." + Str(nImporte)
Aplicaci�n N� 3
El ejercicio consiste en escribir un programa que lea "
Para el desarrollo de la presente aplicaci�n, de maneraan�loga que para los casos anteriores abrir una nueva ventana deedici�n e ingresar el siguiente c�digo:
Close All
Clear
Input "Ingrese cantidad de n�meros?" To nN
Declare aVector(nN)
For nI = 1 To nN
Input "N�mero [" + Str(nI) + "]?" ToaVector(nI)
Next
nMax = aVector[1]
nMin = aVector[1]
nSuma = 0
For nI = 1 To nN
nSuma = nSuma + aVector[nI]
If aVector[nI] > nMax Then
nMax = aVector[nI]
EndIf
If aVector[nI] < nMin Then
nMin = aVector[nI]
EndIf
Next
nMedia = nSuma / nN
? "Suma =" + Str(nSuma)
? "Media =" + Str(nMedia, 10, 2)
? "M�ximo=" + Str(nMax)
? "M�nimo=" + Str(nMin)
Aplicaci�n N� 4
A continuaci�n vamos a escribir una funci�n que reciba comoargumento de entrada una cadena de caracteres y la devuelva enforma inversa, por ejemplo si se ingresa la cadena CORAZONdeber� retornar NOZAROC.
Para el desarrollo de esta aplicaci�n proceda de manerasimilar a los casos anteriores e ingresar el c�digo que semuestra:
Close All
Clear
Accept "Ingrese una cadena?" To cCadena
? "Cadena invertida =" + CadInv(cCadena)
Function CadInv
Parameters cCadena
nN = Len(Alltrim(cCadena))
Declare cTemporal(nN)
For nI = 1 To nN
cTemporal(nI) = SubStr(cCadena, nI, 1)
Next
cInvertida = ""
For nJ = nN To 1 Step -1
cInvertida = cInvertida + cTemporal(nJ)
Next J
Return cInvertida
Aplicaci�n N� 5
Este ejercicio consiste en escribir un programa que imprima elcalendario correspondiente a un mes si se conoce una fecha delmismo. Por ejemplo si se ingresa la siguiente fecha MA 24 04 1973(Martes 24 de Abril de 1973) se debe obtener:
ABRIL | ||||||
| D | L | M | M | J | V | S |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
| 29 | 30 | |||||
Creo que a estas alturas Ud. ya entendi� como funciona esto.Por ello, esta aplicaci�n se deja como ejercicio para elestudiante.
Microsoft
GU�A DE LABORATORIO N� 2
Objetivos
Luego de completar este laboratorio, el estudiante ser� capazde:
Consideraciones
Para el desarrollo del presente laboratorio Ud. deber� crearuna carpeta C:\FundVFP\Lab2, para guardar sus trabajoscorrespondientes a este laboratorio.
Aplicaci�n N� 1
El ejercicio consiste en elaborar una aplicaci�n que permitaleer un n�mero real de la forma "eee.ddd" e imprima elmayor valor entre la parte entera y la parte decimal.

Para el desarrollo de esta aplicaci�n, en primer lugar debecrear un nuevo formulario. Para ello digite lo siguiente en laVentana de Comandos:
Create Form
A continuaci�n seleccione del Men� Ver, la opci�n Barra deherramientas Controles de Formularios. Se presentar� una ventanasimilar a la siguiente figura:

En seguida de la barra de herramientas mostrada ubicar lossiguientes controles al formulario:
2 etiquetas
2 cajas de texto
3 botones de comando
Para ubicar un control en el formulario, simplemente dar clicken el control deseado y luego dar click en el formulario en laposici�n que se le desea ubicar. Adicionalmente puede utilizarla barra de herramientas Dise�o para obtener una mejorpresentaci�n.
A continuaci�n proceda a establecer las propiedades de losobjetos seg�n se indica, para ello dar click derecho sobre elcontrol y del men� emergente que se presenta elegir la opci�nPropiedades.
Form1
| Name | FrmAplica01 | |
| Caption | Mayor valor de un n�mero real | |
| MaxButton | .F.-Falso | |
| MinButton | .F.-Falso |
Label1
| Name | LblX | |
| Caption | Ingrese un real de la forma eee.ddd? |
Label2
| Name | LblMay | |
| Caption | Mayor: |
Text1
| Name | TxtX | |
| InputMask | 999.999 | |
| Value | 0 |
Text2
| Name | TxtMay | |
| InputMask | 999 | |
| Value | 0 |
Command1
| Name | CmdAceptar | |
| Caption | \<Aceptar | |
| Default | .T.-Verdadero |
Command2
| Name | CmdLimpiar | |
| Caption | \<Limpiar |
Command3
| Name | CmdSalir | |
| Cancel | .T.-Verdadero | |
| Caption | \<Salir |
A continuaci�n dar doble click sobre el control CmdAceptar yproceda a ingresar el c�digo que se muestra:
| Objeto: CmdAceptar | Procedimiento: Click |
nX = Thisform.TxtX.Value
nA = Int(Thisform.TxtX.Value)
nX = nX - nA
nB = 1000 * nX
If nA > nB Then
nMay = nA
Else
nMay = nB
EndIf
Thisform.TxtMay.Value = nMay
Thisform.Refresh
De manera an�loga ingresar el siguiente c�digo para elcontrol CmdLimpiar:
| Objeto: CmdLimpiar | Procedimiento: Click |
Thisform.TxtX.Value = 0
Thisform.TxtMay.Value = 0
Thisform.TxtX.Setfocus
Thisform.Refresh
Finalmente proceder a ingresar el siguiente c�digo para elcontrol CmdSalir:
| Objeto: CmdSalir | Procedimiento: Click |
Release Thisform
A continuaci�n guarde su aplicaci�n como FrmAplica01, luegoproceda a ejecutarla. Para ello ingrese lo siguiente en laVentana de Comandos:
Do Form FrmAplica01
Debe funcionar sin problemas. Pruebe ingresando diferentesvalores. En caso que falle revise y corrija.
Aplicaci�n N� 2
En este ejercicio vamos a crear un formulario para calcular laedad de una persona a partir de su fecha de nacimiento.

Para el desarrollo de esta aplicaci�n, proceda a ubicar lossiguientes controles en el formulario:
2 etiquetas
2 cajas de texto
3 botones de comando
Luego, proceda a establecer las propiedades seg�n se indica acontinuaci�n:
Form1
| Name | FrmEdad | |
| Caption | ||
| MaxButton | .F.-Falso | |
| MinButton | .F.-Falso |
Label1
| Name | LblFecNac | |
| Caption | Fecha de nacimiento: |
Label2
| Name | LblEdad | |
| Caption | Su edad es: |
Text1
| Name | TxtFecNac | |
| Enabled | .T.-Verdadero |
Text2
| Name | TxtEdad | |
| Enabled | .F.-Falso |
Command1
| Name | CmdAceptar | |
| Caption | \<Aceptar |
Command2
| Name | CmdLimpiar | |
| Caption | \<Limpiar |
Command3
| Name | CmdSalir | |
| Caption | \<Salir |
Luego de establecidas las propiedades de los controles,proceda a ingresar el siguiente c�digo:
| Objeto: FrmEdad | Procedimiento: Load |
Set Date French
Set Century On
| Objeto: FrmEdad | Procedimiento: Init |
cNomDia = Cdow(Date())
cDia = Str(Day(Date()), 2)
cMes = Cmonth(Date())
cAnno = Str(Year(Date()), 4)
cFecha = cNomDia + " " + cDia + " de " +cMes + " del " + cAnno
Thisform.Caption = cFecha
Thisform.TxtFecNac.Setfocus
Thisform.Refresh
| Objeto: CmdAceptar | Procedimiento: Click |
dFecNac = Ctod(Thisform.TxtFecNac.Value)
nEdad = Int ((Date() - dFecNac) / 365)
Thisform.TxtEdad.Value = Str(nEdad) + " a�os"
Thisform.Refresh
| Objeto: CmdLimpiar | Procedimiento: Click |
Thisform.TxtFecNac.Value = ""
Thisform.TxtEdad.Value = ""
Thisform.TxtFecNac.Setfocus
Thisform.Refresh
| Objeto: CmdSalir | Procedimiento: Click |
Release Thisform
Aplicaci�n N� 3
Este ejercicio consiste en elaborar un formulario que simuleel funcionamiento de un reloj despertador digital. La aplicaci�ndebe permitir al usuario ingresar la hora a la que desea seravisado. El dise�o de la interfaz debe ser similar a la figurasiguiente:

Para el desarrollo de esta aplicaci�n proceder a ubicar lossiguientes controles en el formulario:
2 etiquetas
2 cajas de texto
1 cron�metro
2 botones de comandos
En seguida establezca las propiedades seg�n se indica acontinuaci�n:
Form1
| Name | FrmReloj | |
| Caption | Reloj despertador digital | |
| MaxButton | .F.-Falso | |
| MinButton | .F.-Falso |
Label1
| Name | LblHora | |
| Caption | Hora |
Label2
| Name | LblDespertador | |
| Caption | Despertador |
Text1
| Name | TxtHora | |
| FontBold | .T.-Verdadero | |
| FontSize | 24 |
Text2
| Name | TxtDespertador | |
| FontBold | .T.-Verdadero | |
| FontSize | 24 |
Timer1
| Name | Timer1 | |
| Enabled | .T.-Verdadero | |
| Interval | 500 |
Command1
| Name | CmdOnOff | |
| Caption | \<Desactivar | |
| Default | .T.-Verdadero |
Command2
| Name | CmdTerminar | |
| Cancel | .T.-Verdadero | |
| Caption | \<Terminar |
Una vez establecidas las propiedades, proceda a ingresar elc�digo que se muestra:
| Objeto: FrmReloj | Procedimiento: Load |
Public lOnOff
| Objeto: FrmReloj | Procedimiento: Init |
lOnOff = .F.
Thisform.TxtDespertador.Value = "00:00:00"
Thisform.Refresh
| Objeto: Timer1 | Procedimiento: Timer |
If Thisform.TxtHora.Value != Time() Then
Thisform.TxtHora.Value = Time()
EndIf
If (Thisform.TxtDespertador.Value < Time()) And lOnOff Then
* Sonido ac�stico
?Chr(7)
EndIf
Thisform.Refresh
| Objeto: CmdOnOff | Procedimiento: Click |
If lOnOff Then
lOnOff = .F.
Thisform.CmdOnOff.Caption = "\<Activar"
Else
lOnOff = .T.
Thisform.CmdOnOff.Caption = "\<Desactivar"
EndIf
Thisform.Refresh
| Objeto: CmdTerminar | Procedimiento: Click |
Release Thisform
Aplicaci�n N� 4
Se tiene un cajero autom�tico el cual permite manipularcierta cantidad de dinero para lo cual dispone de los siguientesbilletes: S/. 10.00, S/. 20.00, S/. 50.00, S/. 100.00 y S/.200.00. Elaborar una aplicaci�n que permita la lectura de lacantidad a retirar la cual debe ser m�ltiplo de 10 (casocontrario debe solicitar al usuario que ingrese un valorcorrecto, no debe aceptar la lectura de valores que no cumplanesta condici�n). La aplicaci�n debe indicar el menor n�mero debilletes a utilizar. El dise�o de la interfaz debe ser similar ala siguiente figura:

Microsoft
GU�A DE LABORATORIO N� 3
Objetivos
Luego de completar este laboratorio, el estudiante ser� capazde:
Consideraciones
Para el desarrollo del presente laboratorio Ud. deber� crearuna carpeta C:\FundVFP\Lab3, para guardar sus trabajoscorrespondientes a este laboratorio.
Aplicaci�n N� 1
El ejercicio consiste en crear una aplicaci�n que permitaleer una fracci�n y de como resultado la fracci�n simplificada.Esto es, que halle la fracci�n irreductible equivalente.

Para el desarrollo de esta aplicaci�n proceda a crear unnuevo formulario y luego vaya al Men� Formulario y elija laopci�n Crear conjunto de formularios (no se preocupe, pues no seapreciar� nada en especial). Nuevamente vaya al Men� Formularioy elija la opci�n Agregar nuevo formulario. El Dise�ador deformularios debe presentar una apariencia similar a la figuramostrada:
A continuaci�n proceda a ubicar los siguientes controlessobre el primer formulario (Form1):
2 etiquetas
2 cajas de texto
2 botones de comando
Seguidamente debe establecer las propiedades de los objetosseg�n se indica:
Form1
| Name | FrmIngreso | |
| Caption | Ingreso de datos | |
| MaxButton | .F.-Falso | |
| MinButton | .F.-Falso |
Label1
| Name | LblNumerador | |
| Caption | Numerador? |
Label2
| Name | LblDenominador | |
| Caption | Denominador? |
Text1
| Name | TxtNumerador | |
| Value | 0 |
Text2
| Name | TxtDenominador | |
| Value | 0 |
Command1
| Name | CmdSimplificar | |
| Caption | Simplificar | |
| Default | .T.-Verdadero |
Command2
| Name | CmdSalir | |
| Cancel | .T.-Verdadero | |
| Caption | Salir |
A continuaci�n proceda a ingresar el c�digo que se muestra:
| Objeto: CmdSimplificar | Procedimiento: Click |
nNumerador = Thisformset.FrmIngreso.TxtNumerador.Value
nDenominador = Thisformset.FrmIngreso.TxtDenominador.Value
If nNumerador < nDenominador Then
nC = nNumerador
Else
nC = nDenominador
EndIf
Do While (nNumerador % nC != 0) Or (nDenominador % nC != 0)
nC = nC - 1
EndDo
nNumerador = nNumerador / nC
nDenominador = nDenominador / nC
Thisformset.FrmIngreso.Hide
Thisformset.FrmSalida.Show
Thisformset.Refresh
| Objeto: CmdSalir | Procedimiento: Click |
Release Thisformset
Luego proceda a ubicar los siguientes controles sobre el segundo formulario (Form2):
1 etiqueta
1 caja de texto
1 bot�n de comando
Seguidamente debe establecer las propiedades de los objetos seg�n se indica:
Form2
| Name | FrmSalida | |
| Caption | Salida | |
| MaxButton | .F.-Falso | |
| MinButton | .F.-Falso |
Label1
| Name | LblFraccion | |
| Caption | Fracci�n simplificada: |
Text1
| Name | TxtFraccion | |
| Alignment | 2-Centro |
Command1
| Name | CmdVolver | |
| Caption | Volver |
A continuaci�n proceda a ingresar el c�digo que se muestra:
| Objeto: FrmSalida | Procedimiento: Activate |
cNumerador = Str(nNumerador)
cDenominador = Str(nDenominador)
cFraccion = cNumerador + " / " + cDenominador
Thisformset.FrmSalida.TxtFraccion.Value = cFraccion
Thisformset.Refresh
| Objeto: CmdVolver | Procedimiento: Click |
Thisformset.FrmSalida.Hide
Thisformset.FrmIngreso.Show
Thisformset.Refresh
Finalmente proceda a ingresar el c�digo que se indica a continuaci�n:
| Objeto: Formset1 | Procedimiento: Load |
Public nNumerador
Public nDenominador
Public nC
| Objeto: Formset1 | Procedimiento: Init |
Thisformset.FrmSalida.Hide
Thisformset.Refresh
Aplicaci�n N� 2
Este ejercicio consiste en elaborar una aplicaci�n que acepte fechas como tres n�meros (dd, mm, aaaa) y las visualice del modo usual. A manera de ejemplo considere lo siguiente:

Cuando el usuario haga click en el bot�n Salir o en el bot�n Cerrar de la barra de t�tulo del formulario, se debe confirmar si desea terminar la aplicaci�n, tal como se observa en la figura siguiente:

En caso de que el usuario elija la opci�n Si, la aplicaci�n debe terminar. Caso contrario, es decir si el usuario elige la opci�n No, se debe proseguir con la aplicaci�n.
Para el desarrollo de esta aplicaci�n, proceda a ubicar los siguientes controles en el formulario:
4 etiquetas
3 controles num�ricos
1 caja de texto
3 botones de comando
En seguida proceda a establecer las propiedades seg�n se indica:
Form1
| Name | FrmFecha | |
| Caption | Fecha en letras | |
| MaxButton | .F.-Falso | |
| MinButton | .F.-Falso |
Label1
| Name | LblDia | |
| AutoSize | .T.-Verdadero | |
| Caption | D�a: |
Label2
| Name | LblMes | |
| AutoSize | .T.-Verdadero | |
| Caption | Mes: |
Label3
| Name | LblAnno | |
| AutoSize | .T.-Verdadero | |
| Caption | A�o: |
Label4
| Name | LblEnLetras | |
| AutoSize | .T.-Verdadero | |
| Caption | En letras: |
Spinner1
| Name | SpnDia | |
| SpinnerHighValue | 31 | |
| SpinnerLowValue | 1 |
Spinner2
| Name | SpnMes | |
| SpinnerHighValue | 12 | |
| SpinnerLowValue | 1 |
Spinner3
| Name | SpnAnno | |
| SpinnerHighValue | 9999 | |
| SpinnerLowValue | 0 |
Text1
| Name | TxtEnLetras | |
| Alignment | 2-Centro |
Command1
| Name | CmdAceptar | |
| Caption | \<Aceptar | |
| Default | .T.-Verdadero |
Command2
| Name | CmdLimpiar | |
| Caption | \<Limpiar |
Command3
| Name | CmdSalir | |
| Cancel | .T.-Verdadero | |
| Caption | \<Salir |
Una vez establecidas las propiedades proceda a ingresar el c�digo que se indica a continuaci�n:
| Objeto: FrmFecha | Procedimiento: Load |
Set Date French
Set Century On
| Objeto: FrmFecha | Procedimiento: QueryUnload |
#DEFINE vfpYesNo 4
#DEFINE vfpYes 6
#DEFINE vfpQuestion 32
If MessageBox("�Desea terminar la aplicaci�n?", ;
vfpQuestion + vfpYesNo, "Pregunta") = vfpYes Then
Release Thisform
Else
NoDefault
EndIf
| Objeto: CmdAceptar | Procedimiento: Click |
cBarra = "/"
cFecha = Thisform.SpnDia.Text + cBarra + Thisform.SpnMes.Text ;
+ cBarra + Thisform.SpnAnno.Text
dFecha = Ctod(cFecha)
cNomDia = Cdow(dFecha)
cDia = Str(Day(dFecha), 2)
cMes = Cmonth(dFecha)
cAnno = Str(Year(dFecha), 4)
cFecha = cNomDia + " " + cDia + " de " + cMes + " de " + cAnno
Thisform.TxtEnLetras.Value = cFecha
Thisform.Refresh
| Objeto: CmdLimpiar | Procedimiento: Click |
Thisform.SpnDia.Value = 0
Thisform.SpnMes.Value = 0
Thisform.SpnAnno.Value = 0
Thisform.TxtEnLetras.Value = ""
Thisform.SpnDia.Setfocus
Thisform.Refresh
| Objeto: CmdSalir | Procedimiento: Click |
Thisform.QueryUnload
Aplicaci�n N� 3
Este ejercicio consiste en elaborar un formulario que permita leer un n�mero entero y visualice su tabla se multiplicar. Para construir la tabla de multiplicar vamos a utilizar un control cuadro de edici�n, el cual tiene propiedades similares a un cuadro de texto, pero permite escribir texto en l�neas diferentes.

Para el desarrollo de esta aplicaci�n, proceda a ubicar los siguientes controles en el formulario:
1 etiqueta
1 caja de texto
1 cuadro de edici�n
1 bot�n de comandos
En seguida proceda a establecer las propiedades seg�n se indica:
Form1
| Name | FrmTabla | |
| Caption | Tabla de multiplicar | |
| MaxButton | .F.-Falso | |
| MinButton | .F.-Falso |
Label1
| Name | LblNumero | |
| Caption | Ingrese un n�mero: |
Text1
| Name | TxtNumero | |
| Alignment | 2-Centro |
Edit1
| Name | EdtTabla | |
| ScrollBars | 2-Vertical |
Command1
| Name | CmdLimpiar | |
| Caption | \<Limpiar | |
| Default | .T.-Verdadero |
Una vez dise�ada la interfaz, proceda a ingresar el c�digo que se indica a continuaci�n:
| Objeto: TxtNumero | Procedimiento: InteractiveChange |
nN = Val(Thisform.TxtNumero.Value)
cS = ""
For nI = 0 To 12
nP = nN * nI
cS = cS + Str(nN) + " * " + Str(nI) + " = " + Str(nP) ;
+ Chr(13)
Next
Thisform.EdtTabla.Value = cS
Thisform.Refresh
| Objeto: CmdLimpiar | Procedimiento: Click |
Thisform.TxtNumero.Value = ""
Thisform.EdtTabla.Value = ""
Thisform.Refresh
Aplicaci�n N� 4
Elaborar una aplicaci�n que acepte como entrada la reserva de agua de un dep�sito y los litros que se consumen a la semana. La aplicaci�n debe dar como resultado las cantidades de agua que quedan al final de cada semana. El proceso finalizar� cuando no quede agua suficiente para una semana. Utilizar otro formulario para mostrar la salida. El dise�o de la interfaz debe ser similar a la figura mostrada:

Microsoft Visual FoxPro
GU�A DE LABORATORIO N� 4
Objetivos
Luego de completar este laboratorio, el estudiante ser� capaz de:
Consideraciones
Para el desarrollo del presente laboratorio Ud. deber� crear una carpeta C:\FundVFP\Lab4, para guardar sus trabajos correspondientes a este laboratorio.
Aplicaci�n N� 1
Este ejercicio consiste en elaborar una aplicaci�n que permita cambiar el aspecto de una caja de texto. El usuario debe elegir el tipo de fuente a utilizar, el estilo, el color y el tama�o. El dise�o de la interfaz debe ser similar a:

Para el desarrollo de esta aplicaci�n, proceda a ubicar los siguientes controles en el formulario:
5 etiquetas
1 caja de texto
1 cuadro combinado
1 lista
3 casillas de verificaci�n
1 grupo de botones de opci�n
1 bot�n de comando
En seguida proceda a establecer las propiedades seg�n se indica:
Form1
| Name | FrmEditor | |
| AutoCenter | .T.-Verdadero | |
| Caption | Editor | |
| MaxButton | .F.-Falso | |
| MinButton | .F.-Falso |
Label1
| Name | LblTexto | |
| Caption | Texto |
Label2
| Name | LblFuente | |
| Caption | Fuente |
Label3
| Name | LblTama�o | |
| Caption | Tama�o |
Label4
| Name | LblEstilo | |
| Caption | Estilo |
Label5
| Name | LblColor | |
| Caption | Color |
Combo1
| Name | CboFuente |
List1
| Name | LstTama�o |
Text1
| Name | TxtTexto | |
| ForeColor | 255, 0, 0 |
Check1
| Name | ChkNegrita | |
| Caption | Negrita | |
| FontBold | .T.-Verdadero |
Check2
| Name | ChkCursiva | |
| Caption | Cursiva | |
| FontItalic | .T.-Verdadero |
Check3
| Name | ChkSubrayado | |
| Caption | Subrayado | |
| FontUnderline | .T.-Verdadero |
OptionGroup1
| ButtonCount | 3 |
Option1
| Name | OptRojo | |
| ForeColor | 255, 0, 0 |
Option2
| Name | OptVerde | |
| ForeColor | 0, 255, 0 |
Option3
| Name | OptAzul | |
| ForeColor | 0, 0, 255 |
Command1
| Name | CmdSalir | |
| Caption | \<Salir | |
| Default | .T.-Verdadero |
Una vez establecidas las propiedades de la interfaz, proceda a ingresar el c�digo que se muestra a continuaci�n:
| Objeto: FrmEditor | Procedimiento: Init |
Thisform.CboFuente.AddItem("Arial")
Thisform.CboFuente.AddItem("Arial Black")
Thisform.CboFuente.AddItem("Courier New")
Thisform.CboFuente.AddItem("Garamond")
Thisform.CboFuente.AddItem("Impact")
Thisform.CboFuente.AddItem("MS Sans Serif")
Thisform.CboFuente.AddItem("Technical")
Thisform.CboFuente.AddItem("Times New Roman")
For nI = 8 To 20 Step 2
Thisform.LstTama�o.AddItem(Alltrim(Str(nI)))
Next
| Objeto: FrmEditor | Procedimiento: QueryUnload |
#DEFINE vfpYesNo 4
#DEFINE vfpYes 6
#DEFINE vfpQuestion 32
If MessageBox("�Desea terminar la aplicaci�n?", ;
vfpQuestion + vfpYesNo, "Pregunta") = vfpYes Then
Release Thisform
Else
NoDefault
EndIf
| Objeto: CboFuente | Procedimiento: Click |
Thisform.TxtTexto.FontName = Thisform.CboFuente.Value
Thisform.Refresh
| Objeto: LstTama�o | Procedimiento: Click |
nTama�o = Val(Thisform.LstTama�o.Value)
Thisform.TxtTexto.FontSize = nTama�o
Thisform.Refresh
| Objeto: ChkNegrita | Procedimiento: Click |
If Thisform.ChkNegrita.Value = 1 Then
Thisform.TxtTexto.FontBold = .T.
Else
Thisform.TxtTexto.FontBold = .F.
EndIf
Thisform.Refresh
| Objeto: ChkCursiva | Procedimiento: Click |
If Thisform.ChkCursiva.Value = 1 Then
Thisform.TxtTexto.FontItalic = .T.
Else
Thisform.TxtTexto.FontItalic = .F.
EndIf
Thisform.Refresh
| Objeto: ChkSubrayado | Procedimiento: Click |
If Thisform.ChkSubrayado.Value = 1 Then
Thisform.TxtTexto.FontUnderline = .T.
Else
Thisform.TxtTexto.FontUnderline = .F.
EndIf
Thisform.Refresh
| Objeto: OptRojo | Procedimiento: Click |
Thisform.TxtTexto.ForeColor = RGB(255, 0, 0)
Thisform.Refresh
| Objeto: OptVerde | Procedimiento: Click |
Thisform.TxtTexto.ForeColor = RGB(0, 255, 0)
Thisform.Refresh
| Objeto: OptAzul | Procedimiento: Click |
Thisform.TxtTexto.ForeColor = RGB(0, 0, 255)
Thisform.Refresh
| Objeto: CmdSalir | Procedimiento: Click |
Thisform.QueryUnload
Aplicaci�n N� 2
Este ejercicio consiste en desarrollar una aplicaci�n que permita ingresar el nombre de un curso, el cual pasa a formar parte de una lista de espera antes de ser programado para su dictado. Los cursos deben ser seleccionados de la lista de espera y trasladados a la lista de cursos programados y viceversa. El dise�o de la interfaz debe ser similar a la figura mostrada:

Para el desarrollo de esta aplicaci�n proceda a ubicar los siguientes controles en el formulario:
3 etiquetas
1 cuadro de texto
2 listas
5 botones de comando
En seguida proceda a establecer las propiedades seg�n se indica:
Form1
| Name | FrmCursos | |
| Caption | Cursos | |
| MaxButton | .F.-Falso | |
| MinButton | .F.-Falso |
Label1
| Name | LblCurso | |
| Caption | Ingrese nuevo curso: |
Label2
| Name | LblSeleccionar | |
| Caption | Seleccione un curso: |
Label3
| Name | LblProgramado | |
| Caption | Curso programado: |
Text1
| Name | TxtCurso |
List1
| Name | LstSeleccionar |
List2
| Name | LstProgramado |
Command1
| Name | CmdAgregar | |
| Caption | ||
| Picture | C:\FundVFP\Bitmaps\AddItem.Bmp |
Command2
| Name | CmdAgregarTodo | |
| Caption | ||
| Picture | C:\FundVFP\Bitmaps\AddAll.Bmp |
Command3
| Name | CmdQuitar | |
| Caption | ||
| Picture | C:\FundVFP\Bitmaps\Remove.Bmp |
Command4
| Name | CmdQuitarTodo | |
| Caption | ||
| Picture | C:\FundVFP\Bitmaps\RemoveAll.Bmp |
Command5
| Name | CmdAnnadir | |
| Caption | \<A�adir |
En seguida proceda a ingresar el c�digo que se indica:
| Objeto: CmdAnnadir | Procedimiento: Click |
Thisform.LstSeleccionar.Additem(Thisform.TxtCurso.Value)
Thisform.TxtCurso.Value = ""
Thisform.TxtCurso.SetFocus
| Objeto: LstSeleccionar | Procedimiento: Click |
If Thisform.LstSeleccionar.ListIndex != 0 Then
Thisform.CmdAgregar.Enabled = .T.
Thisform.CmdAgregarTodo.Enabled = .T.
EndIf
Thisform.Refresh
| Objeto: LstProgramado | Procedimiento: Click |
If Thisform.LstProgramado.ListIndex != 0 Then
Thisform.CmdQuitar.Enabled = .T.
Thisform.CmdQuitarTodo.Enabled = .T.
EndIf
Thisform.Refresh
| Objeto: CmdAgregar | Procedimiento: Click |
cCurso = Thisform.LstSeleccionar.Value
nCurso = Thisform.LstSeleccionar.ListIndex
If Thisform.LstSeleccionar.ListCount > 0 Then
Thisform.LstProgramado.AddItem(cCurso)
Thisform.LstSeleccionar.RemoveItem(nCurso)
Thisform.LstSeleccionar.ListIndex = 0
Thisform.CmdAgregar.Enabled = .F.
Thisform.CmdAgregarTodo.Enabled = .F.
EndIf
Thisform.Refresh
| Objeto: CmdQuitar | Procedimiento: Click |
cCurso = Thisform.LstProgramado.Value
nCurso = Thisform.LstProgramado.ListIndex
If Thisform.LstProgramado.ListCount > 0 Then
Thisform.LstSeleccionar.AddItem(cCurso)
Thisform.LstProgramado.RemoveItem(nCurso)
Thisform.LstProgramado.ListIndex = 0
Thisform.CmdQuitar.Enabled = .F.
Thisform.CmdQuitarTodo.Enabled = .F.
EndIf
Thisform.Refresh
| Objeto: CmdAgregarTodo | Procedimiento: Click |
For nI = 1 To Thisform.LstSeleccionar.ListCount
Thisform.LstProgramado.AddItem;
(Thisform.LstSeleccionar.List(nI))
Next
Thisform.LstSeleccionar.Clear
Thisform.CmdAgregar.Enabled = .F.
Thisform.CmdAgregarTodo.Enabled = .F.
Thisform.Refresh
| Objeto: CmdQuitarTodo | Procedimiento: Click |
For nI = 1 To Thisform.LstProgramado.ListCount
Thisform.LstSeleccionar.AddItem;
(Thisform.LstProgramado.List(nI))
Next
Thisform.LstProgramado.Clear
Thisform.CmdQuitar.Enabled = .F.
Thisform.CmdQuitarTodo.Enabled = .F.
Thisform.Refresh
| Objeto: FrmCursos | Procedimiento: QueryUnload |
#DEFINE vfpYesNo 4
#DEFINE vfpYes 6
#DEFINE vfpQuestion 32
If MessageBox("�Desea terminar la aplicaci�n?", ;
vfpQuestion + vfpYesNo, "Pregunta") = vfpYes Then
Release Thisform
Else
NoDefault
EndIf
Aplicaci�n N� 3
El ejercicio consiste en elaborar una aplicaci�n que permita leer
n�meros de tipo entero, y a continuaci�n los visualice ordenados en forma ascendente o descendente. Utilice el m�todo de la burbuja para realizar la ordenaci�n.

Para el desarrollo de esta aplicaci�n, proceda a ubicar los siguientes controles en el formulario:
3 etiquetas
1 caja de texto
1 lista
1 grupo de botones de opci�n
3 botones de comando
En seguida proceda a establecer las propiedades seg�n se indica:
Form1
| Nombre | FrmBurbuja | |
| Caption | Ordenaci�n por burbuja | |
| MaxButton | .F.-Falso | |
| MinButton | .F.-Falso |
Label1
| Name | LblNumero | |
| Caption | Ingrese un nuevo n�mero: |
Label2
| Name | LblOrden | |
| Caption | Orden: |
Label3
| Name | LblLista | |
| Caption | Lista de n�meros: |
Text1
| Name | TxtNumero | |
| Value | 0 |
List1
| Name | LstNumero |
Option1
| Nombre | OptAscendente | |
| Caption | Ascendente |
Option2
| Nombre | OptDescendente | |
| Caption | Descendente |
Command1
| Nombre | CmdAnnadir | |
| Caption | \<A�adir | |
| Default | True |
Command2
| Nombre | CmdOrdenar | |
| Caption | \<Ordenar |
Command3
| Nombre | CmdSalir | |
| Cancel | .T.-Verdadero | |
| Caption | \<Salir | |
| Picture | C:\Archivos de programa\Microsoft Visual Studio\Common\Graphics\Icons\Arrows\ Point04.ico |
Una vez establecidas las propiedades proceda a ingresar el c�digo que se indica a continuaci�n:
| Objeto: FrmBurbuja | Procedimiento: QueryUnload |
#DEFINE vfpYesNo 4
#DEFINE vfpYes 6
#DEFINE vfpQuestion 32
If MessageBox("�Desea terminar la aplicaci�n?", ;
vfpQuestion + vfpYesNo, "Pregunta") = vfpYes Then
Release Thisform
Else
NoDefault
EndIf
| Objeto: CmdAnnadir | Procedimiento: Click |
Thisform.LstNumero.AddItem(Thisform.TxtNumero.Value)
Thisform.TxtNumero.Value = ""
Thisform.TxtNumero.SetFocus
| Objeto: CmdOrdenar | Procedimiento: Click |
nN = Thisform.LstNumero.ListCount
Dimension nA(nN) As Integer
For nI = 1 To nN
nA(nI) = Thisform.LstNumero.List(nI)
Next
If Thisform.OptionGroup1.OptAscendente.Value = 1 Then
For nI = 1 To nN - 1
For nJ = nI + 1 To nN
If nA(nI) > nA(nJ) Then
nT = nA(nI)
nA(nI) = nA(nJ)
nA(nJ) = nT
EndIf
Next
Next
EndIf
If Thisform.OptionGroup1.OptDescendente.Value = 1 Then
For nI = 1 To nN - 1
For nJ = nI + 1 To nN
If nA(nI) < nA(nJ) Then
nT = nA(nI)
nA(nI) = nA(nJ)
nA(nJ) = nT
EndIf
Next
Next
EndIf
Thisform.LstNumero.Clear
For nI = 1 To nN
Thisform.LstNumero.List(nI) = nA(nI)
Next
| Objeto: CmdSalir | Procedimiento: Click |
Thisform.QueryUnload
Aplicaci�n N� 4
Desarrollar una aplicaci�n que permita realizar consultas acerca de un determinado curso, los cuales se mostraran en una lista. El usuario debe seleccionar un curso y en seguida se debe presentar el nombre del profesor encargado del curso (teor�a), el nombre del jefe de pr�ctica (laboratorio), as� como los horarios de teor�a y de laboratorio, respectivamente. El dise�o de la interfaz debe ser similar a la figura que se muestra:

Microsoft Visual FoxPro
GU�A DE LABORATORIO N� 5
Objetivos
Luego de completar este laboratorio, el estudiante ser� capaz de:
Consideraciones
Para el desarrollo del presente laboratorio Ud. deber� crear una carpeta C:\FundVFP\Lab5, para guardar sus trabajos correspondientes a este laboratorio.
Aplicaci�n N� 1
Este primer ejercicio consiste en escribir un m�todo que reciba como argumento una cadena de caracteres y la devuelva en forma inversa. Por ejemplo si se ingresa la cadena CORAZON deber� retornar NOZAROC.

Para el desarrollo de esta aplicaci�n, proceda a ubicar los siguientes controles en el formulario:
2 etiquetas
2 cajas de texto
3 botones de comando
En seguida proceda a establecer las propiedades seg�n se indica:
Form1
| Nombre | FrmPrueba_Cadena | |
| Caption | Cadena invertida | |
| MaxButton | .F.-Falso | |
| MinButton | .F.-Falso |
Label1
| Nombre | LblCadena | |
| Caption | Ingrese una cadena: |
Label2
| Nombre | LblInvertida | |
| Caption | Cadena invertida: |
Text1
| Nombre | TxtCadena | |
| Enabled | .T.-Verdadero |
Text2
| Nombre | TxtInvertida | |
| Enabled | .F.-Falso |
Command1
| Nombre | CmdAceptar | |
| Caption | \<Aceptar | |
| Default | .T.-Verdadero |
Command2
| Nombre | CmdLimpiar | |
| Caption | \<Limpiar |
Command3
| Nombre | CmdSalir | |
| Cancel | .T.-Verdadero | |
| Caption | \<Salir |
Una vez establecidas las propiedades de la interfaz, proceda a crear un nuevo m�todo, denominado CadInvertida. Para ello vaya al Men� Formulario y elija la opci�n Crear nuevo m�todo. Se debe presentar una ventana similar a la figura siguiente:

Ingrese los datos que se muestran y a continuaci�n dar click en el bot�n Agregar. Luego, dar doble click sobre el formulario y transcriba el siguiente c�digo:
| Objeto: FrmPrueba_Cadena | Procedimiento: CadInvertida |
Parameters cCadena
nN = Len(Alltrim(cCadena))
Dimension cTemporal(nN)
For nI = 1 To nN
cTemporal(nI) = SubStr(cCadena, nI, 1)
Next
cCadena = ""
For nJ = nN To 1 Step -1
cInvertida = cInvertida + cTemporal(nJ)
Next
Return cInvertida
| Objeto: CmdAceptar | Procedimiento: Click |
cCadena = Thisform.TxtCadena.Value
Thisform.TxtInvertida.Value = Thisform.CadInvertida(cCadena)
Thisform.Refresh
Aplicaci�n N� 2
Este ejercicio consiste en crear un m�todo que reciba como argumento los apellidos y nombres de un cliente (en ese orden) y retorne los nombres y apellidos del mismo.

Para el desarrollo de esta aplicaci�n proceda a crear un nuevo m�todo denominado NomApe. Luego transcriba el siguiente c�digo:
| Objeto: FrmPrueba_NomApe | Procedimiento: NomApe |
Parameters cApeNom
nN = Len(Alltrim(cApeNom))
Dimension cNom(nN)
Dimension cApe(nN)
For nI = 1 To nN
If SubStr(cApeNom, nI, 1) = "," Then
Exit
EndIf
Next
cApe = SubStr(cApeNom, 1, nI-1)
cNom = SubStr(cApeNom, nI + 1, nN - nI)
cNomApe = cNom + " " + cApe
Return cNomApe
Aplicaci�n N� 3
Para calcular el porcentaje de humedad de una muestra s�lida primero se pesa la muestra (
), luego se le lleva a la estufa de 120 a 150 �C por un tiempo de 2 horas aproximadamente. A continuaci�n se deja enfriar la muestra y se pesa nuevamente (
). Finalmente se realiza el siguiente c�lculo:

Nuestro trabajo consiste en crear un m�todo que permita realizar el c�lculo anterior.

Para el desarrollo de esta aplicaci�n proceder a cera un nuevo m�todo denominado Humedad. Luego ingrese el siguiente c�digo:
| Objeto: FrmPrueba_Humedad | Procedimiento: Humedad |
Parameters nM1, nM2
nH = 100 * (nM1 - nM2) / nM1
Return nH
| Objeto: CmdAceptar | Procedimiento: Click |
nMasa1 = Val(Thisform.TxtMasa1.Value)
nMasa2 = Val(Thisform.TxtMasa2.Value)
nHumedad = Thisform.Humedad(nMasa1, nMasa2)
Thisform.TxtHumedad.Value = Str(nHumedad, 10, 4)
Thisform.Refresh
Aplicaci�n N� 4
Escriba un m�todo que reciba como par�metro la fecha de nacimiento del usuario. Debe retornar el signo zodiacal, el d�a de nacimiento y la cantidad de d�as vividos hasta la fecha actual. Utilice un formulario de prueba para verificar la funcionalidad del m�todo creado.

Sugerencia
Retorne un �nico valor como una cadena de caracteres, en la cual est�n incluidos los valores que se piden. A manera de ejemplo considere lo siguiente:
cRpta = cZodiaco + cDiaNacimiento + cDiasVividos + cFechaHoy
Return cRpta
Fin del Nivel I
Pr�ximamente
Nivel II : Programaci�n de aplicaciones de escritorio
Nivel III : Programaci�n de aplicaciones Cliente-Servidor
Copyright DENVIR STUDIOS �
Lima - Per�, 2002