Encuéntranos en Google+.
Working Into Binary
Ingeniería electrónica, lenguajes de programación, software, simulación, noticias, ofimática, ERP,...

Cómo centrar controles en los formularios de Access

21 julio, 2012

No existe un "botón" para centrar los controles de un formulario de Access indistintamente del tamaño que éste tenga. Únicamente nos da las opciones de delimitarlos respecto izquierda o derecha y arriba o abajo. Para centrar los controles hay que pasar obligatoriamente por el uso de VBA. Aún así, es fácil su implementación y podremos hacerla en no más de cuatro líneas y media.
Imaginemos que tenemos un formulario llamada "frmEjemplo" y dentro de este formulario tenemos un control, por ejemplo un label (etiqueta), llamado "lblCentrado", que es el control que queremos que se centre automáticamente en el formulario indistintamente de el tamaño de éste último. Con este código, además, lograremos que el control se coloque automáticamente en el centro del formulario aunque  lo re-dimensionemos.
Para empezar el código lo introduciremos directamente en el formulario. Para ello, abrimos el formulario en vista diseño. Después, teniendo seleccionado el formulario, en la ventana Propiedades, entramos en la pestaña Eventos. Nos situamos en cualquiera de ellos que esté vacío y clicamos sobre el botón con tres puntos suspensivos que nos aparece al lado. En el cuadro que nos salta, seleccionamos Generador de código y clicamos en Aceptar. Automáticamente, apareceremos en el editor de VBA dentro del formulario en cuestión. Al final del todo agregamos el siguiente código:

Private Sub Form_Resize()
  Me.lblCentrado.Top=Me.WindowHeight/2
  Me.lblCentrado.Left=Me.WindowWidth/2
End Sub

El código se ejecuta para el evento Resize. Este evento tiene lugar cundo se inicia el formulario y cuando éste es re-dimensionado. Podéis observar como no aparece el nombre del formulario frmEjemplo por ningún lado. Hacemos referencia a él mediante el comando Me. Dentro de la macro tenemos únicamente dos líneas de código.
La primera línea establece la propiedad Top del control lblCentrado. La propiedad Top indica la posición de la esquina superior izquierda del control respecto el borde superior del formulario. Para que quede centrado utilizamos la propiedad del formulario WindowHeight, que nos indica la altura total del formulario. Para situar el control en el centro, fijamos la propiedad Top del control con un valor igual a la mitad de la altura del formulario, es decir, la mitad de WindowHeight.
La segunda línea establece la propiedad Left del control lblCentrado. La propiedad Left indica la posición de la esquina superior izquierda del control respecto el borde izquierdo del formulario. Para que quede centrado utilizamos la propiedad del formulario WindowWidth, que nos indica la anchura total del formulario. Para situar el control en el centro, fijamos la propiedad Left del control con un valor igual a la mitad de la anchura del formulario, es decir, la mitad de WindowWidth.

Si introducimos este código el control quedará cerca del centro del formulario, pero no exactamente en el centro. Eso es debido a que las propiedades Top y Left toman como referencia la esquina superior izquierda del control para situarlo en el formulario. Para corregir esto, haremos que la propiedad Top tome el mismo valor que antes, pero quitándole la mitad de lo que mide de altura el el control. Para corregir la parte del Left, hacemos que tome el mismo valor que antes, pero quitándole la mitad de la anchura del control. El código quedaría de la siguiente manera:

Private Sub Form_Resize()
  Me.lblcentrado.Top=Me.WindowHeight/2-Me.lblcentrado.Height/2
  Me.lblcentrado.Left=Me.WindowWidth/2-Me.lblcentrado.Width/2
End Sub

Pero si introducimos este código, puede darse el caso en que reduzcamos tanto la ventana que Me.WindowHeight sea más pequeño de Me.lblCentrado.Height y la propiedad Top tome valores negativos. Esto no ocasionará un error en la ejecución del código (lo mismo para la propiedad Left). Para solventar esto, debemos controlar la ejecución del código con un If de tal manera que, si el formulario toma un tamaño que ocasiona valores negativos para las propiedades Top y Left, el código no sea ejecutado. En el caso extremo, el código quedaría finalmente de la siguiente manera:


Private Sub Form_Resize()
  If Me.WindowHeight/2-Me.lblcentrado.Height/2>=0 Then
    Me.lblcentrado.Top=Me.WindowHeight/2-Me.lblcentrado.Height/2
  End If

  If Me.WindowWidth/2-Me.lblcentrado.Width/2>=0 Then
    Me.lblcentrado.Left=Me.WindowWidth/2-Me.lblcentrado.Width/2
  End If
End Sub

De esta manera logramos tener un control situado justo en el centro de un formulario de Access. Ahora solo se debe adaptar el código a las necesidades particulares de cada uno.

1 comentario: