.
  • Ribbon para torpes
  • .

    Ribbon para torpes (que diría el gran Forges)

    Uno de los cambios –todo el mundo dice que a peor- de 2003 a 2007 y sucesivas versiones es el ribbon. La verdad es que a mi no me acaba de gustar, es menos flexible que las barras de menús, aunque permite hacer más cosas. Pero al fin y al cabo la barra de menús es eso, una barra de menús, nada más, intentar hacer más cosas con ella al final se paga.

    Uno de los problemas es crear el ribbon, que si con este programa, con aquel, con un editor de xml, ... y no, ... la manera más simple de hacer un ribbon es con un editor de texto, el NotePad para ello va genial. Y con un poquitín de práctica, no mucha, se hacen los ribbon en un plis-plas.

    Para ello hay que tener en cuenta que el Ribbon es un fichero que cumple normas xml y hay que seguirlas a rajatabla, todo Ribbon sigue este esquema básico:

    <customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="OnRibbonLoad">
       <ribbon startFromScratch="true">
        <tabs>

        </tabs>
       </ribbon>
    </customUI>

    En el caso de Office 07 la primera línea quedaría: <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="OnRibbonLoad">

    En la segunda línea el valor 'true' de startFromScratch lo que hace es eliminar toda referencia al ribbon propio de Access, es decir creamos un ribbon con nuestras opciones únicamente. Si ponemos el valor a 'false' añade nuestras opciones a las que Access tiene. Yo me creo dos ribbon, uno con y otro sin, el con es para mi, para desarrollo, y el sin es el que le envío al cliente, que solo necesita las opciones del programa.

    Bien, ya tenemos el ribbon creado :XD, ahora solo hay que poner las opciones que deseemos, para ello hay que crear las pestañas y dentro de estas los grupos. Hay que tener en cuenta que cada pestaña tiene que tener al menos un grupo.

    Cada pestaña debe tener id y nombre (label), cada grupo debe tener id, no hace falta que tenga nombre. Los id deben ser únicos, es el índice que usa access para poder acceder a ellos (y nosotros cuando aprendamos a sacarle partido al invento este).

    Cada pestaña se abre y se cierra con la pareja de marcadores <tab> y </tab>.

    Cada grupo se abre y se cierra con la pareja de marcadores <group> y </group>.

    Así que siguiendo el esquema html la cosa para una pestaña con dos grupos nos quedará así:

    <customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="OnRibbonLoad">
       <ribbon startFromScratch="true">
        <tabs>

         <tab id="IdTab1" label="Nombre pestaña 1">
           <group id="IdGrup1" label="Nombre grupo1">
           </group>

           <group id="IdGrup2" label="Nombre grupo2">
           </group>
         </tab>


        </tabs>
       </ribbon>
    </customUI>

    Bueno, ya tenemos el 'esqueleto' de nuestro ribbon, ahora falta ponerle los botones con las opciones de nuestro menú. El esquema de un botón es el siguiente:

    <button id="Id" label="Titulo" imageMso="NombreImagen" tag="TagBoton" size="Tamaño" onAction="OAB" getVisible="Gvi" getEnabled="Gen" getScreentip="Gsc"/>

    Todo ello escrito en una sola línea queda mejor, ya que las últimas opciones no las vamos a tocar casi nunca, y para eso el notepad es perfecto, solo hay que desactivar la opción de 'ajuste de línea' que está en el menú Formato.

    Las opciones del botón son las siguientes:
    ID: Un Id único.
    Label: El título que queramos poner al botón.
    ImagenMso: Nombre de la imagen que queramos poner, Gunter tiene un ejemplo (el número 3) que las muestra todas. Sobre este tema haré una entrada posterior, hay que ser más simples.
    Tag: Información interna para su posterior uso. Yo pongo aquí el nombre del formulario que quiero lanzar, así todos los botones tienen el mismo OnAction, me simplifica mucho las cosas.
    Size: Tamaño del botón. Puede ser small o large. Si no ponemos nada toma small por defecto.
    OnAction: Nombre de la rutina del BackStage que se va a ejecutar al hacer click el el botón.
    GetVisible: Nombre de la rutina que controlará si el botón será o no visible.
    GetEnabled: Nombre de la rutina que controlará si el botón va a estar activo o no.
    GetScreentip: Nombre de la rutina que controlará el 'tip' del botón. Si no queremos que se muestre nada, ni siquiera el 'F1 - ayuda' de Microsoft hay que mandarle a esta rutina en vacio.

    Normalmente solo vamos a modificar el id, el label, la imagen y el tag, con lo que es facilmente comprensible que un proceso de copia/pega nos va a permitir avanzar muy rápidamente en la confección de nuestro ribbon.

    Un ejemplo de ribbon, obviando el final de las líneas para que se vean en pantalla, sería:

    <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="OnRibbonLoad">
       <ribbon startFromScratch="true">
        <tabs>

         <tab id="IdTab1" label="Nombre pestaña 1">
           <group id="IdGrup1" label="Nombre grupo1">
             <button id="Id01" label="Opcion 1" imageMso="Imagen1" tag="Formulario1" .....
             <button id="Id02" label="Opcion 2" imageMso="Imagen2" tag="Formulario2" .....
             <button id="Id03" label="Opcion 3" imageMso="Imagen3" tag="Formulario3" .....
           </group>

           <group id="IdGrup2" label="Nombre grupo2">
             <button id="Id05" label="Opcion 5" imageMso="Imagen5" tag="Formulario5" .....
             <button id="Id06" label="Opcion 6" imageMso="Imagen6" tag="Formulario6" .....
           </group>
         </tab>


        </tabs>
       </ribbon>
    </customUI>

    ¿Como definir una barra de separación vertical?

    <separator id="Id"/>

    ¿Y en horizontal? Yo me creo un botón que no llama a ningún menú. El número de guiones hay que ajustarlo en función de los labels superior e inferior

    <button id="Btn0011" label="-----------------"/>

    Un menú en vertical se compone de una linea <menu> que lo abre y otra </menu> que lo cierra. Entre medias colocamos las opciones de menú que deseemos

    <menu id="IdMenu" size="Tamaño menu" itemSize="Tamaño elementos" label="Titulo menú" imageMso="ImagenMenu">
        <button id="Id01" label="Opcion 1" imageMso="Imagen1" tag="Formulario1" .....
        <button id="Id02" label="Opcion 2" imageMso="Imagen2" tag="Formulario2" .....
        <button id="Id03" label="Opcion 3" imageMso="Imagen3" tag="Formulario3" .....
    </menu>

    Un split Button (que ya no es para torpes .. :XD) se compone de la apertura y cierre del mismo, una declaración del valor del botón (lo que se ejecuta al hacer click en el mismo) y un menú en vertical todo junto, es más fácil verlo que explicarlo

    <splitButton id="IdSplit">
       <button id="Id01" label="Opcion 1" imageMso="Imagen1" tag="Formulario1" .....
       <menu id="IdMenu" size="Tamaño menu" itemSize="Tamaño elementos" label="Titulo menú" imageMso="ImagenMenu">
          <button id="Id02" label="Opcion 2" imageMso="Imagen2" tag="Formulario2" .....
          <button id="Id03" label="Opcion 3" imageMso="Imagen3" tag="Formulario3" .....
          <button id="Id04" label="Opcion 4" imageMso="Imagen4" tag="Formulario4" .....
       </menu>
    </splitButton>

    Y con esto ya nos hemos creado nuestro ribbon, si no vamos a usar las funciones Visible y Enabled nos podemos ahorrar el definir ambas en el BackStage y en la línea del Ribbon. Yo las he puesto para que estén completas las definiciones, ya que acabaremos usándolas.
    Nos falta definir los CallBacks que controlarán las funciones que hemos definido.

    Option Explicit
    Option Compare Database
    Public gobjRibbon As IRibbonUI

    Sub OnRibbonLoad(ribbon As IRibbonUI)
       Set gobjRibbon = ribbon
    End Sub

    Sub OAB(Control As IRibbonControl) '** OnActionButton **
       If Len(Control.Tag) > 0 Then
         On Error GoTo ErrorRun
         DoCmd.OpenForm Control.Tag, acNormal
         End If
       Exit Sub
    ErrorRun:
       MsgBox "No existe el formulario: " & Control.Tag
       Resume Next
    End Sub

    Sub Gen(Control As IRibbonControl, ByRef Enabled) '** GetEnabled **
       Enabled = True
    End Sub

    Sub Gsc(Control As IRibbonControl, ByRef Screentip) '** GetScreentip **
    End Sub

    Sub Gvi(Control As IRibbonControl, ByRef Visible) '** GetVisible **
       Visible = True
    End Sub

    Quedan temas por tocar:
    * Eliminar opciones del backstage
    * Imágenes en el menú
    * Visible / Enabled según usuario (seguridad con tabla)
    * Crear ribbon desde una tabla
    * ...

    Pero eso será otro dia




    Tecsys Proyectos Informaticos, S.L.