Pasar Un Control De Un Formulario A Otro Formulario


Objetivo: Pasar Un Control De Un Formulario A Otro Formulario
Buenas!.

Quiero pasar un control completo a otro formulario.
En este caso se trata de un Picturebox. Sé que el otro formulario se va a mostrar solamente una imagen.
Se podría haber hecho de otra forma si solo es pasar una imagen.

Ambos formularios están vacíos, los controles se crean en tiempo de ejecución.
El primer problema que me encontré fue instanciar el control en el formulario destino.
Ese control que se le pasa con una propiedad, ya tiene valores. No es nuevo.

Imaginar que no tiene por que ser un PictureBox, lo que queréis pasarle, conociendo los tipos de controle que quieres pasar.
Se instanciaría un tipo determinado.

Me gustaría saber si creéis que el código del formulario destino se puede mejorar.

Formulario origen:

Private dibujo As Picture
Private picejemplo As Picturebox
Private unformulario As FormDestino

Public Sub Form_Open()

dibujo = Picture["Gambas3.png"]

With Me
.Title = "Origen"
.Arrangement = Arrange.Vertical
.AutoResize = True
End With

picejemplo = New PictureBox(Me) As "manejador"
With picejemplo
.W = dibujo.W
.H = dibujo.H
.Picture = dibujo
End With

unformulario = New FormDestino
unformulario.objeto = picejemplo
unformulario.Show()

End


Formulario Destino:

Private $objeto As Object
Property objeto As Object

Public Sub Form_Open()

Dim opbox As PictureBox

With Me
.Title = "Destino"
.Arrangement = Arrange.Vertical
.AutoResize = True
End With

If Me.objeto Is PictureBox Then
opbox = New PictureBox(Me) As "manejador"
With opbox
.W = Me.objeto.w
.H = Me.objeto.h
.Picture = Me.objeto.Picture
End With
Endif

End

Private Function objeto_Read() As Object

Return $objeto

End

Private Sub objeto_Write(Value As Object)

$objeto = Value

End


Aquí tenéis el ejemplo.

Saludos

Objetivo: Re: Pasar Un Control De Un Formulario A Otro Formulario
Sin olvidar las posibilidades del procedimiento de instaciación _new del form2

en el form1:

dim f as form2

f=new form2(f, mipicturebox) 'le paso f (él mismo) porque gambas exige aquí el nombre del contenedor



En el form2

private pbox as picturebox
public sub _new(optional pictbox as picturebox)

pbox = pictbox

end

última edición por shordi el Viernes, 03 Febrero 2017, 10:18; editado 2 veces
Perfil MP  
Objetivo: Re: Pasar Un Control De Un Formulario A Otro Formulario
No termino de entender que aplicaciones tiene el pasar un control de un formulario a otro formulario.??

Saludos.

Perfil MP  
Objetivo: Re: Pasar Un Control De Un Formulario A Otro Formulario
Tincho:

Citar:

No termino de entender que aplicaciones tiene el pasar un control de un formulario a otro formulario.??


Hace poco Julio estuvo creando un ejemplo en el que desde un formulario podía controlar las propiedades
de los controles que estaban en otro formulario. Su ancho, alto, color (por decir algo).

Al pasar controles a otros formularios, estas construyendo en parte un formulario en tiempo real.
Cuando tienes un lienzo vacío, dibujas y coloreas. ¿ Estaba creado o lo hiciste en tiempo real ?.

Shordi:

Aplicaré lo que has mostrado y si hay algún problema te cuento como va.

En realidad esto es un pequeño ejemplo, de otra cosa que estaba haciendo. Solo que necesitaba
poder hacer esto para entenderlo mejor y continuar con el trabajo anterior.

Gracias.

Saludos

Objetivo: Re: Pasar Un Control De Un Formulario A Otro Formulario
Shordi:

Vale, he eliminado la propiedad objeto del Formulario Destino y usado el constructor new, donde
le paso a la variable privada el parámetro del argumento del constructor.

Entiendo la forma. De esa manera puedo pasar el control completo.
Pero no lograba mostrar el picturebox en el formulario destino.

Formulario Destino, antes:

Private $objeto As Object
Property objeto As Object

Public Sub Form_Open()

Dim opbox As PictureBox

With Me
.Title = "Destino"
.Arrangement = Arrange.Vertical
.AutoResize = True
End With

If Me.objeto Is PictureBox Then
opbox = New PictureBox(Me) As "manejador"
With opbox
.W = Me.objeto.w
.H = Me.objeto.h
.Picture = Me.objeto.Picture
End With
Endif

