Hacer referencia a controles de multipage, page o frame

11/11/2006 - 04:32 por Ivan | Informe spam
Hola a todos

¿sabeis si existe alguna forma de hacer referencia a los controles
concretos contenidos en un multipagina, pagina y/o frame?

hasta ahora consgo listar todos los controles del formulario (incluso
los 'page', aunque los catalogue -con TypeName - como multipage), pero
no consigo que me de los contenidos en una pagina concreta ( aunque con
el frame y el mutipage no lo he probado, supongo que ocurrira lo
mismo).

he usado la prop. tag para crear una especie de indice y asi me apaño,
pero no se si habra algo mas sencillo

si podeis echarme una mano, oss lo agradezco

un saludo y hasta pronto
Ivan

Preguntas similare

Leer las respuestas

#11 Ivan
02/12/2006 - 04:30 | Informe spam
hola de nuevo Vinchenzo (y resto de 'aforados')

lo primero decirte que tu formulario, en si mismo, es una maravilla (y,
en mi opinion, una practica herramienta para quien quiera trabajar, o
al menos aprender, sobre formularios), pero si le añadimos tus
comentarios en el codigo, se convierte en un verdadero manual para
avanzar mas rapido por estos 'sembraos' del VBA.

aunque ando con muy poquito tiempo, lo he imprimido y ya esta casi
ilegible, a base de subrallados, notas, etc.. De momento me estoy
centrando en utilizarlo para intentar aprender algo sobre colecciones y
matrices (con ambas estoy totalmente 'pez'), asi como sobre 'giros
sintacticos', uso de 'elementos' hasta ahora desconocidos para mi y
'estructuracion' de los codigos.

