mover controles entre paginas de un multipaginas

19/01/2007 - 19:32 por Ivan | Informe spam
hola a tosdos

¿como podria mover controles entre diferentes contenedores en tiempo
de ejecucion? pej: de una pagina a otra de un multipagina, o del propio
userform a una pagina concreta o a un frame.

no se si sera posible. El metodo move no parece incluir un argumento
para cambiar de contenedor, o al menos yo no lo veo

si sabeis de alguna forma os lo agradezco

un saludo y hasta pronto
Ivan

Preguntas similare

Leer las respuestas

#6 Ivan
20/01/2007 - 23:45 | Informe spam
hola Daniel

el archivo como tal actualmente no existe, se trata de un libro de
pruebas y repruebas bastante caotico

dependiendo de lo que entiendas por mover controles (sobre todo de
donde a donde) te podria preparar un ejemplo de lo que yo he conseguido
hasta ahora, aunque me temo que mi nivel es bastante bajo y hay mucha
gente por estos lares que tiene bastante mas capacidad para echarte una
mano.

de todas formas te pongo un ejemplo para mover controles dentro de su
contenedor (Parent) -> pej. una posibilidad seria utilizando unos
spinbutton (o scrollbars) asociados a las propiedades Top y/o Left del
control. Una sencilla prueba podria ser->

en un formulario nuevo pon un Label ( Label1 ) y dos spinbutton (
Spinbutton1 y 2 ) puedes poner uno vertical y otro horizontal para que
sea mas claro. Pega los siguientes codigos en el modulo de el
formulario, ejecutalo y echa un vistazo

Private Sub SpinButton1_Change()
With Label1
.Left = SpinButton1.Value
.Caption = "TOP = " & .Top & " ; LEFT = " & .Left
End With
End Sub
Private Sub SpinButton2_Change()
With Label1
.Top = SpinButton2.Value
.Caption = "TOP = " & .Top & " ; LEFT = " & .Left
End With
End Sub
Private Sub UserForm_Activate()
With Label1
.Caption = "TOP = " & .Top & " ; LEFT = " & .Left
End With
With SpinButton1
.Min = 0: .Max = Me.Width - Label1.Width
.Value = Label1.Left
End With
With SpinButton2
.Min = 0: .Max = Me.Height - Label1.Height
.Value = Label1.Top
End With
End Sub

a partir de aqui ya depende de que es lo que buscas. Pej: puedes cargar
los nombres de los controles que quieras permitir mover en un listbox
(pej) y que el seleccionado en este sea el que se pueda mover

y si se trata de 'otro tipo de movimientos' (y en mi caso)->

Pej. para moverlos entre paginas de un multipage, supongo que ya habras
leido la consulta, y entre formularios yo lo he descartado de momento,
optando por crear los controles sobre la marcha y almacenar en una hoja
las propiedades que me interese restablecer la proxima vez que se
ejecute el formulario (pero mi caso es muy concreto).

bueno estas son algunas de las posibilidades (entre otras muchas) que
se me ocurren. Sin tener datos mas concretos de lo que buscas, no
sabria muy bien lo que decirte / enviarte. Si quieres comentas mas
detalles

un saludo y hasta pronto
Ivan
Respuesta Responder a este mensaje
#7 daniel
21/01/2007 - 18:32 | Informe spam
hola Ivan muchas gracias por responder

lo que yo necesitaria es que si se pueden poner de la siguiente forma:
userform1 hay (1frame en el cual hay 5 CommandButton)
userform2 si se puede que el usuario elija los CommandButton que quiere y la
posicion en la que aparezcan que aparezca en el frame del userform1.

tambien si se puede mover el frame pinchando en el y desplazandolo como si
fuera una barra de herramientas.

espero haber me esplicado bien cualquier duda comentas
un saludo y muchas gracias
"Ivan" escribió en el mensaje
news:
hola Daniel

el archivo como tal actualmente no existe, se trata de un libro de
pruebas y repruebas bastante caotico

dependiendo de lo que entiendas por mover controles (sobre todo de
donde a donde) te podria preparar un ejemplo de lo que yo he conseguido
hasta ahora, aunque me temo que mi nivel es bastante bajo y hay mucha
gente por estos lares que tiene bastante mas capacidad para echarte una
mano.

de todas formas te pongo un ejemplo para mover controles dentro de su
contenedor (Parent) -> pej. una posibilidad seria utilizando unos
spinbutton (o scrollbars) asociados a las propiedades Top y/o Left del
control. Una sencilla prueba podria ser->

