Cuarta sesión En esta sesión aprenderá como el programa puede responder a los eventos de teclado, a detectar si una tecla fue oprimida o liberada y a manejar los datos de entrada que vienen del teclado. •
• •
El evento KeyDown sucede cuando oprime cualquier tecla. Por ejemplo, si se oprime una tecla mientras un botón de comando llamado cmdpushme tiene el enfoque, se ejecuta automáticamente el procedimiento cmdpushme_KeyDown El evento KeyUp sucede cuando sueltan la tecla que se oprimió. Por ejemplo, si se suelta la tecla oprimida en el párrafo anterior, se ejecuta automáticamente el procedimiento cmdpushme_KeyUp El evento KeyPress sucede cuando oprime una tecla que tiene un carácter ANSI correspondiente. Por ejemplo, si oprime la tecla A, mientras un botón de comando tiene el enfoque, se ejecuta el procedimiento cmdpushme_KeyPress. Si oprime F1, el evento KeyPress no sucede, debido a que esta tecla no tiene un carácter ANSI correspondiente.
Programa Keys Este programa ilustra como se utilizan los tres eventos de teclado en un programa.
Tabla de propiedades del formulario frmkeys Objeto Propiedad Form Name Caption Command button Name Caption Command button Name Caption Label Name Alignment BorderStyle Caption •
Valor frmkeys Programa Keys cmdsalir &Salir cmdpushme &Oprime lblinfo 2-Center 1-Fixed Single Borra el texto
Teclee el siguiente código
‘todas las variables deben declararse option explicit Private sub cmdsalir_click() End End sub Private sub cmdpushme_KeyDown(KeyCode as integer, Shift as integer) Lblinfo.caption=”La tecla que oprimiste fue:”_ & str(Keycode) & “Shift:” & str(shift) End sub •
Graba y ejecuta tu programa.
Tabla de los valores posibles del segundo procedimiento cmdpushme_KeyDown. Seg. parámet. Estado de Alt Estado de Ctrl 0 No oprimido No oprimido 1 No oprimido No oprimido 2 No oprimido Oprimido 3 No oprimido Oprimido 4 Oprimido No oprimido 5 Oprimido No oprimido 6 Oprimido Oprimido 7 Oprimido Oprimido
parámetro
del
Est. de Mayús No oprimido Oprimido No oprimido Oprimido No oprimido Oprimido No oprimido Oprimido
Detección de una tecla liberada Private sub cmdpushme_KeyUp(KeyCode as integer, Shift as integer) Lblinfo.caption=”La tecla que oprimiste fue:”_ & str(Keycode) & “Shift:” & str(shift) End sub Detección de una tecla ANSI Private sub cmdpushme_KeyPress(KeyAscii as integer) Dim char Char=Chr(KeyAscii) Lblinfo.caption=”KeyAscii:” & str(KeyAscii) & “Char:” & char End sub •
Graba y ejecuta tu programa.
Controles para el sistema de archivos Se enfoca en el uso de controles para el sistema de archivos, para escribir un programa que le permite seleccionar un archivo de una unidad. Hay tres controles de este tipo: DriveListBox, DirListBox y FileListBox. En un programa tipico que permite seleccionar archivos de unidades, esos tres controles se usan en combinación. Cuando necesita seleccionar un archivo, se despliega en pantalla un cuadro de diálogo que incluye los tres controles, Luego puede elegir el archivo deseado seleccionando una unidad en el DriverListBox, un directorio en el DirListBox y un archivo en el FileListBox.
DriverListBox
DirListBox FileListBox
FielListBox
DirlistBox
DriverListBox
Objeto Form Label Text Box File List Box Label Combo Box Label Label Directory List Box Command Button Label Drive List Box Command Button
Propiedad Name Caption Name Caption Name Text Name Name Caption Name Style Name Caption Name Caption BorderStyle Name Name Caption Default Name Caption Name Name Caption Cancel
Valor frmsize Programa Size lblnombrearch Nombre del archivo txtfilename Borra el texto filfiles lblfiletype Tipo de Archivo cbofiletype 2-Dropdown List lbldirectories Directorio lbldirname Vacio 1-Fixed Single dirdirectory cmdok &Ok True lbldrive Unidad: drvdrive cmdcancel &Cancelar True
•
Teclee el siguiente código
‘todas la variables deben declararse. Opcion explicit Private sub form_load ‘llena el combo cbofiletype cbofiletype.additem “Todos los Archivos (*.*)” cbofiletype.additem “Archivos Texto (*.TXT)” cbofiletype.additem “Archivos Doc (*.DOC)” ‘inicializa el combo en el elemento #0 cbofiletype.listindex=0 ‘actualiza la etiqueta lbldirname con la ruta lbldirname.caption=dirdirectory.path End sub Private sub drvdrive_change() ‘la siguiente instrucción puede causar un error ‘por lo que ponemos una captura de errores. On error resume next ‘cambia la ruta del control dirlistbox ‘hacia la nueva unidad dirdirectory.path=drvdrive.drive if err.number<>0 then driveerror: ‘sucedió un error hay que informar al usuario y restaurar la unidad msgbox “Error de unidad”, vbexclamation, “Error” err.number=0 drvdrive.drive=dirdirectory.path end if End sub Private sub dirdirectory_change() ‘un directorio a acaba de ser seleccionado por el usuario ‘por lo que actualiza la ruta del control filelistbox adecuadamente filfiles.path=dirdirectory.path ‘tambian actualiza la etiqueta lbldirname lbldirname.caption=dirdirectory.path End sub Private sub filfiles_click()
‘actualiza el cuadro de texto txtfilename con el ‘nombre de archivo que se acaba de seleccionar txtfilename.text=filfiles.filename End sub Private sub cmdok_click() Dim pathandname as string Dim filesize as string Dim path as string ‘si no hay archivo selecionado, le indica al usuario ‘y sale del procedimiento if txtfilename.text=”” then msgbox “Primero selecciona una archivo” exit sub end fi ‘se asegura de que la ruta termine con (\) if rigth(filfiles.path, 1)<> “\” then path=filfiles.path & “\” else path=filfiles.path end if ‘obtiene la ruta y el nombre del archivo seleccionado if txtfilename.text=filfiles.filename then pathandname= path & filfiles.filename else pathandname=txtfilename.text end if ‘la siguiente instrucción puede causar un error ‘por lo que se establece una captura de error on error resuma next ‘obtiene el tamaño del archivo if err.number=0 then ‘despliega el tamaño del archivo msgbox “El tamaño de: ” & pathandname & “ es:” & filesize “ bytes” else
filelenerror: ‘sucedió un error, por lo tnato, despliega un mensaje de error
msgbox “No se puede calcular el tamaño:” & pathandname err.number=0 end fi End sub Private sub filfiles_dblclick() ‘asigna al cuadro de texto txtfilename el ‘nombre el archivo en el que se acaba de hacer doble clic txtfilename.text=filfiles.filename ‘ejecuta el procedimiento cmdok_click cmdok.value=true End sub Private sub cmdcancel_click() end End sub Como tener acceso a archivos Muchos programas necesitan leer y escribir datos en archivos en disco. En esta parte apredera a crear, leer y escribirlos en archivos. •
Hay tres formas para accesar archivos en VB. Acceso aleatorio, Acceso secuencial, Acceso binario
Programa Teléfonos Esta programa ilustra la manera de crear y manejar archivos de acceso aleatorio. El programa permite mantener un archivo de datos llamado PHONE.DAT que guarda registros de personas y sus números telefónicos.
Objeto Form
Propiedad Name
Valor frmtelefono
Text Box Text Box Text Box
Command Button Command Button Command Button Command Button Label Label Label
•
Caption MaxButton Name text MaxLength Name Text MaxLength Name text MaxLength MultiLine ScrollBars Name Caption Name Caption Name Caption Name Caption Name Caption Name Caption Name Caption
Programa Teléfonos False txtnombre Vacío 40 txttelef Vacío 40 txtcoment Vacío 100 True 2-Vertical cmdnew &Nuevo Cmdnext &Siguiente cmdprevious &Anterior cmdexit Sa&lir lbl1 Comentario lbl2 Teléfonos lbl3 Nombre
Teclee el siguiente código.
‘todas la variables DEBEN declararse Option explicit ‘declara un tipo definido por el usuario que corresponde a un ‘registro en el archivo PHONE.DAT Private type Persona Nombre as string * 40 Telef as string * 40 Coment as string * 100 End type
‘declara variables que deben ser visibles ‘en todos los procedimientos del formulario Private gpersona as persona
Private Private Private Private
gfilenum as integer grecordlen as long gcurrentrecord as long glastrecord as long
Public sub salvaRegistro ‘llena a gpersona con los datos desplegados gpersona.nombre=txtnombre.text gpersona.telef=txttelef.text gpersona.coment=txtcoment.text ‘guarda gpersona en el registro actual Put #gfilenum, gcurrentrecord, gpersona End sub Public sub MuestraRegistro ‘llena a gpersona con los datos del registro actual get #gfilenum, gcurrentrecord, gpersona ‘despliega a gpersona txtnombre.text=trim(gpersona.nombre) txttelef.text=trim(gpersona.telef) txtcoment.text=trim(gpersona.coment) ‘despliega el número de registro actual ‘en el título del formulario frmtelefono.caption=”titulo” & “Registro:” & str(gcurrentrecord) & _ str(glastrecord) End sub Private sub form_load() ‘calcula la longitud de un registro grecordlen=len(gpersona) ‘obtiene el siguiente numero de archivo disponible gfilenum=freefile ‘abre el archivo para acceso aleatorio, si al archivo no existe lo crea Open “PHONE.DAT” For Random As gfilenum len=grecordlen ‘actualiza gcurrentrecord gcurrentrecord=1 ‘encuentra cual es el ultimo numero de registro del archivo glastrecord=lof(gfilenum)/grecordlen
‘si el archivo acaba de ser creado ‘establece glastrecord a 1 if glastrecord=0 then glastrecord=1 end if ‘despliega el registro actual muestraregistro End sub Private sub cmdnew_click() ‘guarda el registro actual salvaregistro ‘añade un nuevo registro en blanco glastrecord=glastrecord+1 gpersona.nombre=” ” gpersona.telef=” ” gpersona.coment=” ” put #gfilenum, glastrecord, gpersona ‘actualiza a gcurrentrecord gcurrentrecord=glastrecord ‘despliega el registro que acaba de crear muestraregistro txtnombre.setfocus End sub Private sub cmdnext_click() ‘si el registro actual es el ultimo registro, emite un sonido ‘y despliega un mensaje de error, en caso contrario, guarda ‘el registro actual y salta al siguiente registro if gcurrentrecord=glastrecord then Beep MsgBox “Fin del Archivo”, vbexclamation else salvaregistro gcurrentrecord=gcurrentrecord+1 muestraregistro end if txtnombre.setfocus End sub
Private sub cmdprevious_click() ‘si el registro actual es el primer registro, emite un sonido ‘y despliega un mensaje de error, en caso contrario, guarda ‘el registro actual y salta al anterior registro if gcurrentrecord=glastrecord then Beep MsgBox “Fin del Archivo”, vbexclamation else salvaregistro gcurrentrecord=gcurrentrecord-1 muestraregistro end if txtnombre.setfocus End sub Private sub cmdexit_click() ‘guarda el registro acual salvaregistro ‘ cierra el archivo close #gfilenum End End sub •
Graba y ejecuta tu programa
Modificación al programa
•
Teclea el siguiente código
Private sub cmdsearch_click() Dim Dim Dim Dim
busca as string found as integer recnum as long tmp as persona
‘obtiene del usuario el nombre a buscar busca=inputbox(“Nombre a Buscar:”, “Busqueda”) ‘si el usuario no da el nombre if busca=” ” then txtnombre.setfocus exit sub end if ‘convierte el nombre del usuario a buscar a mayúsculas busca=ucase(busca) ‘inicializa el indicador found en false found=false
‘busca el nombre que introdujo el usuario for recnum=1 to glastrecord
get #gfilenum, recnum, tmp if busca=ucase(trim(tmp.nombre)) then found=true exit for end if next ‘si encuentra el nombre despliega el registro if found=true then salvaregistro gcurrentrecord=recnum muestraregistro else MsgBox “Nombre: ” & busca & “ no existe” end if txtnombre.setfocus End sub •
Graba y ejecuta tu programa
La opción borrar queda de tarea para la siguiente clase, no quiero el código, quiero el algoritmo.