En cuanto al TreeView, de momento, y aunque me he bajado sus
propiedades y metodos de MSDN, aun no le he intentado meter mano. (por
cierto, por lo que creo entender, se trata de un contenedor de objetos.
O sea que se almacenan como tales, pudiendo acceder a sus propiedades,
metodos, etc, directamente. ¿o estoy equivocado?.

bueno, aunque me han surgido infinidad de (seguramente productivas)
dudas -¿Begin?, objPtr,., y muchas mas-, creo que el resolverlas
es cuestion de ir poco a poco, y, como suele decir HM (+o-) , avanzar
al ritmo que uno mismo puede, quiere, le interesa, necesita,...,
sabiendo que siempre hay gente 'ahi' para recurrir cuando uno se atora
en el camino

dicha mi horterada de turno, te comento que estoy intentando ordenar
los controles por orden del Tabindex o Index en su caso. Al llegar a
un objeto contenedor, irian sus respectivos 'contenidos' tambien
ordenados, retomando el orden correspondiente al Parent al acabarse
estos. En realidad se trata de un puro ejercicio, para practicar con
cosas nuevas. Pero ahora me he 'atorado' en un intento de funcion
recursiva, en la que seguramente estoy haciendo mas de una cosa mal.

para las practicas estoy usando un formulario con varios multipage
anidados, ademas de otros muchos controles. De momento he conseguido
'recoger' ordenados los contenidos en un multipage(y sus tres paginas)
tras avanzar a traves de otro y su pagina correspondiente., pero no
consigo salir de el e ir a la siguiente pagina del multipagina
contenedor.

expongo los codigos que intervienen, aunque son varios y quzas ocupen
mucho. De todas formas, como te digo, es solo por practicar, o sea que
no tengas (tengais) ninguna prisa ni compromiso por responder. El
principal motivo de este mensaje era confirmarte que habia probado tu
archivo, y que me esta viniendo muy bien. Muchas gracias de nuevo.

Un saludo y hasta protnto.
Ivan

'********************************************************************************
'la intencion es que devuelva todos los controles y/o objetos
contenidos
'en otro por orden de sus sucesivos TabIndex o Index
'funciona pero no acaba
'
Function Siguiente(ByVal oActual As Object, _
Optional ByVal PrimerPadre As Object) As Object
If IsMissing(PrimerPadre) Then Set PrimerPadre = oActual.Parent
Dim Ti As Long, TtObjs As Long, TtPags As Long
If nroCtlsYPagsEn(oActual) > 0 Then
Set Siguiente = SiguienteHijo(oActual): Exit Function
Else
If TypeName(oActual) = "Page" Then
Ti = oActual.Index: TtObjs = oActual.Parent.Pages.Count - 1
Else
Ti = oActual.TabIndex
TtObjs = nroObjsHijo(oActual.Parent) - 1
End If
If Ti < TtObjs Then
Set Siguiente = SiguienteHijo(oActual.Parent, Ti)
Exit Function
Else
If oActual.Parent Is PrimerPadre Then Exit Function
If TypeName(oActual.Parent) = "Page" Then
Ti = oActual.Parent.Index: TtObjs oActual.Parent.Parent.Pages.Count - 1
Else
Ti = oActual.Parent.TabIndex
TtObjs = nroObjsHijo(oActual.Parent.Parent) - 1
End If
If Ti < TtObjs Then
Set Siguiente = SiguienteHijo(oActual.Parent.Parent,
Ti)
Else
If oActual.Parent.Parent Is PrimerPadre Then Exit
Function
Set Siguiente = Siguiente(oActual.Parent.Parent)
End If
End If
End If
End Function
'*******************'SiguienteHijo'*****29/11/2006 20:26:22
************
'devuelve el siguiente objeto hijo de un objeto contenedor pasando como
'argumentos el objeto padre y el ultimo TabIndex(para un padre Control
'o Page), o el ultimo Index(para un padre MultiPage). Si el numero
pasado
'es igual o mayor que la cantidad de objetos contenidos devueve
Nothing.
'Si el objeto no contiene hijos devuelve Nothing. El 2º argumento es _
'opcional, si no se incluye se devuelve el 1er hijo del objeto padre.
'--
Function SiguienteHijo(ByVal oPadre As Object, _
Optional ByVal lTi) As Object
If IsMissing(lTi) Then lTi = -1
Dim oHijo As Object
If TypeName(oPadre) = "MultiPage" Then
If lTi < oPadre.Pages.Count - 1 Then
Set SiguienteHijo = oPadre(lTi + 1): Exit Function
End If
Else
On Error Resume Next
If oPadre.Controls.Count = 0 Then Exit Function
If lTi = oPadre.Controls.Count - 1 Then Exit Function
For Each oHijo In oPadre.Controls
If oHijo.Parent Is oPadre And oHijo.TabIndex = lTi + 1 Then
Set SiguienteHijo = oHijo: Exit Function
End If
Next
End If
End Function
'**********<26-11-06>*********************************************
'devuelve el Nº TOTAL de CONTROLES + Nº De PAGINAS en
'un objeto si alguno de los controles es un "MultiPage"
'
Function nroCtlsYPagsEn(ByVal objCt As Object) As Long
Dim ctlOb As Control, ctlPg As Page, np As Long
nroCtlsYPagsEn = 0
If TypeName(objCt) = "MultiPage" Then
nroCtlsYPagsEn = nroCtlsYPagsEn + objCt.Pages.Count
For np = 0 To objCt.Pages.Count - 1
nroCtlsYPagsEn = nroCtlsYPagsEn + objCt(np).Controls.Count
For Each ctlOb In objCt(np).Controls
If TypeName(ctlOb) = "MultiPage" Then _
nroCtlsYPagsEn = nroCtlsYPagsEn + ctlOb.Pages.Count
Next
Next
Else
If nroCtlsEn(objCt) > 0 Then
nroCtlsYPagsEn = nroCtlsYPagsEn + objCt.Controls.Count
For Each ctlOb In objCt.Controls
If TypeName(ctlOb) = "MultiPage" Then _
nroCtlsYPagsEn = nroCtlsYPagsEn + ctlOb.Pages.Count
Next
End If
End If
End Function

''***********'nroObjsHijo'****<26-11-06>**************************
''devuelve el Nº de OBJETOS HIJO de un objeto (CON pages)
''-
Function nroObjsHijo(ByVal objCt As Object) As Long
Dim ctI As Control
nroObjsHijo = 0
If TypeName(objCt) <> "MultiPage" Then
If EsFormulario(objCt.Name) Or TypeName(objCt) = "Frame" _
Or TypeName(objCt) = "Page" Then
For Each ctI In objCt.Controls
If ctI.Parent Is objCt Then nroObjsHijo = nroObjsHijo + 1
Next
End If
Else
nroObjsHijo = objCt.Pages.Count
End If
End Function
Respuesta Responder a este mensaje
#12 Ivan
04/12/2006 - 00:56 | Informe spam
hola de nuevo

lo primero comentar que la funcion que en el anterior mensaje
'pretendia llegar a recursiva' mas bien iba para obsesiva' (como su
hacedor) y retorcida. De momento he conseguido dejarla como se ve al
final.

