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.

  • Deseamos hacer un editor de texto que permita leer archivos en formato Txt, Wri, Me, BBS y *.* (todos).
  • Añadiremos a nuestro formulario un control CommonDialog que nos permitirá abrir la ventana de grabación y apertura de archivos (nos ahorrará mucho trabajo).
  • Utilizaremos un TextBox, y crearemos un menú de opciones para abrir un fichero, salvar un fichero y salir de la aplicación.

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:

  1. Preguntar si se desea concluir la aplicación.
  2. Ignorar el evento.

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.


ir al índice