en un formulario nuevo pon un Label ( Label1 ) y dos spinbutton (
Spinbutton1 y 2 ) puedes poner uno vertical y otro horizontal para que
sea mas claro. Pega los siguientes codigos en el modulo de el
formulario, ejecutalo y echa un vistazo

Private Sub SpinButton1_Change()
With Label1
.Left = SpinButton1.Value
.Caption = "TOP = " & .Top & " ; LEFT = " & .Left
End With
End Sub
Private Sub SpinButton2_Change()
With Label1
.Top = SpinButton2.Value
.Caption = "TOP = " & .Top & " ; LEFT = " & .Left
End With
End Sub
Private Sub UserForm_Activate()
With Label1
.Caption = "TOP = " & .Top & " ; LEFT = " & .Left
End With
With SpinButton1
.Min = 0: .Max = Me.Width - Label1.Width
.Value = Label1.Left
End With
With SpinButton2
.Min = 0: .Max = Me.Height - Label1.Height
.Value = Label1.Top
End With
End Sub

a partir de aqui ya depende de que es lo que buscas. Pej: puedes cargar
los nombres de los controles que quieras permitir mover en un listbox
(pej) y que el seleccionado en este sea el que se pueda mover

y si se trata de 'otro tipo de movimientos' (y en mi caso)->

Pej. para moverlos entre paginas de un multipage, supongo que ya habras
leido la consulta, y entre formularios yo lo he descartado de momento,
optando por crear los controles sobre la marcha y almacenar en una hoja
las propiedades que me interese restablecer la proxima vez que se
ejecute el formulario (pero mi caso es muy concreto).

bueno estas son algunas de las posibilidades (entre otras muchas) que
se me ocurren. Sin tener datos mas concretos de lo que buscas, no
sabria muy bien lo que decirte / enviarte. Si quieres comentas mas
detalles

un saludo y hasta pronto
Ivan

Respuesta Responder a este mensaje
#8 Ivan
22/01/2007 - 04:38 | Informe spam
hola Daniel (te aviso que es un rollazo, y no se si se me entendera. Al
final van unos codigos de prueba)

lo que yo necesitaria es que si se pueden poner de la siguiente forma:
userform1 hay (1frame en el cual hay 5 CommandButton)
userform2 si se puede que el usuario elija los CommandButton que quiere y la
posicion en la que aparezcan que aparezca en el frame del userform1



por lo que comentas, estas buscando mas o menos lo mismo que yo.

Aunque me imagino que ya has leido este hilo desde el principio,
permiteme que lo vaya citando para exponerte lo que he pensado puede
ser una solucion ( como te comento, yo tambien estoy 'buscando' la
forma de hacerlo).

basicamente lo que estoy intentando es lo siguiente:

desde un formulario (vamos a llamarle pej: ' frmDiseñador ' ) cuya
funcion seria exclusivamente la de diseñar/ndicar la posicion y
tamaño de los controles contenidos en un contenedor, y/o modficar el
caption en los casos necesarios/posibles (Labels, pej ), que a su vez
esta contenido en otro/s formulario/s. (a este le llamamos pej.:
frmModificado)

Este contenedor, en mi caso, se trataba inicialmente de un Multipage, y
seria el equivalente a tu Frame. En el estarian contenidos (ocultos )
todos los controles que deseo permitir que el usuario pueda manipular,
y, si lo desea, distribuir a lo largo de varias Pages para hacerlo mas
claro (en total se trata de mas de 50 controles, incluyendo los
labels). El tratar de mover los controles entre pages se debia a evitar
tener que multiplicar el nº de controles por el nº de paginas (3 en
este caso) para tenerlos disponibles para todas ellas.

Aqui vendria a cuento la 1ª respuesta de HM , que aunque en tu caso,
al ser un frame, no seria (creo) imprescindible, quizas tampoco
sobraria->

Mensaje nº2 (respuesta de Hector Miguel)

si requieres 'andar moviendo' controles de un contenedor a otro [p.e. en controles multipage]...
prueba cambiando el tipo de control contenedor... de multipage... -> a un control 'TabStrip'
[funcionan y 'se ven' de manera similar, solo que 'comparten' los mismos controles] ;)
podrias administrar 'mejor' las propiedades de los controles 'contenidos' [visible, left, top, etc.]
[ademas de que ahorras 'significativamente' en el numero de controles del formulario]