bueno, creo que ya lo he conseguido, (aunque ha sido segun escribia
este mensaje (que en realidad era para consultar una (pen)ultima duda
que me estaba atascando, y que he visto segun escribia la consulta)).
Seguramente es una chapuza innecesaria, pero no ha sido mal ejercicio.
Ahora intentare aplicarlo al TreeView.

Por si quieres/quereis comentar algo expongo los codigos finales (+o-)
. Muchas gracias de nuevo y hasta pronto
Ivan

'*******intento de funcion recursiva****03/12/2006 23:45:11 *****
'para volver al 1er 'siguiente' control/pagina cuando se llega
'al ultimo objeto ( por orden de TabIndex o Index) de un 'contenedor'
'-
Function AnteriorSig(ByRef oSubir As Object, _
ByVal oPadreInicio As Object) As Object
Dim obX As Object
Dim Indice As Long, HijosEn As Long
Set obX = oSubir.Parent
If TypeName(obX) = "Page" Then
Indice = obX.Index: HijosEn = obX.Parent.Pages.Count - 1
Else
Indice = obX.TabIndex: HijosEn = nroObjsHijo(obX.Parent) - 1
End If
If obX Is oPadreInicio And Indice = HijosEn Then Exit Function
If Indice < HijosEn Then
Set AnteriorSig = SiguienteHijo(obX.Parent, Indice)
Else
Set AnteriorSig = AnteriorSig(obX, oPadreInicio)
End If
End Function
''***********'ObjetosHijoen'****<26-11-06>**************************
''devuelve el Nº de OBJETOS HIJO de un objeto
''-
Function ObjetosHijoEn(ByVal objCt As Object) As Long
Dim ctI As Control
ObjetosHijoEn = 0
If TypeName(objCt) <> "MultiPage" Then
If NroObjetosEn(objCt) > 0 Then
For Each ctI In objCt.Controls
If ctI.Parent Is objCt Then ObjetosHijoEn = ObjetosHijoEn + 1
Next
End If
Else
ObjetosHijoEn = objCt.Pages.Count
End If
End Function
'*************'NroObjetosEn'****<26-11-06>*******************
'devuelve el Nº total de CONTROLES en un objeto excepto
'si es un "MultiPage", en cuyo caso devuelve el Nº de PAGINAS
'
Function NroObjetosEn(ByVal objCt As Object) As Long
NroObjetosEn = 0
If TypeName(objCt) = "MultiPage" Then
NroObjetosEn = objCt.Pages.Count
Else
On Error Resume Next
NroObjetosEn = objCt.Controls.Count
On Error GoTo 0
End If
End Function
'**********<26-11-06>*********************************************
'devuelve el Nº TOTAL de CONTROLES + Nº De PAGINAS (si alguno _
'de los controles es un "MultiPage") en un objeto
'--
Function NroCtsYPgsEn(ByVal objCt As Object) As Long
Dim ctlOb As Control, ctlPg As Page, np As Long
NroCtsYPgsEn = 0
If TypeName(objCt) = "MultiPage" Then
NroCtsYPgsEn = NroCtsYPgsEn + objCt.Pages.Count
For np = 0 To objCt.Pages.Count - 1
NroCtsYPgsEn = NroCtsYPgsEn + objCt(np).Controls.Count
For Each ctlOb In objCt(np).Controls
If TypeName(ctlOb) = "MultiPage" Then _
NroCtsYPgsEn = NroCtsYPgsEn + ctlOb.Pages.Count
Next
Next
Else
If nroCtlsEn(objCt) > 0 Then
NroCtsYPgsEn = NroCtsYPgsEn + objCt.Controls.Count
For Each ctlOb In objCt.Controls
If TypeName(ctlOb) = "MultiPage" Then _
NroCtsYPgsEn = NroCtsYPgsEn + ctlOb.Pages.Count
Next
End If
End If
End Function
'*******************'SiguHijo'*****29/11/2006 20:26:22 ************
'devuelve el siguiente objeto hijo de un objeto contenedor pasando como
'argumentos el objeto padre y el ultimo TabIndex(para un padre Control
'o Page), o el ultimo Index(para un padre MultiPage). Si el numero
pasado
'es igual o mayor que la cantidad de objetos contenidos devueve
Nothing.
'Si el objeto no contiene hijos devuelve Nothing. El 2º argumento es _
'opcional, si no se incluye se devuelve el 1er hijo del objeto padre.
'--
Function SiguHijo(ByVal oPadre As Object, _
Optional ByVal lTi) As Object
If IsMissing(lTi) Then lTi = -1
Dim oHijo As Object
If TypeName(oPadre) = "MultiPage" Then
If lTi < oPadre.Pages.Count - 1 Then
Set SiguHijo = oPadre(lTi + 1): Exit Function
End If
Else
On Error Resume Next
If oPadre.Controls.Count = 0 Then Exit Function
For Each oHijo In oPadre.Controls
If oHijo.Parent Is oPadre And oHijo.TabIndex = lTi + 1 Then
Set SiguHijo = oHijo: Exit Function
End If
Next
End If
End Function
'
'Nota: los controles los he cargado en una hoja con otro codigo.
'Y me falta salvar el error cuando llega al ultimo objeto/control
'*******************Codigos para las pruebas*************************
'-
Sub Test_Recursiva_2(ByVal oObjForm As Object)
Dim ct As Object
Dim fil As Long, nTI As Long, fin As Long, Ttl As Long
Set ct = SiguHijo(oObjForm)
If TypeName(ct) = "Page" Then nTI = ct.Index Else _
nTI = ct.TabIndex
Ttl = ObjetosHijoEn(ct.Parent)
With Hoja2
.[a:g].Clear
.[a1:e1] = Array("Objeto/Control", "Posicion", _
"ObjetoPadre", "Tab/Index", "Tipo")
.[a2] = ct.Parent.Name: .[b2] = 0
.[a3:e3] = Array(ct.Name, 1, ct.Parent.Name, nTI, _
TypeName(ct))
fin = NroCtsYPgsEn(oObjForm) + 3
For fil = 4 To fin
If TypeName(ct) = "Page" Then nTI = ct.Index Else _
nTI = ct.TabIndex
Ttl = ObjetosHijoEn(ct.Parent)
If NroObjetosEn(ct) > 0 Then
Set ct = SiguHijo(ct)
If ct Is Nothing Then Set ct = AnteriorSig(ct, oObjForm)
Else
If nTI < Ttl - 1 Then Set ct = SiguHijo(ct.Parent, nTI) _
Else Set ct = AnteriorSig(ct, oObjForm)
End If
On Error Resume Next
If TypeName(ct) = "Page" Then nTI = ct.Index Else _
nTI = ct.TabIndex
.Range("a" & fil & ":e" & fil) = Array(ct.Name, fil - 2, _
ct.Parent.Name, nTI, TypeName(ct))
On Error GoTo 0
Next
.Columns.AutoFit
End With
Set ct = Nothing
End Sub
'********************************************************
Sub Test_Recursiva_1()
Call Test_Recursiva_2(frmMulti)
End Sub
'The
End--
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida