none
Referenciar Matriz de objeto fuera del form RRS feed

  • Pregunta

  • Hola a todos. Tengo unos formularios tipo encuestas que utilizan muchos optionbutton pero los tengo agrupados por matrices, para saber si el usuario ha validado alguno tengo multiples procedimientos como el siguiente:

    For Each ob In Me.obDni
            if ob.Value = true then

                   grupoValidado = true

                   exit for

            end if

     Next

    ¿Como puedo hacer este en un módulo con un procedimiento común para todos. Lo que necesito es saber como puede hacer una referencia de objeto a Me.ob1, 2, 3,....

    jueves, 20 de diciembre de 2012 15:46

Respuestas

  • Hola de nuevo. haciendo pruebas he conseguido resolver el problema. Lo cuelgo por si le sirve de ayuda a  alguien. Gracias de todas formas por tu interés.

    El procedimiento Público:

    Public Sub ValidaGrupoOB(mCaption As String, frm As Form, obName As String) 'E1_ErOb
    Dim botonValidado As Boolean
    Dim ob As Object
        On Local Error Resume Next
        botonValidado = False
        'For Each ob In Me.obDni
        For Each ob In Me.Controls(obName)
            If ob.Value = True Then
                botonValidado = True
                Exit For
            End If
        Next
    '
        If botonValidado = False Then
            MsgBox "No ha cumplimentado la opcion: " & mCaption _
                , vbCritical, "IMPOSIBLE CONTINUAR"
            'ob(0).SetFocus
            'ob(0).Value = False
            MiErr = "genero un error"
        End If
    End Sub

    y Para llamarlo desde un Form:

    Call ValidaGrupoOB(frDni.Caption, Me, "obgrupo1")

    obGrupo1, es el nombre de la colección.

    • Marcado como respuesta Sargento369 jueves, 20 de diciembre de 2012 17:31
    jueves, 20 de diciembre de 2012 17:31

Todas las respuestas

  • No lo tengo claro 100% pero puedes crear un procedimiento al cual pasas el nombre del formulario.

    En ese procedimiento, declaras un objeto tipo forms y lo seteas con el nombre que llega.

    De esa manera puedes recorrer los controles de cualquier form en un solo módulo

    Este ejemplo es de Microsoft Access; si no funciona es cuestion de pequeños  ajustes

    sub btnOpcion(nombrefrm)

    dim frm as form

    Set frm = Forms(nombrefrm)

    for each ....in frm

    end sub

    y lo llamas btnOpcion(me.name)

    jueves, 20 de diciembre de 2012 16:00
  • Garcias Guarracuco por responder, pero el problema realmente es como determinar la colección del control. Es decir, si un form tiene tres grupos de botones, consus correspondientes index (Boton1(con index 1 a 10) boton2 (con otros 5 elementos)....) y en otro formulario igual, y así sucesivamente, en el procedimiento externo como puedo saber el grupo que tengo que validar. Con la variable de objeto frm establezco el form concreto, pero que variable de objeto declara la colección o grupo que hay que validar?. Saludos
    jueves, 20 de diciembre de 2012 17:05
  • Hola de nuevo. haciendo pruebas he conseguido resolver el problema. Lo cuelgo por si le sirve de ayuda a  alguien. Gracias de todas formas por tu interés.

    El procedimiento Público:

    Public Sub ValidaGrupoOB(mCaption As String, frm As Form, obName As String) 'E1_ErOb
    Dim botonValidado As Boolean
    Dim ob As Object
        On Local Error Resume Next
        botonValidado = False
        'For Each ob In Me.obDni
        For Each ob In Me.Controls(obName)
            If ob.Value = True Then
                botonValidado = True
                Exit For
            End If
        Next
    '
        If botonValidado = False Then
            MsgBox "No ha cumplimentado la opcion: " & mCaption _
                , vbCritical, "IMPOSIBLE CONTINUAR"
            'ob(0).SetFocus
            'ob(0).Value = False
            MiErr = "genero un error"
        End If
    End Sub

    y Para llamarlo desde un Form:

    Call ValidaGrupoOB(frDni.Caption, Me, "obgrupo1")

    obGrupo1, es el nombre de la colección.

    • Marcado como respuesta Sargento369 jueves, 20 de diciembre de 2012 17:31
    jueves, 20 de diciembre de 2012 17:31
  • Cada control tiene su tipo;puedes recorrer los controles y si es del tipo que deseas, entra en el loop

    For Each ctl In Me.Controls
        If TypeOf ctl Is TextBox Then
            ctl.Text = Empty
            ctl.Enabled = False
            ctl.Locked = True
        End If
    Next

    También puedes usar el atributo Tag, para hacer campos obligatorios; con esta funcion se recorre los controles que tengan el tag="*" y si está vacío, notifica al usuario.

    Function obligatorios(formulario As Form) As Boolean
    Set frm = formulario
        For Each ctl In frm.Controls
            If TypeOf ctl Is TextBox And ctl.Tag = "*" Then
                If ctl.Text = "" Then
                    MsgBox "El campo " & ctl.Name & " es de caracter obligatorio.", vbCritical
                    frm.Controls(ctl.Name).SetFocus
                    obligatorios = False
                    Exit For
                End If
        End If
        obligatorios = True
        Next
    End Function

    • Editado guarracuco jueves, 20 de diciembre de 2012 18:17
    jueves, 20 de diciembre de 2012 18:15