Visual Basic Foro
Programación => Visual Basic 6 => Mensaje iniciado por: pedroesca 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:
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:
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 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.
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.
-
bueno ya havia echo algo pero seba puso la respuesta hay que hacerlo con la collecion y no con matriz
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
-
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 !!
-
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