Controles creados dinamicamente

17/08/2004 - 22:44 por Edwin Monsalve | Informe spam
Hola,

Yo creo unos controles de forma dinamica a partir de una informacion que
tengo guardada en una base de datos, mi pregunta es la siguiente, como puedo
activar desde codigo este control si no se previamente que formulario lo
contiene.

Esto es, a grandes rasgos, lo que quiero hacer,

En el evento Load de un Formulario MDI

Dim frm as New Form1
dim Ctrl as Control

Leo la base de datos para saber cuantos formularios tengo guardados y
cuantos controles contiene.

frm.name=DReader1("NombreForm")
while DReader2.Read
ctrl.name=DReader2("NombreControl")
ctrl.position=dreader("PosicionControl")
frm.controls.add(ctrl)
End

Despues en un evento del formulario MDI, quisiera que dado el nombre del
control ("NombreControl") y sabiendo el nombre del formulario ("NombreForm")
activar dicho control sin necesidad de iterar por toda la coleccion
MDIChildren del formulario MDI y despues por toda la coleccion Control del
formulario para encontrarlo.

Preguntas similare

Leer las respuestas

#1 Leonardo Azpurua
17/08/2004 - 23:31 | Informe spam
"Edwin Monsalve" escribió en el mensaje
news:
Hola,

Yo creo unos controles de forma dinamica a partir de una informacion


que
tengo guardada en una base de datos, mi pregunta es la siguiente, como


puedo
activar desde codigo este control si no se previamente que formulario lo
contiene.

Esto es, a grandes rasgos, lo que quiero hacer,

En el evento Load de un Formulario MDI

Dim frm as New Form1
dim Ctrl as Control

Leo la base de datos para saber cuantos formularios tengo guardados y
cuantos controles contiene.

frm.name=DReader1("NombreForm")
while DReader2.Read
ctrl.name=DReader2("NombreControl")
ctrl.position=dreader("PosicionControl")
frm.controls.add(ctrl)
End

Despues en un evento del formulario MDI, quisiera que dado el nombre


del
control ("NombreControl") y sabiendo el nombre del formulario


("NombreForm")
activar dicho control sin necesidad de iterar por toda la coleccion
MDIChildren del formulario MDI y despues por toda la coleccion Control del
formulario para encontrarlo.



Hola.

Una opción es que a medida que creas los controles, vayas llenando una
colección paralela con el nombre del control y la forma que lo contiene
(podrías almacenar incluso una referencia a la forma), indexada por el
nombre del control.

Private Class itemControles
Public NombreControl As String
Public refForma As Form
Public Sub New(n As String, f As Form)
NombreControl = n
refForma = f
End Sub
End Class

Dim colControles As New Collection

frm.name=DReader1("NombreForm")
while DReader2.Read
ctrl.name=DReader2("NombreControl")
ctrl.position=dreader("PosicionControl")
frm.controls.add(ctrl)



colControles.Add New itemControles(ctrl.Name, frm), ctrl.Name <<<

End [While]



De esta manera te bastará con:

Try
colControles(strNombreControl).Activate
...

Salud!

Leonardo
Respuesta Responder a este mensaje
#2 Edwin Monsalve
18/08/2004 - 00:04 | Informe spam
Hola Leonardo,

Gracias por tu respuesta, pero tengo dos dudas, primero como referencio
al formulario donde esta el control? por que veo que almacenas en la
coleccion solo el nombre del control y una referencia al formulario el cual
no utilizas (o no colocas el codigo). La otra duda, puede llegar el caso que
la aplicacion puede llegar a tener unos 400 controles distribuiidos en
varios formularios, crear una coleccion aparte no causaria mucho consumo de
memoria?

"Leonardo Azpurua" <l e o n a r d o (arroba) m v p s (punto) o r g> escribió
en el mensaje news:%

"Edwin Monsalve" escribió en el mensaje
news:
> Hola,
>
> Yo creo unos controles de forma dinamica a partir de una informacion
que
> tengo guardada en una base de datos, mi pregunta es la siguiente, como
puedo
> activar desde codigo este control si no se previamente que formulario lo
> contiene.
>
> Esto es, a grandes rasgos, lo que quiero hacer,
>
> En el evento Load de un Formulario MDI
>
> Dim frm as New Form1
> dim Ctrl as Control
>
> Leo la base de datos para saber cuantos formularios tengo guardados


y
> cuantos controles contiene.
>
> frm.name=DReader1("NombreForm")
> while DReader2.Read
> ctrl.name=DReader2("NombreControl")
> ctrl.position=dreader("PosicionControl")
> frm.controls.add(ctrl)
> End
>
> Despues en un evento del formulario MDI, quisiera que dado el nombre
del
> control ("NombreControl") y sabiendo el nombre del formulario
("NombreForm")
> activar dicho control sin necesidad de iterar por toda la coleccion
> MDIChildren del formulario MDI y despues por toda la coleccion Control


del
> formulario para encontrarlo.

Hola.

Una opción es que a medida que creas los controles, vayas llenando una
colección paralela con el nombre del control y la forma que lo contiene
(podrías almacenar incluso una referencia a la forma), indexada por el
nombre del control.

Private Class itemControles
Public NombreControl As String
Public refForma As Form
Public Sub New(n As String, f As Form)
NombreControl = n
refForma = f
End Sub
End Class

Dim colControles As New Collection

> frm.name=DReader1("NombreForm")
> while DReader2.Read
> ctrl.name=DReader2("NombreControl")
> ctrl.position=dreader("PosicionControl")
> frm.controls.add(ctrl)

colControles.Add New itemControles(ctrl.Name, frm), ctrl.Name


<<<

> End [While]

De esta manera te bastará con:

Try
colControles(strNombreControl).Activate
...

Salud!

Leonardo


Respuesta Responder a este mensaje
#3 Leonardo Azpurua
18/08/2004 - 00:53 | Informe spam
"Edwin Monsalve" escribió en el mensaje
news:
Hola Leonardo,

Gracias por tu respuesta, pero tengo dos dudas, primero como


referencio
al formulario donde esta el control? por que veo que almacenas en la
coleccion solo el nombre del control y una referencia al formulario el


cual
no utilizas (o no colocas el codigo). La otra duda, puede llegar el caso


que
la aplicacion puede llegar a tener unos 400 controles distribuiidos en
varios formularios, crear una coleccion aparte no causaria mucho consumo


de
memoria?



Tienes razon. Debería ser

colControles(strNombreControl).refForma.Activate

Por otra parte, cada entrada de la colección puede tener unos 50 bytes, por
400 son apenas 2 KB. Eso es practicamente nada.

Salud!
Respuesta Responder a este mensaje
#4 Leonardo Azpurua
18/08/2004 - 03:45 | Informe spam
"Leonardo Azpurua" <l e o n a r d o (arroba) m v p s (punto) o r g> escribió
en el mensaje news:eNCw%
Tienes razon. Debería ser

colControles(strNombreControl).refForma.Activate

Por otra parte, cada entrada de la colección puede tener unos 50 bytes,


por
400 son apenas 2 KB. Eso es practicamente nada.

Salud!



Qué aritmética, la mía: 50 x 400 son 20.000, que sigue sin ser gran cosa,
pero tampoco es "practicamente nada".

Y las cadenas son unicode, de manera que la longitud podría ser mayor.

Pero aun con entradas de 200 bytes, por 400 entradas tienes 80.000 bytes
("redondeemos" a 80KB). Eso viene a ser algo así como el 0.5% de la memoria
física disponible en un equipo limitado despues de cargar el OS.

Una decisión que debe tomar el diseñador con frecuencia es el compromiso
entre espacio y velocidad. Tienes la opción de abrir una conexión con la BD,
buscar la fila cuyo NombreControl sea igual al que estas buscando, obtener
el nombre de la forma y acceder a ella por el nombre y activarla. Es
económica en recursos, pero lenta.

Probablemente lo más eficaz -tal vez tanto o mas que mi propuesta de las
colección- sea lo que no quieres hacer: recorrer las formas y sus controles
hasta encontrar el control buscado. La escritura es simple (no sé como se
refiere uno a las formas activas en VB.Net <:-) pero en VB6 eran
simplemente dos ciclos For Each anidados).

Con mi propuesta tienes un código sencillísimo, tanto al cargar la colección
como al buscar la forma o cuando quieres acceder a un control específico
(puedes reemplazar el nombre del control -que ya lo tienes como clave- por
la referencia del mismo: cosas como
colControles(strNombreControl).refControl.Text = "X"). Pero debes determinar
si hasta 80 KB de memoria RAM son un precio que estás dispuesto a pagar.

Normalmente, gracias a la paginación, podemos cometer muchísimas torpezas de
diseño y desaprovechar muchos recursos sin que se note una degradación de
rendimiento.

Pero son cuentas que debes sacar tu. Yo simplemente te propongo una
alternativa.

Salud!

Leonardo
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida