none
Existe Alguna manera de hacer referencia a un objeto utilizando el nombre del objeto mediante una cadena (string)? RRS feed

  • Pregunta

  • Actualmente tengo un código que uso al momento de cargar el formulario. Lo que hace es verificar si la ruta guardada en setting existe o no. Si existe me coloca el nombre del archivo sin la extensión, y si no existe me coloca un nombre por defecto. Lo que quiero es no tener que repetir 10 veces este código ya que son muchos botones. Sí existiera una manera de hacer referencia a un objeto del form o del setting mediante un string y hacer fácilmente utilizar un for... next guiándome con el final de cada nombre del objeto que termina en un número. Saludos!

    If System.IO.File.Exists(My.Settings.rutaMacro1) Then
         Me.btnMacro1.Text = Mid(Dir(My.Settings.rutaMacro1, vbDirectory), 1, Len(Dir(My.Settings.rutaMacro1, vbDirectory)) - 5)
    Else
         Me.btnMacro1.Text = "[Macro1]"
    End If

    jueves, 16 de mayo de 2019 2:58

Respuestas

  • Sí, existe una forma de instanciar un objeto a partir de su nombre, usando System.Reflection. Pero no merece la pena usarlo para conseguir lo que quieres; hay una forma más sencilla:

    Simplemente haz un bucle que recorra la colección Controls del form. Por cada control examinas el Name a ver si es del tipo que quieres (por ejemplo ctl.StartsWith("btnMacro")) y si cumple el requisito le pasas ese control a tu subrutina. No hace falta en ningún momento usar un string para acceder.

    • Propuesto como respuesta Carlos_Ruiz_M jueves, 16 de mayo de 2019 14:33
    • Marcado como respuesta cerm88 jueves, 16 de mayo de 2019 16:20
    jueves, 16 de mayo de 2019 7:04
  • Perfecto! Eso fue lo que hice un bucle que pasara por todos los botones y ver cada condición de la siguiente manera:

    Private Sub FormDashboard_Load(sender As Object, e As EventArgs) Handles Me.Load
            For Each control As Control In Me.grpMacros.Controls
                If TypeOf control Is Button Then
                    Dim nameMacroSett As String = "rutaMacro" & NroMacro(control.Name)
                    If System.IO.File.Exists(My.Settings(nameMacroSett)) Then
                        control.Text = Mid(Dir(My.Settings(nameMacroSett), vbDirectory), 1, Len(Dir(My.Settings(nameMacroSett), vbDirectory)) - 5)
                    Else
                        control.Text = "[Macro" & NroMacro(control.Name) & "]"
                    End If
                End If
            Next
    End Sub

    Claro en mi caso debo obligatoriamente debo colocarle un número al botón que concuerde con la variable setting

    e identificar el número con una función:

    Private Function NroMacro(ByVal NameMacro As String) As String
            Dim l As Integer = NameMacro.Length
            NroMacro = Nothing
            For i As Integer = 1 To l
                If IsNumeric(NameMacro.Substring(l - i, 1)) Then
                    NroMacro = NameMacro.Substring(l - i, 1) & NroMacro
                End If
            Next
    End Function

    Saludos!

    • Marcado como respuesta cerm88 jueves, 16 de mayo de 2019 16:24
    jueves, 16 de mayo de 2019 16:23

Todas las respuestas

  • Sí, existe una forma de instanciar un objeto a partir de su nombre, usando System.Reflection. Pero no merece la pena usarlo para conseguir lo que quieres; hay una forma más sencilla:

    Simplemente haz un bucle que recorra la colección Controls del form. Por cada control examinas el Name a ver si es del tipo que quieres (por ejemplo ctl.StartsWith("btnMacro")) y si cumple el requisito le pasas ese control a tu subrutina. No hace falta en ningún momento usar un string para acceder.

    • Propuesto como respuesta Carlos_Ruiz_M jueves, 16 de mayo de 2019 14:33
    • Marcado como respuesta cerm88 jueves, 16 de mayo de 2019 16:20
    jueves, 16 de mayo de 2019 7:04
  • Perfecto! Eso fue lo que hice un bucle que pasara por todos los botones y ver cada condición de la siguiente manera:

    Private Sub FormDashboard_Load(sender As Object, e As EventArgs) Handles Me.Load
            For Each control As Control In Me.grpMacros.Controls
                If TypeOf control Is Button Then
                    Dim nameMacroSett As String = "rutaMacro" & NroMacro(control.Name)
                    If System.IO.File.Exists(My.Settings(nameMacroSett)) Then
                        control.Text = Mid(Dir(My.Settings(nameMacroSett), vbDirectory), 1, Len(Dir(My.Settings(nameMacroSett), vbDirectory)) - 5)
                    Else
                        control.Text = "[Macro" & NroMacro(control.Name) & "]"
                    End If
                End If
            Next
    End Sub

    Claro en mi caso debo obligatoriamente debo colocarle un número al botón que concuerde con la variable setting

    e identificar el número con una función:

    Private Function NroMacro(ByVal NameMacro As String) As String
            Dim l As Integer = NameMacro.Length
            NroMacro = Nothing
            For i As Integer = 1 To l
                If IsNumeric(NameMacro.Substring(l - i, 1)) Then
                    NroMacro = NameMacro.Substring(l - i, 1) & NroMacro
                End If
            Next
    End Function

    Saludos!

    • Marcado como respuesta cerm88 jueves, 16 de mayo de 2019 16:24
    jueves, 16 de mayo de 2019 16:23