Curso
sobre Visual Basic
por Jorge Serrano (Mundo Visual)
Tema Cuatro ( 9/Ago/97)
Baja el archivo en formato Word (tema4.zip 123 KB)
Programación profesional
Vamos a programar a partir de ahora nuestras propias aplicaciones.
Es mejor practicar que llenar este curso de palabras y teoría. Para aprender a programar es fundamental practicar, practicar y practicar. De momento y en las tres lecciones anteriores, hemos dado buena cuenta de práctica mezclada con teoría, porque es indispensable conocer antes el entorno de trabajo donde nos moveremos, para no perdernos más tarde por él.
Las aplicaciones que tratemos a partir de ahora, constituirán el uso de lo visto ya con nuevos controles, código y técnicas.
La programación en Visual Basic es una programación orientada a eventos, es decir, no posee código estructurado claro, sino dentro de los eventos, siendo uno el comienzo y otro el final, pero puede haber varios (más de uno) finales en nuestros programas (p. ej.: error grave detectado en la ejecución de una sentencia que no nos permita continuar para no degradar el programa o el resultado de este).
Ejemplo 1. (Parte 1)
Editor de texto
Vamos a escribir un programa que tenga las funciones básicas de un editor de texto.
Para ello, deberemos pensar cuáles son los objetivos del programa para utilizar los controles justos.
|
Pongámonos manos a la obra.
Haga click en el formulario una vez y pulse las teclas Ctrl+E.
Escriba lo siguiente:
Caption: &Abrir
Name: mnuAbrir
Pulse el botón Siguiente.
Caption: &Guardar
Name: mnuGuardar
Pulse el botón Siguiente.
Caption: &Salir
Name: mnuSalir
Ponga un TextBox en el formulario y escriba las siguientes propiedades:
Text: ""
Multiline: True
ScrollBars: Vertical
Escriba el título de nuestro formulario:
Caption: Editor
En el control CommonDialog escriba:
InitDir: C:\
CancelError: True (checked)
Ahora ajustaremos el tamaño del TextBox al tamaño del formulario, para darle una vista más atractiva.
Para ello escribimos el siguiente texto:
Private Sub Form_Resize()
Text1.Left = 0
Text1.Top = 0
Text1.Height = Form1.ScaleHeight
Text1.Width = Form1.ScaleWidth
End Sub
Con este evento logramos que cada vez que cambiemos el tamaño de nuestra ventana (maximizar, minimizar, etc), el control TextBox se ajuste en tamaño con este a la vez.
Ahora añadimos la propiedad WindowState del formulario a valor 2-Maximized.
El resultado obtenido es algo parecido a este:
Aún, nos queda el código más importante, ya que de momento le hemos dado el aspecto GUI deseado a nuestro programa. Es indispensable que nuestro programa realice bien su trabajo y por tanto nos quedará por escribir todas las instrucciones necesarias para ello.
Añada el siguiente código:
' Menu: Salir
Private Sub mnuSalir_Click()
Dim Respuesta As Integer
Respuesta = MsgBox("¿Desea salir del editor?", 36, "Editor")
If Respuesta = 6 Then
Unload Form1
End If
End Sub
'Menu Abrir
Private Sub mnuAbrir_Click()
Dim nLen, nCanal As Integer
On Error GoTo error
CommonDialog1.DialogTitle = "Abrir archivo"
CommonDialog1.Filter = "Archivos de Texto (*.txt;*.wri;*.me;*.bbs)|*.txt;*.wri;*.me;*.bbs|Todos los ficheros(*.*)|*.*"
CommonDialog1.ShowOpen
nCanal = FreeFile
Open CommonDialog1.filename For Binary As #nCanal
nLen = LOF(nCanal)
Texto$ = Space$(nLen)
Get #nCanal, , Texto$
Text1.Text = RTrim$(Texto$)
Close #nCanal
Exit Sub
error:
'Escribe o gestiona el error aquí si quieres
Exit Sub
End Sub
'Menu Guardar
Private Sub mnuGuardar_Click()
Dim nCanal As Integer
On Error GoTo error
CommonDialog1.DialogTitle = "Guardar archivo"
CommonDialog1.Filter = "Archivos de Texto (*.txt;*.wri;*.me;*.bbs)|*.txt;*.wri;*.me;*.bbs|Todos los ficheros(*.*)|*.*"
CommonDialog1.ShowSave
nCanal = FreeFile
Open CommonDialog1.filename For Output As nCanal
Print #nCanal, Text1.Text
Close #nCanal
Exit Sub
error:
'Escribe o gestiona el error aquí si quieres
Close #nCanal
Exit Sub
End Sub
Con este código, nuestro programa abre y graba un archivo de texto.
Aún, así, nuestra aplicación carece del aspecto profesional que se merece, por lo que es necesario mejorar algunas opciones para realizar un editor de texto más profesional, además de hacer uso de algunos controles y llamadas a las API de Windows.
Manos a la obra.
Para darle un aspecto más propio de un editor profesional, incluiremos en nuestro proyecto un control llamado StatusBar, el cual nos permite mostrar varios aspectos de interés al usuario.
Seleccione el control StatusBar de nuestra caja de herramientas e insértelo en el formulario extendiéndolo.
Pinche con el botón derecho del ratón sobre la barra de estado, y seleccione Propiedades.
Dentro de la ventana de propiedades del control StatusBar, pinche sobre la solapa Paneles, y una vez que esté situado sobre esta, siga estos pasos:
Index: 1
Text: Mundo Visual - 1997
ToolTip Text: ejemplo de StatusBar
Alignment: 1 - sbrCenter
Style: 0 - sbrText
Bevel: 2 - sbrRaised
AutoSize: 1 - sbrSpring
Pulse sobre el botón Insert Panel y escriba:
Index: 2
Minimun Width: 600
Alignment: 1 - sbrCenter
Style: 2 - sbrNum
Bevel: 1 - sbrInset
AutoSize: 2 - sbrContent
Pulse sobre el botón Insert Panel y escriba:
Index: 3
Minimun Width: 600
Alignment: 1 - sbrCenter
Style: 1 - sbrCaps
Bevel: 1 - sbrInset
AutoSize: 2 - sbrContent
Pulse sobre el botón Insert Panel y escriba:
Index: 3
Minimun Width: 600
Alignment: 1 - sbrCenter
Style: 3 - sbrIns
Bevel: 1 - sbrInset
AutoSize: 2 - sbrContent
Pulse sobre el botón Insert Panel y escriba:
Index: 4
Minimun Width: 600
Alignment: 1 - sbrCenter
Style: 4 - sbrScrl
Bevel: 1 - sbrInset
AutoSize: 2 - sbrContent
Pulse F5 y sitúe el icono del ratón sobre el texto de la barra de estado, podrá ver que el texto " ejemplo de StatusBar" aparece junto a la barra de estado. Aquí puede poner cualquier referencia que desee o dejarlo en blanco. Es útil para mostrar información adicional del programa como "Programa Shareware", una dirección de e-mail, etc.
El resultado parcial es aproximadamente este:
Hasta aquí, todo va resultando sencillo, y con pocas líneas hemos dado una apariencia más profesional a nuestra aplicación. Todo sin hacer un gran esfuerzo.
Ahora bien, es posible que deseemos dar mayor funcionalidad a nuestra aplicación.
Debemos tener en cuenta, que nuestra aplicación posee un error de programación muy importante y habitual a los programadores de Visual Basic. Este error es producido cuando deseamos cerrar nuestra aplicación. Si pulsamos en el menú sobre la palabra Salir, el programa nos pregunta si deseamos o no salir de la aplicación, pero si pulsamos sobre el aspa de la ventana:
el programa no nos preguntará si deseamos acabar, es decir, concluirá directamente nuestra aplicación. Ahora bien, puede ser que deseemos realizar dos cosas cuando se pulse sobre el aspa de la ventana:
Veámoslo son sendos ejemplo, para que usted elija el que crea más oportuno:
Ejemplo 1:
' Menu: Salir
Private Sub mnuSalir_Click()
Unload Form1
End Sub
Private Sub Form_Unload(Cancel As Integer)
Dim Respuesta As Integer
Respuesta = MsgBox("¿Desea salir del editor?", 36, "Editor")
If Respuesta = 6 Then
Unload Form1
Else
Cancel = True
End If
End Sub
Ejemplo 2:
'En General declaraciones, escriba:
Private Pasa
'Inicializamos el valor de la variable Pasa:
Private Sub Form_Load()
Pasa = False
End Sub
' Menu: Salir
Private Sub mnuSalir_Click()
Dim Respuesta As Integer
Respuesta = MsgBox("¿Desea salir del editor?", 36, "Editor")
If Respuesta = 6 Then
Pasa = True
Unload Form1
End If
End Sub
Private Sub Form_Unload(Cancel As Integer)
If Pasa = False Then
Cancel = True
End If
End Sub
Con esta segunda forma, mantenemos un control de ignorar cuando el usuario pulsa sobre el aspa de la ventana, obligando al usuario a pulsar la opción del menú Salir.
Pulsamos Ctrl+E y pinchamos una vez con el ratón sobre &Salir y pulsamos el botón Insertar.
Escribimos las siguientes propiedades:
Caption: &Editor
Name: mnuEditor
Pinche otra vez con el ratón sobre &Salir y pulsamos el botón Insertar.
Pulse ahora sobre el botón con la punta de flecha hacia la derecha: -->
Caption: &Seleccionar Todo
Name: mnuSeltodo
Pinche otra vez con el ratón sobre &Salir y pulsamos el botón Insertar.
Pulse ahora sobre el botón con la punta de flecha hacia la derecha: -->
Caption: &Copiar texto
Name: mnuCopiar
Pinche otra vez con el ratón sobre &Salir y pulsamos el botón Insertar.
Pulse ahora sobre el botón con la punta de flecha hacia la derecha: -->
Caption: &Pegar texto
Name: mnuPegar
Pinche otra vez con el ratón sobre &Salir y pulsamos el botón Insertar.
Pulse ahora sobre el botón con la punta de flecha hacia la derecha: -->
Caption: C&ortar texto
Name: mnuCortar
Añada el siguiente código en General declaraciones:
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Long) As Long
Y las siguientes líneas:
Private Sub mnuSeltodo_Click()
Text1.SetFocus
Text1.SelStart = 0
Text1.SelLength = Len(Text1.Text)
End Sub
Private Sub mnuCopiar_Click()
Clipboard.Clear
Clipboard.SetText Text1.SelText
Text1.SetFocus
End Sub
Private Sub mnuPegar_Click()
Text1.SelText = Clipboard.GetText()
Text1.SetFocus
End Sub
Private Sub mnuCortar_Click()
Clipboard.SetText Text1.SelText
Text1.SelText = ""
Text1.SetFocus
End Sub
Private Sub mnuUndo_Click()
UndoResultado = SendMessage(Text1.hwnd, &HC7, 0&, 0&)
If UndoResultado = -1 Then
Beep
MsgBox "Error al intentar recuperar.", 20, "Undo"
End If
End Sub
Private Sub Form_Resize()
Text1.Left = 0
Text1.Top = 0
Text1.Height = Form1.ScaleHeight - StatusBar1.Height
Text1.Width = Form1.ScaleWidth
End Sub
Pulse F5. Que duda cabe que este no es el mejor aspecto o el aspecto más profesional de este ejemplo, pero eso ya lo dejo a gusto del programador que es el encargado de distribuir los menús como él quiera.
El resultado parcial de la aplicación es:
Antes me gustaría hacer alusión a los menús subdivididos, es decir, aquellos menús que están separados mediante una pequeña barra horizontal que separa por ejemplo dentro de un menú llamado Fichero a unos submenús llamados Abrir, Guardar, y dividido mediante una pequeña barra horizontal el submenú Salir.
El aspecto debería ser algo así:
La barra separadora se obtiene, de la forma:
Dentro del submenú, escribimos:
Caption: -
Name: A1 (por ejemplo)
Es bastante recomendable que los nombres a los separadores sean códigos o palabras poco utilizados para no caer en la repetición de los nombres de las variables.
Por ahora, nuestra aplicación, posee las características más usuales de un editor de texto de carácter lo más parecido a la profesionalidad de una aplicación.
Todo programa puede ser mejorado, ampliado, modificado, ... pero no está mal para empezar.
En Windows 95 y Windows NT, si pulsamos con el botón derecho sobre una caja de texto, aparece un menú de selección como este:
Puede ser que no deseemos que aparezca este menú, y sí que aparezca el menú Editor que nosotros mismos hemos programado. Para que esto suceda, deberemos escribir lo siguiente en el evento correcto:
(En este caso, haremos uso de un truco de programación para que Windows no nos muestre la pantalla antes mencionada. Con este truco engañaremos a Windows para ocultar esta pantalla y mostrar la que nosotros queremos).
Private Sub Text1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
' Button=1 --> botón izquierdo
' Button=4 --> botón central
' Button=2 --> botón derecho
If Button = 2 Then
Text1.Enabled = False
Text1.Enabled = True
PopupMenu mnuEditor
Text1.SetFocus
End If
End Sub
Cabe destacar, que en el truco de programación, antecede la línea:
PopupMenu mnuEditor
a la línea:
Text1.Enabled = True
Con esto conseguimos que el texto aparezca en background (color gris) mientras que aparece el menú de selección nuestro.
Es decir, con un ejemplo:
Sin embargo, con esta modificación, presentamos el texto correctamente, y "engañamos" a Windows haciéndole creer que el texto no está en modo escritura, para luego pasarlo a modo escritura y mostrar nuestro menú, dejando las letras de fondo de forma normal sin que el usuario aprecie lo que hemos realizado. Esto es, con un ejemplo así:
Este es el resultado final de nuestra aplicación mostrando el menú que nosotros queremos.
Este tema más o menos ha concluido.
En los siguientes mejoraremos nuestro editor realizando un editor de texto mucho más profesional.
Poco a poco veremos los cambios insertando más controles que nos permitan un mejor aspecto a nuestra aplicación.
En resumen podríamos decir que hemos visto como insertar menús, separadores dentro de un submenú, ajuste de un control (TextBox y StatusBar) al formulario cuando redimensionamos la ventana de nuestra aplicación.
Hemos aprendido a mostrar menús PopUps dentro de un control (hemos visto como ejemplo dentro de un TextBox). Veremos más adelante como mostrar menús inexistentes u ocultos.
Hemos visto funciones básicas del control StatusBar, y funciones básicas de un editor de texto simple, así como el uso de una función API de Windows para deshacer los cambios realizados sobre el control TextBox.