sábado, 29 de noviembre de 2014

Programando con Menús

1 - Introducción

Estos objetos que tienen sus propiedades y métodos definidos como cualquier otro objeto, son fundamentales para utilizarlos en tiempo de ejecución, y nos permiten obtener información y realizar tareas específicas y variadas como por ejemplo:
Trabajar con la pantalla (objeto Screen), obtener datos referentes a nuestra aplicación ( objeto App), el objeto Clipboard ( para trabajar con el portapapeles de windows) y algunos otros

2 - El objeto App

El objeto App posee una serie de propiedades para obtener información de nuestra aplicación

Propiedad Path
Esta propiedad nos devuelve una cadena con la ruta donde se encuentra el ejecutable de nuestro programa. Esta propiedad es de suma importancia, ya que nosotros siempre debemos "programar las rutas" de nuestra aplicación de forma relativa, es decir en donde realmente se encuentre nuestra aplicación, ya que el usuario puede instalar nuestro programa en un directorio cualquiera y de este modo si nosotros hemos puesto, por ejemplo de un archivo externo en una ruta absoluta (por ejemplo "c:\Archivos de programa", puede darse el caso de que la aplicación no encuentre dicho archivo ya que se ha instalado en otro directorio, ejecutarse en otra plataforma, etc..
Para resolver estos problemas sobre las referencias a las rutas de archivos, podemos utilizar el objeto App.path, y lo que hace esta propiedad es devolvernos el path de nuestra aplicación.
Ejemplo
ruta = App.Path & "\config.dat"

En el ejemplo anterior, si nuestra aplicación contiene un archivo de configuración del programa, un gráfico o cualquier otro fichero, para poder localizarlo lo hacemos mediante el objeto App.path mas el archivo que deseamos e interponiéndole la barra invertida.
Nota: lo que hay que tener en cuenta para que no se produzca un error en tiempo de ejecución, es que el objeto App.path nos devuelve solo el nombre de directorio de nuestra aplicación pero sin la barra invertida al final, es decir que si deseamos por ejemplo hacer referencia a un archivo de nuestra aplicación para trabajar con él, debemos agregarlo nosotros.
Otro ejemplo podría ser el siguiente, supongamos que tenemos un programa que carga una imagen en un formulario. Si nosotros hacemos una referencia al archivo de imagen mediante una ruta absoluta estaremos cometiendo un error, lo correcto sería

Dim Ruta As String


Ruta = App.Path & "\imagen.gif"

Me.Picture = LoadPicture(Ruta) 


Propiedad PrevInstance del objeto App

Esta propiedad se utiliza para comprobar si nuestro programa ya está cargado en memoria devolviéndonos un valor de tipo boolean, True en caso correcto o False si no está abierto o cargado en memoria.
La propiedad PervInstance es importante ya que un usuario, por error, puede abrir mas de una instancia de la aplicación, algo que no tendría mucho sentido en la mayoría de los casos.
De este modo si se intenta abrir el programa mas de una vez, podemos mostrar un mensaje informativo y descargar la aplicación mediante la sentencia End, o no mostrar nada y terminar la ejecución. Este ejemplo muestra un mensaje cuando se intenta abrir mas de una ves, y luego de aceptar el mensaje se cierra con End

 Private Sub Form_Initialize()

If App.PrevInstance = True Then
    
    
    MsgBox " La aplicación ya se encuentra cargada en memoria", vbInformation

    ' Finaliza el programa
    End

End If

End Sub


Otras propiedades del objeto App

  • ExeName: Con ExeName podemos recuperar el nombre del ejecutable de la aplicación en tiempo de ejecución
  • Hinstance: Esta propiedad nos retorna el handle o manipulador de nuestra aplicación. Mediante esta propiedad y algunas Apis relacionadas con este tema podemos controlar nuestra algunas cosas
  • Taskvisible: es una propiedad de tipo boolean que se utiliza para determinar si nuestra aplicación aparecerá en la lista de tareas. Esta propiedad solo funciona si nuestra aplicación tiene la propiedad visible en false

3 - Objeto Screen

Con el objeto Screen se puede determinar y obtener información sobre las fuentes instaladas en el sistema operativo, la resolución actual de la pantalla, el formulario y/o control que está activo,
Un ejemplo para poder obtener la resolución del monitor:

Dim Ancho As Integer
Dim Alto As Integer


Ancho = (Screen.Width / Screen.TwipsPerPixelX)
Alto = (Screen.Height / Screen.TwipsPerPixelY)



MsgBox "La resolución en Pixeles del monitor es de: " & vbNewLine & _
        "Ancho: " & Ancho & vbNewLine & _
        "Alto: " & Alto, vbInformation 

Para obtener el alto y el ancho en pixeles debemos hacer una simple conversión ya que mediante las propiedades width y height obtenemos el ancho y el alto del monitor pero expresado en twips, para obtener ese valor en pixeles hay que dividirlo por la propiedad TwipsPerPixelX y TwipsPerPixelY, que son propiedades que las podemos acceder desde el objeto Screen

Ejemplo para poder obtener una lista de las fuentes instaladas en el sistema


El objeto screen posee un objeto o colección llamado Fonts que es un vector que contiene las fuentes del sistema y una propiedad llamada FontCount para saber la cantidad de fuentes.
Ejemplo para cargar las fuentes del sistema en un control ListBox

Dim La_Fuente As Integer


    'Recorre las fuentes
    For La_Fuente = 0 To Screen.FontCount - 1
       
        'Añade el nombre de la fuente al control
        List1.AddItem Screen.Fonts(La_Fuente)

    Next La_Fuente 

Mediante 4 líneas de código tenemos un control ListBox que muestra el nombre de todas las fuentes del sistema.

Nota: Para poder obntener las fuentes pero de una impersora, se realiza igual que en el paso anterior , con la diferencia que en ves de usar el Objeto Screen, se usa el Objeto Printer.
Por ejemplo
Colocar un ComboBox en el formulario donde se listarán las impresoras instaladas, y en agregar un Control ListBox donde agregarán las fuentes
vista del formulario con el listque contiene las fuentes y el combo que lista los printer

Código fuente en el formulario
Option Explicit
Private Sub Combo1_Click()
    Ver_fuentes Combo1.ListIndex
End Sub

Private Sub Form_Load()

    Dim ObjPrinter As Printer
    
        ' Recorre la lista de impresoras instaladas _
         en el sistema y agrega el nombre en el combo
    For Each ObjPrinter In Printers
        Combo1.AddItem ObjPrinter.DeviceName
    Next

End Sub

' Enumera las fuentes en el ListBox de la _
  impresora seleccionada en el Combo
Sub Ver_fuentes(Impresora As String)
    
    ' Referencia a la impersora
    Set Printer = Printers(Impresora)
    
    Dim i As Integer
    List1.Clear
    
    ' Lista las fuentes soportadas de la impresora
    For i = 0 To Printer.FontCount - 1
        List1.AddItem Printer.Fonts(i)
    Next
     
End Sub  

4 - El objeto ClipBoard

Con ClipBoard podemos trabajar con el portapapeles de windows, ya sea para establecer o recuperar datos del mismo.
Ejemplo:
Para recuperar el texto guardado en el portapapeles:

Dim cadena As String

cadena = Clipboard.GetText

MsgBox cadena 

Con este otro ejemplo podemos grabar o asignar un texto en el portapapeles

 Clipboard.SetText "cadena de texto a grabar o variable string"
 
Con el método Clear del objeto ClipBoard podemos borrar el contenido del portapapeles (no requiere ningún parámetro)

Clipboard.clear

Con la siguiente línea podemos copiar una imagen del portapapeles a un control picture, si es que la hay, usando el método Getdata del objeto Clipboard

Picture1.Picture = Clipboard.GetData

Lo siguiente copia una imagen cargada en un control de imagen al portapapeles, es decir hacer lo contrario:

Clipboard.SetData Picture1.Picture

5 - Menues en visual basic

Ejemplo para crear menúes y menúes contextuales o también llamados menú PopUp, que son aquellos que se despliegan con el botón derecho del mouse.
Casi todas las aplicaciones por mas pequeñas que sean, poseen un acceso a determinadas o casi todas las opciones de un programa por medio de un menú.
Si bien las opciones las podemos encontrar en la interface misma de la aplicación, ya sea por medio de botones, barras de herramientas etc.., nunca está demás que estén a mano por medio de un menú.
Visual Basic incorpora una herramienta llamada editor de menúes para poder crearlos
Nota: El editor de Manúes se encuentra en el menú herramientas y solo está disponible desde la vista diseño del formulario, es decir que si estás visualizando la ventana de código o un módulo de código deberás cerrarlas y dejar visible el formulario que estés diseñando para que la opción esté habilitada.

6 - Los menues de cabecera y submenues

Los menúes de cabecera son los menúes principales que contienen otros submenues. Por ejemplo en el menú del internet explorer, el menú archivo es el menú de cabecera o de primer nivel, y las opciones internas de este (abrir, guardar, imprimir, cerrar, etc...) son los submenues que están en un nivel por debajo del menú archivo.
Crear un menú
  1. El primer paso es diseñar un buen diagrama que incluya la mayoría de las opciones, para que el usuario las pueda tener a mano también en el menú.
  2. Si observas otras aplicaciones, estas respetan el orden y ubicación de sus menues, es decir que si estás creando un programa que tiene opciones para imprimir una hoja, esta se encontrarán en la sección del menú archivo, si tienes opciones de edición del documento como cortar copiar, pegar , seleccionar todo, etc..., las encontrarás en el menú "edición", si deseas crear un formulario "acerca de..", lo ubicarás en el menú ayuda con el "nombre acerca de...". esta forma de diseño y diagramación es fundamental para que el programa sea estándar y aceptado por todos, por llamarlo de alguna manera, ya que si bien nosotros recordamos el nombre y donde se encuentra ubicada cada opción, un usuario o tercero debe resultarle lo mas sencillo posible el acceso a las opciones del mismo.


7 - Agregar elementos en un menú

El siguiente ejemplo consiste en un formulario que contiene solo un control label que nos mostrará una leyenda con el texto del menú que seleccionamos o presionamos.
El menú estará compuesto por 3 menues de cabecera, el primero llamado "Archivo", el segundo "Edición" y el último "Ayuda". A su vez cada menú tendrá los siguientes submenues:
  1. Archivo : Este menú contendrá los submenues " Abrir ", " Guardar ", " Imprimir " y " Cerrar "
  2. Edición: Contendrá los submenues " Cortar ", " Copiar ", " Pegar ", " Seleccionar todo "
  3. Ayuda : Tendrá los submenues " Ayuda " y " Acerca de.. "

vista previa del editor que utiliza Visual Basic para crear los menues de opción

El cuadro de diálogo del editor de menú de visual basic posee los siguientes campos para rellenar. Algunos son opcionales y otros son obligatorios, como la propiedad Caption y Name:
  • Caption: en este campo debemos colocar la leyenda que mostrará el menú, es decir el texto que mostrará el mismo.
  • Name: en este campo debemos introducir un nombre para cada menú. Este es obligatorio y no puede estar duplicado ya que por medio de este nombre identificaremos al menú en el código.
  • Index: en este campo que es opcional podemos introducir un número para formar vectores de menues o arreglos de menues, en este ejemplo no se usa, por ejemplo para crear menues en forma dinámica en tiempo de ejecución
  • helpcontextid: este campo opcional podemos introducir un n° para el tópico de ayuda, por si el usuario presiona la tecla F1 justo cuando está posicionado en el menú.
  • Shortcut: Podemos ingresar una tecla de acceso rápido al menú para que se despliegue el mismo automáticamente, como por ejemplo Ctrl + a, Ctrl + b, etc...
  • Checked: este campo indica si el menú tendrá un tilde a la izquierda o no. Si está en true lo muestra si está en False no. El campo es de tipo opcional.
  • Enabled : propiedad booleana que determina si el menú está habilitado o no. Esta propiedad es exactamente igual a la propiedad Enabled de cualquier control de visual basic. El campo por defecto, mejor dicho la propiedad está en True
  • Visible : propiedad opcional y de tipo booleana que determina si el menú estará visible o no. Esta propiedad es ideal para crear los menues contextuales o PopUp (mas adelante hay un ejemplo de como crear uno).

Pasos a seguir:
  1. Una vez abierto el editor de menú, hay que ingreasar los elementos que componen el mismo. Para crear el menú "Archivo" que es un menú de cabecera o de nivel superior, debemos ingresar en la propiedad Caption la cadena &Archivo.
    Ahora le asignaremos un nombre en el campo Name.
    G Generalmente se suele utilizar en este campo el mismo nombre del menú pero con el prefijo mnu para luego poder distinguirlo fácilmente en el código. Entonces ingresamos en este campo mnuarchivo
  2. El segundo paso será ingresar los submenues que están por debajo del menu archivo. Para ello presionamos el botón "siguiente" donde ingresaremos el menú "Abrir". como este es un submenú debemos indicarlo con el botón que tiene una flecha hacia la Derecha. Al presionarlo ahora el mismo se marca con una doble comilla (""""), para indicarnos que este menú deriva o está contenido en el menú de cabecera "Archivo". Ahora pasamos a ingresarle el nombre y la leyenda del menú. En la propiedad Caption ingresamos &Abrir y en el campo Name : mnuabrir.
  3. Ahora repetimos los pasos anteriores para ingresar los submenues restantes del menú Archivo.
  4. Si habrás observado los clásicos menues de las aplicaciones, los submenues se agrupan en secciones. Por ejemplo en el menú archivo del internet explorer, el submenú Salir está separado del resto por una línea. para lograr esto se debe crear un submenú como cualquier otro justo arriba del menú que queremos que aparezca la línea divisoria, y en la propiedad caption del mismo le colocamos el caracter menos -
  5. Ahora ingresaremos el código para que muestre la leyenda en el control Label cada vez que presionemos un menú.
  6. Como habrás notado, el menú se va incorporando al formulario en tiempo de diseño como cualquier otro control de visual basic. Para ingresar el código necesario diremos que cada menú responde a un evento llamado click y que se dispara cuando presionamos el menú con el mouse o cuando le damos un enter, para ingresar el código en el menú "Abrir" le damos un click en el mismo menú desde la ventana de diseño. Una vez abierta la ventana de código aparecerá una rutina como la siguiente:

Private Sub mnuabrir_click()

End Sub


Ahora dentro del evento Click del menú colocamos lo siguiente para que la etiqueta muestre la propiedad caption del menu abrir al pulsar sobre el menú

Label1.Caption = mnuarchivo.Caption
 
Nota: cabe aclarar que estas rutinas las podemos invocar o llamar como cualquier otra rutina de código , por ejemplo en el caso anterior, por ejemplo si coloco esto en un botón se llamaría al procedimiento Click del menú y se ejecutaría el código.
Call mnuabrir_click
 
Esto es útil si tenemos una barra de herramientas, ya que no tendremos que escribir código 2 veces, y podemos usar un solo procedimiento haciendo una simple llamada al mismo

8 - Menues contextuales o popup menú

Los menues contextuales, esos que se despliegan cuando presionamos el botón derecho del mouse, son simples menues pero con la diferencia de que los mismos poseen la propiedad Visible en False, y luego se visualizan utilizando el método PopUpMenu
El método PopUpMenu , se encuentra disponible solo para los formularios.
Los parámetros de este método son los siguientes:

Nombreformulario.PopUpMenu "Elmenu", "flags", x , y, opcion

  • Menu: este es el menú popup que debe estar en el formulario, es decir el nombre
  • Flags: este parámetro indica la apariencia del menú en el formulario. Acá podemos utilizar las siguientes constantes para ubicar el menú:
    vbpopupmenuleftalign ubica el menú en el lado izquierdo con respecto a x.
    vbpopupmenucentertalign alinea en el centro de la coordenada x. vbpopupmenurightalign lo alinea en el lado izquierdo. En la mayoría de los casos este parámetro no se utiliza.
  • X e Y: podemos indicar, aunque no se suele utilizar, las posiciones x e y donde debe desplegarce el menú.
  • opcion: en este parámetro opcional , podemos indicar el nombre de un submenú para que aparezca resaltado en negrita.

Si bien el menú PopUp lo podemos llamar en cualquier momento, lo mas común es utilizarlo y desplegarlo cuando el usuario presiona el botón derecho sobre un control, formulario etc...
Sabiendo esto , para desplegarlo por ejemplo cuando el usuario presiona el botón sobre un área del formulario, podemos utilizar el evento MouseUp o MouseDown del mismo y consultar la variable Button del procedimiento y mediante una estructura IF - Then comprobar si el botón que presionamos es el derecho , utilizando las constantes VbRightButton, vbLeftButton

9 - Ejemplo para crear un menú PopUp

Crear un menú llamado mnuContextual con la propiedad visible en False y pegar esta rutina en el formulario:

Private Sub form_mouseup(button As Integer, shift As Integer, x As Single, y As Single)


' Consultamos si el botón presionado es el derecho
If button = vbRightButton Then
    
    ' Depliega el menú PopUP
    Me.PopupMenu mnucontextual
End If

End Sub 

En el siguiente enlace hay 3 ejemplos con su código fuente que muestra como crear 2 menú y uno de estilo PopUp

No hay comentarios:

Publicar un comentario