End

Private Function objeto_Read() As Object

Return $objeto

End

Private Sub objeto_Write(Value As Object)

$objeto = Value

End


Despues:

Private pbox As PictureBox

Public Sub _new(Optional pictbox As Picturebox)

pbox = pictbox

End

Public Sub Form_Open()
Dim otropicturebox As PictureBox

With Me
.Title = "Destino"
.Arrangement = Arrange.Vertical
.AutoResize = True
End With

'Doy por sentado que conozco el tipo del objeto que he pasado
otropicturebox = New PictureBox(Me)

With otropicturebox
.W = pbox.W
.H = pbox.H
.Picture = pbox.Picture
End With

End


Pregunta: ¿ Cual es la razón por la que directamente no puedo mostrar pbox en el formulario destino ?.
Me he tenido que valer de otro objeto del mismo tipo que he instanciado en el formulario destino, asignándole las propiedades de pbox.

Espero que se me entienda. Creo que no es difícil de captar la idea. El resultado final es dos formularios visualmente iguales.

Saludos

Objetivo: Re: Pasar Un Control De Un Formulario A Otro Formulario
Citar:
¿ Cual es la razón por la que directamente no puedo mostrar pbox en el formulario destino ?.

Cuando pasas un objeto lo que estás pasando es una referncia en memoria a dicho objeto. No una copia del mismo. Con ello consigues acceso total al control pasado pero no dos objetos distintos en dos formularios. Si lo que quieres es mostrarlo en el segundo formulario imagino (nunca lo he hecho) que símplemente con un objeto.reparent(me) y objeto.show() sería suficiente...

Saludos.

Perfil MP  
Objetivo: Re: Pasar Un Control De Un Formulario A Otro Formulario
Shordi:

Si, es un referencia lo que se le pasa.

Citar:

Si lo que quieres es mostrarlo en el segundo formulario imagino (nunca lo he hecho) que símplemente con un objeto.reparent(me) y objeto.show() sería suficiente...


Al usar reparent(me) y luego show ha hecho un efecto de lo más raro.Ha desaparecido el picturebox del formulario origen y
ha aparecido solo en formulario destino. Se ha teletransportado.

Public Sub Form_Open()
Dim otropicturebox As PictureBox

With Me
.Title = "Destino"
.Arrangement = Arrange.Vertical
.AutoResize = True
End With

pbox.Reparent(Me)
pbox.Show()

End


Habría que pasarle mejor una copia del objeto.

Acabas de dejar a un padre sin su hijo!!!.

Saludos

última edición por Shell el Viernes, 03 Febrero 2017, 21:26; editado 1 vez
Objetivo: Re: Pasar Un Control De Un Formulario A Otro Formulario
Citar:
Al usar reparent(me) y luego show ha hecho un efecto de lo más raro.Ha desaparecido el picturebox del formulario origen y
ha aparecido solo en formulario destino. Se ha teletransportado.


¿Raro? ¿qué esperabas? es un único objeto que está aquí o está allí. Si quieres tener dos, necesitas dos, para lo cual o los creas en tiempo de diseño iguales y luego pasas sólo la propiedad picture o creas el segundo en tiempo de ejecución y copias una a una todas las propiedades del primer objeto.
No existe, aunque creo que se podría crear fácilmente, un procedimiento genérico para duplicar objetos.

Saludos.

Perfil MP  
Objetivo: Re: Pasar Un Control De Un Formulario A Otro Formulario
Citar:

... o creas el segundo en tiempo de ejecución y copias una a una todas las propiedades del primer objeto.


Esto fue lo que hice desde el primer momento. Creía que había otras formas.
O que no lo estaba haciendo correctamente.

Podemos pasar la copia de un array, pero no la copia de un objeto, siendo un array un objeto.
Bueno, todo en el fondo es un objeto.

Citar:

No existe, aunque creo que se podría crear fácilmente, un procedimiento genérico para duplicar objetos.


Aunque estuvimos hablando ya hace un tiempo. En el blog de Julio encontré esto:

POO. Copiar objetos

No he podido verlo con algo más de tiempo.

Saludos


Página 1 de 1


  
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
No puede descargar archivos
No puede publicar eventos en el calendario

   

Está utilizando la versión (Lo-Fi). Para ver la versión completa del foro, haga clic aquí.

Powered by Icy Phoenix based on phpBB
Design by DiDiDaDo

Página generada en:: 0.1217s (PHP: 21% SQL: 79%)
Consultas SQL: 22 - Debug off - GZIP Activado