y tras descartar la idea de mover los controles entre formularios,
entre otras cosas porque como Hector Miguel dixit->

Mensaje nº4 ->

"b) 'mover' controles... 'entre formularios'... y [ademas] 'conservar lo construido'... [uuhhmmmm !]


b.1) mover controles [y seguramente sus codigos asociados]
entre formularios ?...
-> [probablemente] saldria mas caro el caldo que las
albondigas [API's y demas 'chucherias'] :))

volviendo al hilo, en vez de mover los controles entre formularios, me
he decidido por tener los controles a modificar (de frmModificado) asi
como sus propiedades modificables, en forma de lista en una hoja de
excel (la podriamos llamar 'Controles'). Por ejemplo la lista podria
ser mas o menos asi: ->

estos 3 primeros campos serian bastante importantes (por no decir
obligados)(incluso quizas convenga incluir el Parent entre estos):

columna A-> Name ; columna B-> TypeName ; columna C-> Visible,

en el resto:

columnas D, E, .etc ->propiedades Top, Left, Heigth, Width,
Caption, y cualquier otra propiedad que queramos (y se pueda)
permitir manipular al usuario

para conseguir esta lista sin tener que escribir dato a dato, y una vez
creados los controles en frmModificado, podrias hacer algo parecido a
esto (suponiendo que tu frame se llama Frame1 y que en la 1ª fila de
la hoja Controles has puesto el nombre de las propiedades)

sub ListaControles()
dim ct as Control, fila as long
fila = 2
for each ct in frmModificado.Frame1.Controls
with Worksheets("Controles")
on error resume next '''necesario si vas a cargar propiedades
''' que no sean comunes a
todos los cts
.cells(fila, 1) = ct.name
.cells(fila, 2) = typename(ct)
.cells(fila, 3) = ct.visible
.cells(fila, 4) = ct.Top

asi con las propiedades que quieras
...
on error goto 0
fila=fila + 1
end with
next
end sub

una vez conseguida la lista, si quieres conservar sus valores como
predeterminados (o por si acaso), puedes copiarla a otra hoja o a un
rango posterior. Asi siempre podrias reasignar estos valores iniciales.

Pasamos a ver lo que podria contener el frmDiseñador

1º un contendor (recomendable tabstrip aunque el del frmModificado no
lo fuera) con las mismas medidas que el contenedor de destino (Frame1
en tu caso). Incluso, si queremos complicarnos la vida se puede hacer
ajustable o elegible de una lista (podria hacerse mas o menos igual que
lo que ya hemos visto en el Mensaje nº 7 para los controles de
destino, pej eligiendo previamente la opcion 'Ajustar contenedor' ,
mediante un chekbox, )

2º un Listbox (pej) en el que cargaremos al activarse el formulario,
los nombres de los controles a modificar. Aunque habria varias formas,
lo podemos hacer directamente de la hoja Controles mas o menos asi
(para el ej. anterior)->

with worksheets("Controles")
Listbox1.List = .range("a2:a" & .[a65536].end(xlup).row).value
end with

NOTA: si los nombres de los controles no son totalmente descriptivos de
cara al usuario, podrias incluir un campo con una accion o nombre
descriptivo de la funcion de cada control, bien manualmente bien (pej)
con la propiedad tag e incluyendola en el bucle. En este caso
cargariamos el listbox con este campo, para facilitar la comprension al
usuario.

3º para mover los controles y/o para ajustar su tamaño te valdria lo
dicho en el mensaje 7, añadiendo si quieres un texbox junto a cada
spinbutton que mostrara la posicion en cada momento y unos labels
descriptivos.

pej:-> 4 spinbutton + 4 textbox + 4 labels (pej Desplazar horzontal,
Desplazar vertical, Alto y Ancho

4º otros controles en funcion de las propiedades que quieras manipular

5º en funcion de tus intenciones: -> commandbutons para aplicar,
cancelar, etc los cambios

6 otras funciones como por ej. poner nombre a la vista personalizada

llegados aqui, estoy probando dos opciones :

opc 1 -> tener los controles ya cargados y ocultos en frmDiseñador ya
en tiempo de diseño

opc 2 -> añadirlos en tiempo de ejecucion (al seleccionarlos del
listbox.) mediante el metodo Add de la coleccion controls.

Para el ej. que expones creo que te iria mejor la 1ª, y es con la que
vamos a continuar

En cuanto al codigo, aunque basicamente se basaria en lo expuesto en
el 7º mensaje, habria que modificar varias cosillas:

1º) declarar varias variables a nivel de modulo del formulario. Ej:->

Dim nomCT as string, Ya as boolean, vert as single, horz as single,
fiCt as long

nomCt -> 'para asignarle el nombre del control que queramos manipular
Ya -> para impedir que se dispare el evento change de los spinbutton
hasta que no queramos
fiCt -> es el nº de fila en la hoja Controles del control seleccionado
en el listbox y se corresponde con el listindex de este + 2 >
fiCt = listbox1.listindex + 2

las siguientes son por si utilizas un tabstrip en el frmDiseñador para
simular el contenedor de destino, si no es asi no serian
imprescindibles

mSup y mIzqz-> el que se consideraria punto 0 para las propiedades Top
y Left del control, osea, los bordes superior e izquierdo del
contenedor,

*****

Bueno, disculpame, pero se me ha hecho tarde con tanta labia y tengo
que cortar aqui. Como mañana, y es posible que pasado, no tenga mucho
tiempo, aqui te pongo una dosis de codigo que he ido preparando sengun
escribia esto. Como requisitos-->

un formulario con ->

1.-un tabstrip llamado -> tabFichero, puedes dejarlo con una sola hoja
si quierse y le das las mismas medidas que a tu frame

2.- un listbox llamado -> listbox1

3.- cuatro spinbutton (en relidad en mi caso son scrollbars, pero daria
lo mismo, haz lo que quieras) llamados : -> scrTop, scrLeft, scrAncho y
scrAlto

4.- cuatro textbox llamados -> txtTop, txtLeft, txtAncho y txtAlto.
Puedes situar cada uno junto a su respectiva barra

5.- un commandbutton llamado cmdVerNoVer

si te animas a probarlo, recuerda que primero debes crear la lista en
la hoja controles

y por otra parte esta el procedimiento ' GuardarProps ' que
actualizaria las propiedades en la hoja (pej. con otro comand button)

luego en el formulario original (frmModificado) deberias incluir pej.
en activate un bucle por sus controles usando un procedimiento similar
a 'AsignarProps' pero quitando la suma de las variables msup y mizq.

en cualquier caso faltan cosas y puede que tambien sobren, pero quizas
te valga para ir viendo las posibilidades con las que yo me estoy
moviendo, y si te parece interesante comentar, dudas, mejoras que se te
ocurran, problemas, etc

disculpa por el volumen de este rollo, pero no sabria como explicarlo
si no.

un saludo y hasta pronto (en cuanto pueda lo retomo)
Ivan

PD: ojo a los posibles saltos de linea al enviar el mensaje

***********Los codigos, en el modulo del formuario****

Option Explicit
Dim mSup As Single, mInf As Single, mIzq As Single, mDch As Single
Dim nomCt As String, ya As Boolean, fiCt As Long

Private Sub cmdVerElegido_Click()
If ListBox1.ListIndex = -1 Then Exit Sub
Dim ct As Control
On Error Resume Next
Set ct = Me.Controls(nomCt)
Call VerNoVerCt(ct)
If ct.Visible = True Then _
AsignarProps (ct)
Call HabilitarScrs(ct.Visible)
Set ct = Nothing
On Error GoTo 0
With cmdVerElegido
If .Caption = "Ver elegido" Then _
.Caption = "Ocultar elegido" _
Else .Caption = "Ver elegido"
End With
End Sub

Private Sub ListBox1_Click()
Dim ct As Control
ya = False
With ListBox1
fiCt = .ListIndex + 2
nomCt = Trim(.Text)
End With
On Error Resume Next
Set ct = Me.Controls(nomCt)
With cmdVerElegido
If ct.Visible = True Then _
.Caption = "Ocultar elegido" _
Else .Caption = "Ver elegido"
End With
Call HabilitarScrs(ct.Visible)
ya = ct.Visible
Set ct = Nothing
On Error GoTo 0
End Sub

Private Function VerNoVerCt(ByRef ctl As Control) As Boolean
With ctl
.Visible = Not .Visible
VerNoVerCt = .Visible
End With
End Function

Private Sub VerCt(ByVal ver As Boolean)
Dim celda As Range
For Each celda In Worksheets("Controles").[a1:a77]
On Error Resume Next
Me.Controls(Trim(celda.Value)).Visible = ver
On Error GoTo 0
Next
End Sub

Private Sub AsignarProps(ByRef ctl As Control)
With Worksheets("Controles")
On Error Resume Next
ctl.Top = mSup + .Cells(fiCt, 4)
ctl.Left = mIzq + .Cells(fiCt, 5)
ctl.Width = .Cells(fiCt, 6)
ctl.Height = .Cells(fiCt, 7)
ctl.Caption = .Cells(fiCt, 8)
On Error GoTo 0
End With
End Sub

Private Sub GuardarProps()
Dim ctl As Control, nroCt As Long
For nroCt = 0 To ListBox1.ListCount - 1
On Error Resume Next
Set ctl = Me.Controls(Trim(ListBox1.List(nroCt)))
With Worksheets("Controles")
.Cells(nroCt + 2, 3) = ctl.Visible
.Cells(nroCt + 2, 4) = ctl.Top - mSup
.Cells(nroCt + 2, 5) = ctl.Left - mIzq
.Cells(nroCt + 2, 6) = ctl.Width
.Cells(nroCt + 2, 7) = ctl.Height
.Cells(nroCt + 2, 8) = ctl.Caption
End With
Set ctl = Nothing
On Error GoTo 0
End Sub

Private Sub scrAlto_Change()
' If ya = False Then Exit Sub
With scrAlto
txtAlto = .Value
Me.Controls(nomCt).Height = .Value
End With
End Sub

Private Sub scrAncho_Change()
' If ya = False Then Exit Sub
With scrAncho
txtAncho = .Value
Me.Controls(nomCt).Width = .Value
End With
End Sub

Private Sub scrLeft_Change()
' If ya = False Then Exit Sub
With scrLeft
txtLeft = .Value - mIzq
Me.Controls(nomCt).Left = .Value
End With
End Sub

Private Sub scrTop_Change()
' If ya = False Then Exit Sub
With scrTop
txtTop = .Value - mSup
Me.Controls(nomCt).Top = .Value
End With
End Sub

Private Sub HabilitarScrs(ByVal boMover As Boolean)
Dim ct As Control
scrTop.Enabled = boMover
scrLeft.Enabled = boMover
scrAlto.Enabled = boMover
scrAncho.Enabled = boMover
If boMover Then
On Error GoTo 0
Set ct = Me.Controls(nomCt)
With scrTop
.Min = mSup: .Max = mInf - ct.Height
.Value = ct.Top
End With
With scrLeft
.Min = mIzq: .Max = mDch - ct.Width
.Value = ct.Left
End With
With scrAlto
.Min = 1: .Max = tabFichero.ClientHeight
.Value = ct.Height
End With
With scrAncho
.Min = 1: .Max = tabFichero.ClientWidth
.Value = ct.Width
End With
Set ct = Nothing
On Error GoTo 0
End If
End Sub

''sin acabar, para actualizar cuando se escriba en los textbox
Private Sub txtTop_Change()
' scrTop.Value = CSng(txtTop)
End Sub

Private Sub UserForm_Activate()
ListBox1.List = Worksheets("Controles").Range("a1:a77").Value
mSup = tabFichero.Top + tabFichero.ClientTop
mIzq = tabFichero.Left + tabFichero.ClientLeft
mInf = mSup + tabFichero.ClientHeight
mDch = mIzq + tabFichero.ClientWidth
Call HabilitarScrs(False)
cmdVerElegido.Caption = "Ver elegido"
VerCt (False)
End Sub
Respuesta Responder a este mensaje
#9 Ivan
22/01/2007 - 11:19 | Informe spam
perdon, el commandbutton deberia llamarse -> cmdVerElegido en vez de
cmdVerNoVer

en cuanto a seleccionar con el puntero estoy tanteando con los eventos
mousDown, mousemove y mouseup y parece que puede salir algp, pero sin
controlarlo parece un pelin arriesgado. Se disparan eventos en cuanto
te descuidas

un saludo
Respuesta Responder a este mensaje
#10 daniel
22/01/2007 - 12:48 | Informe spam
hola Ivan muchas gracias por ayudarme

en cuanto pueda lo miro y te comento

un saludo
"Ivan" escribió en el mensaje
news:
perdon, el commandbutton deberia llamarse -> cmdVerElegido en vez de
cmdVerNoVer

en cuanto a seleccionar con el puntero estoy tanteando con los eventos
mousDown, mousemove y mouseup y parece que puede salir algp, pero sin
controlarlo parece un pelin arriesgado. Se disparan eventos en cuanto
te descuidas

un saludo

Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida