Paso De Variables Entre Formularios [SOLUCIONADO]


Ir a la página 1, 2  Siguiente

Objetivo: Paso De Variables Entre Formularios [SOLUCIONADO]
Buenas...

Tengo una duda. Necesito llevar y traer unos valores entre formularios pero no queria utilizar variables globales.
Pense pasar una variable local por referencia pero al regresar al formulario principal la variable no tiene el valor asignado.

Explico:

En form1 tengo la variable var1

En form 2 tengo una variable var2

hago una llamada de este tipo:
...
form2.runNew(var1)
print var1
...

y en form2 runNew es algo asi:

Public Sub runNew(ByRef Data As String)
var2 = Data
Me.ShowModal
End


Despues de modificar va2 en form2 al imprimir en form1 la variable var1 no tiene los datos asignados.

¿Que estoy haciendo mal? o no se pueden pasar variables de esta forma.
Alguien podría ilustrarme un pogo.

Desde ya Gracias.

última edición por whisper el Lunes, 06 Abril 2015, 13:47; editado 1 vez
Perfil MP  
Objetivo: Re: Paso De Variables Entre Formularios
Holas....

Una posibilidd seria declararla publica a dicha variable a la cual debes acceder desde otro lugar... asi...

Public sVar1 As String = "moco"



y accedes desde otro lugar(siempre y en cuanto halla una instancia activa de este)

Form1.sVar1 = "mocomoco"


No se que diran los puristas, pero no me parece muy acertado esto a mi, pero si funcional, en mi caso cuando necesito algo parecido creo una propiedad al form.

asi....
Property QueFluidoCorporal As String
Private sQueFluidoCorporal As String = "moco"

y los procedimientos
Private Function QueFluidoCorporal_Read() As String

Return sQueFluidoCorporal

End

Private Sub QueFluidoCorporal_Write(Value As String)

'valida dato

sQueFluidoCorporal = Value

End

asi podemos evitar muchos problemas cuando la cosa se pone mas gruesa... espero que sirve de algo... exitos


olvide poner que accedes asi

FMain.QueFluidoCorporal = "mocomoco"

última edición por osunaosuna el Lunes, 06 Abril 2015, 03:19; editado 1 vez
Perfil MP  
Objetivo: Re: Paso De Variables Entre Formularios
Suscribo lo que dice osunaosuna: Puedes hacerla pública... pero no te lo recomiendo. El problema es que con una variable pública, nunca estás 100% seguro de desde dónde se actualiza o qué contiene.
Crea una propiedad y tendrás control absoluto a través de sus eventos Read y Write. En ellos puedes filtrar el valor que se quiere grabar (Write) y depurar o efectuar algún tipo de cálculo o lo que sea sobre el valor que se devuelve (Read).

Perfil MP  
Objetivo: Re: Paso De Variables Entre Formularios
Ampliando un poco el tema:

OsunaOsuna Y Shordi han explicado como enviar datos a un formulario "A" a un formulario "B", el mismo procedimiento se puede hacer para que el formulario "B" mande información "A"

Otra forma de hacerlo es mediante array (y también las clases). Los array (y tambien las clases) tienen una forma muy especial de pasarse, ya que lo que se pasa es la referencia al array y no su valor.

Por ejemplo:
'en el formularioA

Public sub AbreFormularioB()
dim datos as new string[]

datos.add("dato para editar")
formularioB.dat=datos 'el dato lo pasamos por referencia, ya que se trata de un array

formularioB.showmodal()


print "Mostramos el datos que se ha editado, en el formulario B:",datos[0]
end

---------------------------
Por otro lado en el formulario B

Public dat as string[]

'aqui se puede usar dat[0], para editarlo... Como esta pasado por referencia no hace falta enviarlo al formularioA, cuando cerramos este formularioB, ya tendremos el array dat "actualizado".
....


Esto tambien pasa con las colecciones, con lo cual es mucho más facil enviar y recibir datos, y extraerlos con los nombres de las Key. Shell lo comento hace tiempo en uno de sus post.

Objetivo: Re: Paso De Variables Entre Formularios
Julio, en tu ejemplo ya estás usando una variable global pública (el array dat as String[] del formulario B), cosa que es lo que se trata de evitar y es poco ortodoxo. Para eso están las propiedades, las cuales también pueden ser arrays, si se quiere. Incluso se podría jugar con estructuras y arrays de estructuras si los datos son complejos.

Saludos

Perfil MP  
Objetivo: Re: Paso De Variables Entre Formularios
Bueno, Gracias por contestar.

Veo que para no utilizar variables pulicas o globales lo mas prolijo sería utilizar propiedades. nunca lo hice pero vi que hay buena informacion (en las respuestas y en el foro), asi que intentare con eso.

Se los agradesco. Un abrazo a todos y voy a dar por cerrado el post.

Perfil MP  
Objetivo: Re: Paso De Variables Entre Formularios [SOLUCIONADO]
whisper escribió: [Ver mensaje]

¿Que estoy haciendo mal?


Olvidaste de escribir la palabra llave ByRef tambien en la función llamante.

Bueno, en este ejemplo tenemos dos Formularios: FMain y Form1.
En el Form principal (FMain) escribiremos por ejemplo este codigo:
Public Sub Form_Open()

Dim var1 As String = "Hispa"

Form1.runNew(ByRef var1)

Print var1 ' Vamos a ver el resultado final

Form1.ShowModal ' Preservamos la apertura de Form1 en ShowModal

End


y en el Form secundario (Form1) escribiremos este codigo:
Public Sub runNew(ByRef Data As String)

Data &= "nia"

End

última edición por vuott el Lunes, 06 Abril 2015, 16:33; editado 5 veces
Perfil MP  
Objetivo: Re: Paso De Variables Entre Formularios [SOLUCIONADO]
jguardon:

Citar:
Julio, en tu ejemplo ya estás usando una variable global pública (el array dat as String[] del formulario B)

Pues si, me he liado....

Creo que deberia de quedar asi:

'en el formularioA

Public sub AbreFormularioB()
dim datos as new string[]

datos.add("dato para editar")
formularioB.setdat(datos) 'el dato lo pasamos por referencia, ya que se trata de un array

formularioB.showmodal()


print "Mostramos el datos que se ha editado, en el formulario B:",datos[0]
end

---------------------------
Por otro lado en el formulario B

private hdat as string[]

public setdat(d as string[])
hdat=d
end

'aqui se puede usar hdat[0], para editarlo... Como esta pasado por referencia no hace falta enviarlo al formularioA, cuando cerramos este formularioB, ya tendremos el array dat "actualizado".
......

Objetivo: Re: Paso De Variables Entre Formularios
shordi escribió: [Ver mensaje]
...pública... pero no te lo recomiendo. El problema es que con una variable pública, nunca estás 100% seguro de desde dónde se actualiza o qué contiene.


Mah... no llego a comprender esta miedo. undecided

Perfil MP  
Objetivo: Re: Paso De Variables Entre Formularios [SOLUCIONADO]
Voutt:

Citar:
Mah... no llego a comprender esta miedo.


Un ejemplo del problema que se puede producir:

Imagina que tienes una variable llamada "saldo de tu cuenta", y que esa variable nunca puede ser negativa.

Public SaldoDeTuCuenta as integer


, y que tienes un procedimiento llamado: restarSaldo( cantidad).
Public sub restarSaldo(cantidad as integer)
SaldoDeTuCuenta -=cantidad
end

Ahora imagina que tienes un SaldoDeTuCuenta=1000, y restaSaldo(1500), automaticamente el SaldoDeTuCuenta=-500, ¡¡¡ se ha puesto negativa!!!

Para corregir esto, se puede hacer lo siguiente:

Propiety SaldoDeTuCuenta as integer
private hSaldo as integer

Public function SaldoDeTuCuenta_read() as integer
return hsaldo
end


Public sub SaldoDeTuCuenta_write(valor as integer)

if hSaldo-valor <0 then
message.info("Error: La operación no se puede realizar")
'avisar que el programa no se ha realizado la operacion...
else
'la operacion se puede realizar.
hSaldo -=valor
endif

end


Más o menos ese el problema que se puede producir si se accede directamente a la variable, no podemos hacer comprobaciones.... sin embargo si accedemos mediante como propiedades (o funciones setting o getting) , si controlamos que podemos hacer si el valor no es el adecuado...

última edición por jsbsan el Martes, 07 Abril 2015, 12:09; editado 1 vez
Ir a la página 1, 2  Siguiente

Página 1 de 2


  
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
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.3973s (PHP: -69% SQL: 169%)
Consultas SQL: 49 - Debug off - GZIP Activado