Determinar ubicación de Textbox dentro de Frame

Tengo un problema ubicando con código un Textbox que está dentro de un Frame.

Estoy insertando un userform calendario dentro de otro userform, en el código que tengo hace que tome left y top del textbox, lo cual hace que funcione perfecto salvo que en donde quiero usarlo está dentro de un frame. Pongo imágenes:

Código con el que determina la ubicación del textbox y lo dicta al calendario.

Los dos primeros ejemplos, no se encuentran dentro de un frame y funcionan bien. 

Como ven, dando clic en el commandbutton1, despliega el calendario debajo del textbox1 como se debe. Pero dando clic en el commandbutton1 para que despliegue el calendario debajo del textbox3 que se encuentra dentro de un frame no funciona.

Sale de mis conocimientos lo que tengo que poner para que el left y top que está determinando mediante la ubicación del textbox, la ponga dentro del frame1 y no sólo dentro del userform1

algo así como:

Private Sub CommandButton1_Click()
banderaCalendario = 2
    Call LanzarCalendario(Me, "TextBox1")
End Sub
Private Sub CommandButton2_Click()
banderaCalendario = 3
    Call LanzarCalendario(Me, "TextBox2")
End Sub
Private Sub CommandButton3_Click()
banderaCalendario = 5
    Call LanzarCalendario(Me.Frame1, "TextBox3")
End Sub

Es decir poner "Call LanzarCalendario(Me.Frame1, "Textbox3")

1 respuesta

Respuesta
3

Podemos agregar el frame como parámetro Opcional en la función:

Public Function lanzarcalendario(cualquierformulario As Object, xtextbox As String, Optional xframe As Object)

Entonces en la función tomaríamos ese parámetro para encontrar las longitudes (left y top)

    If Not xframe Is Nothing Then
        xframeleft = xframe.Left
        xframetop = xframe.Top + 5
    End If

El código quedaría así, en el caso del command1 y 2 no es necesario enviar el frame, para el commad3, envías el frame, de esa forma podemos obtener la izquierda y la altura del frame y por ende la izquierda y la altura del textbox3. Al final se tiene que sumar el top del form, el top del frame, el top del textbox, la altura del textbox y mas 25.

Private Sub CommandButton1_Click()
    Call lanzarcalendario(Me, "TextBox1")
End Sub
'
Private Sub CommandButton2_Click()
    Call lanzarcalendario(Me, "TextBox2")
End Sub
'
Private Sub CommandButton3_Click()
    Call lanzarcalendario(Me, "TextBox3", Me.Frame1)
End Sub
'
Public Function lanzarcalendario(cualquierformulario As Object, xtextbox As String, Optional xframe As Object)
    Dim xctrl As Control
    Load frmCalendario
    If Not xframe Is Nothing Then
        xframeleft = xframe.Left
        xframetop = xframe.Top + 5
    End If
    For Each xctrl In cualquierformulario.Controls
        If xctrl.Name = xtextbox Then
            frmCalendario.StartUpPosition = 0
            frmCalendario.Left = cualquierformulario.Left + xctrl.Left + xframeleft + 5
            frmCalendario.Top = cualquierformulario.Top + xctrl.Top + xctrl.Height + xframetop + 25
        End If
    Next
    frmCalendario.Show
End Function

'S aludos. Dante Amor. Recuerda valorar la respuesta. G racias

Dante, como siempre excelente, muchísimas gracias por compartir tu conocimiento, te agradezco mucho.

Era después, yo lo estaba poniendo antes.

Sería mucho abusar de ti ampliando la pregunta? En caso de que esté dentro de 2 frames? Es decir el textbox esté dento de un frame que está dentro de otro frame?

De nuevo muchas gracias.

Agrega otro parámetro Opcional a la función:

Private Sub CommandButton1_Click()
    Call lanzarcalendario(Me, "TextBox1")
End Sub
'
Private Sub CommandButton2_Click()
    Call lanzarcalendario(Me, "TextBox2")
End Sub
'
Private Sub CommandButton3_Click()
    Call lanzarcalendario(Me, "TextBox3", Me.Frame1)
End Sub
'
Private Sub CommandButton4_Click()
    Call lanzarcalendario(Me, "TextBox3", Me.Frame1, Me.Frame2)
End Sub
'
Public Function lanzarcalendario(cualquierformulario As Object, xtextbox As String, _
            Optional xframe As Object, Optional xframe2 As Object)
    Dim xctrl As Control
    Load frmCalendario
    If Not xframe Is Nothing Then
        xframeleft = xframe.Left
        xframetop = xframe.Top + 5
    End If
    If Not xframe2 Is Nothing Then
        xframeleft2 = xframe2.Left
        xframetop2 = xframe2.Top '+ 5
    End If
    For Each xctrl In cualquierformulario.Controls
        If xctrl.Name = xtextbox Then
            frmCalendario.StartUpPosition = 0
            frmCalendario.Left = cualquierformulario.Left + xctrl.Left + xframeleft + xframeleft2 + 5
            frmCalendario.Top = cualquierformulario.Top + xctrl.Top + xctrl.Height + xframetop + xframetop2 + 25
        End If
    Next
    frmCalendario.Show
End Function

'S aludos. Dante Amor. Recuerda valorar la respuesta. G racias

¡Gracias! 

En verdad no tengo cómo agradecer tu ayuda Dante. 

Muchísimas gracias de nuevo.

Saludos!!!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas