Autor Tema: Eliminar controles en tiempo de ejecución  (Leído 4198 veces)

0 Usuarios y 1 Visitante están viendo este tema.

pedroesca

  • Megabyte
  • ***
  • Mensajes: 206
  • Reputación: +19/-0
  • "El conocimiento es libre"
    • Ver Perfil
Eliminar controles en tiempo de ejecución
« en: Julio 07, 2011, 09:45:09 pm »
Buenas y santas!!! resulta la siguiente situación: tengo un control (uc) y creo determinada cantidad en tiempo de ejecución y los acomodo en forma de lista, lo cual funciona a la perfección ya que no posee mucha ciencia que digamos; ahora bien, el problema es el siguiente: también tengo la posibilidad de "quitarlos" en dicho tiempo de ejecución mediante "Unload control", lo cual tampoco tiene mucha ciencia, pero al intentar acomodarlos nuevamente en forma de lista, me da error ("El elemento ... de la matriz de controles no existe").
Se que es cuestión de algoritmos, pero en este momento no me encuentro 100% lúcido y recurro al imperioso y desinteresado (?) auxilio ;)

El código con el cual elimino cada control es el siguiente:
Código: [Seleccionar]
Private Sub ucREC_CloseClick(Index As Integer)
On Error GoTo errHandler
    If Index = 0 Then ucREC(Index).Visible = False: Exit Sub
    Unload ucREC(Index): Me.resizeLabels: Exit Sub
errHandler:
    MsgBox Err.Number
End Sub

Y la rutina donde se produce el error ("ResizeLabels") es la siguiente:

Código: [Seleccionar]
Sub resizeLabels()
    For i = 1 To Me.ucREC().UBound
        ucREC(i).Top = ucREC(i - 1).Top + ucREC(i - 1).Height
    Next i
End Sub

"Si yo tengo una idea, tú otra, y la compartimos, ambos tendremos DOS ideas"

seba123neo

  • Terabyte
  • *****
  • Mensajes: 763
  • Reputación: +88/-5
    • Ver Perfil
Re:Eliminar controles en tiempo de ejecución
« Respuesta #1 en: Julio 07, 2011, 11:07:41 pm »
si es un quilombito chiquito esto de los controles, pero se soluciona como todo, hay que hacer unos chequeos simples con un For  Each...aca te dejo un ejemplo simple, pone un boton llamado Command1 en el form con Index = 0, ese sera el padre de la matriz y un boton llamado cmdAcomodar para acomodar automaticamente los controles, cuando haces click en un boton este se descarga.

Código: [Seleccionar]
Private Sub cmdAcomodar_Click()
    Call Acomodar
End Sub

Private Sub Command1_Click(Index As Integer)
    If Index = 0 Then Command1(0).Visible = False: Exit Sub
    Unload Command1(Index)
End Sub

Private Sub Acomodar()
    Dim vBoton As CommandButton
    Dim i As Integer
   
    For Each vBoton In Command1
        If vBoton.Index <> 0 Then
            vBoton.Left = 0
            vBoton.Top = i
           
            i = i + 1000
        End If
    Next
End Sub

Private Sub CargarControles()
    For i = 0 To 3
   
        If i > 0 Then Load Command1(i)
           
        Command1(i).Visible = True
        Command1(i).Left = 0
        Command1(i).Caption = "Boton " & i
        Command1(i).Top = i * 1000
    Next i
End Sub

Private Sub Form_Load()
    Call CargarControles
End Sub

saludos.

LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1128
  • Reputación: +151/-8
    • Ver Perfil
Re:Eliminar controles en tiempo de ejecución
« Respuesta #2 en: Julio 07, 2011, 11:18:04 pm »
bueno ya havia echo algo pero seba puso la respuesta hay que hacerlo con la collecion y no con matriz

Código: [Seleccionar]
Private Sub resizeLabels()
    Dim lTop As Long
    Dim oCtl As ucREC

    lTop = ucREC(0).Top + ucREC(0).Height

    For Each oCtl In ucREC()
        If oCtl.Index > 0 Then
            oCtl.Top = lTop
            lTop = lTop + oCtl.Height
        End If
    Next

End Sub

pedroesca

  • Megabyte
  • ***
  • Mensajes: 206
  • Reputación: +19/-0
  • "El conocimiento es libre"
    • Ver Perfil
Re:Eliminar controles en tiempo de ejecución
« Respuesta #3 en: Julio 07, 2011, 11:34:47 pm »
MIL GRACIAS A TODOS!!! ya funciona, solo que al principio me siguió dando error, pero modifiqué dimensionando la variable como "Control", es decir: "Dim oCtl As Control".
Saludos !!
"Si yo tengo una idea, tú otra, y la compartimos, ambos tendremos DOS ideas"

Bazooka

  • Terabyte
  • *****
  • Mensajes: 951
  • Reputación: +31/-20
  • El pibe Bazooka
    • Ver Perfil
    • Desof sistemas
Re:Eliminar controles en tiempo de ejecución
« Respuesta #4 en: Julio 08, 2011, 12:14:00 pm »
Mi pequeño aporte es que si vas a elimnar todos debes hacerlos de atras hacia adelante y así evitas ese error.
Recuerdo una vez haber liado con eso!

Exitos!

Mike
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.