Hola a todos. Necesitaría saber si existe alguna manera fácil o rápida
para poder esconder unos campos en un informe y mover otros para que ocupen
la posición de los escondidos.
Se que utilizando la propiedad Top los podría desplazar, pero si son
muchos, ¿como puedo hacerlo de manera que no tenga que ir uno por uno
cambiando el valor de su Top?.
Además, si tengo el siguiente ejemplo:
Campo1
Campo2
Campo3
Campo4
Campo5
y escondo el Campo2 y el Campo4, la posición del Campo3 debería subir
hasta ocupar la posición del Campo2 y el Campo5 debería subir hasta ocupar
la posición del Campo3. ¿Se entiende?
Muchas gracias por vuestra atención.
RESPONDE JUAN M. AFAN DE RIBERA
================================
suponiendo que los controles que necesitas esconder y mover se llamen todos
como el ejemplo que pones (campo1, campo2, etc) y que sean cuadros de texto,
podríamos poner este código en el evento Al dar formato de la sección donde
estén los controles (me imagino que en la sección detalle).
En prinicipio lo que hace es construir una matriz que albergará el nombre y
la propiedad Top de todos los controles que cumplan las características que
tú le digas (tipo cuadro de texto y que empiecen por la palabra "campo", por
ejemplo). Después, en un segundo bucle se asigna la propiedad Top almacenada
en la matriz sólo a los controles que cumplan las condiciones, y a los otros
se les hace invisibles. Por ejemplo:
Private Sub Detalle_Format(Cancel As Integer, FormatCount As Integer)
Dim controlesInforme()
Dim numControles As Integer
Dim i As Integer, cnt As Integer
Dim ctl As Control
Static numFormatos As Integer
'comprobamos que sólo se haga una vez
If numFormatos = 0 Then
'construimos matriz con nombres y propiedad top
'de los controles necesitados
For Each ctl In Me.Controls
If ctl.ControlType = acTextBox And Left(ctl.Name, 5) = "campo" Then
ReDim Preserve controlesInforme(1, i)
controlesInforme(0, i) = ctl.Name
controlesInforme(1, i) = ctl.Top
i = i + 1
End If
Next
numControles = i - 1
For i = 0 To numControles
Set ctl = Me.Controls(controlesInforme(0, i))
'si el valor no es el que se quiere mostrar...
If ctl.Value = "x" Then
'hacemos el control invisible
'pero no rotamos el contador de la matriz
ctl.Visible = False
Else
'si el valor es correcto se le asigna
'la siguiente propiedad Top de la matriz
ctl.Top = controlesInforme(1, cnt)
'y avanzamos el contador de la matriz
cnt = cnt + 1
End If
Set ctl = Nothing
Next
numFormatos = 1
End If
End Sub
A ver si esta vez te sirve. Si tienes dudas coméntalas.
--
Saludos desde Barcelona
Juan M. Afan de Ribera
[MVP - Ms Access
               (
geocities.com/es/ensolva/Descargas)                   (
geocities.com/es/ensolva)                   (
geocities.com/es)