Pasar datos entre forms usando parametros

1,049 views
Skip to first unread message

Sprangaren

unread,
Oct 11, 2011, 7:35:36 PM10/11/11
to Comunidad de Visual Foxpro en Español
Hola!! En mi proyecto he creado muchas variables publicas para pasar
datos entre forms y empiezan a ocasionarme problemas. He leido que es
mejor usar parametros, ya que una vez cargado el evento init la
variable se libera automaticamente y asi se evita el trabajo de
destruirlas; por lo mismo deseo implementarlos pero no estoy muy
segura de como hacerlo. Les agradececia infinito que me dieran algun
ejemplo o me den alguna sugerencia de como liberar las variables
publicas una vez que hayan sido usadas. De antemano gracias
totales!! :)

Intel Man

unread,
Oct 11, 2011, 7:41:15 PM10/11/11
to publice...@googlegroups.com
Hola, no es necesario crear variables públicas, lo que puedes hacer es crear propiedades en los formularios y llamarlos entre los formularios.

Por ejemplo:

Adicionas al formulario1 (tiene que tener nombre: formulario1) las propiedades:   p1, p2 y p3

Luego en el formulario2 (tiene que tener nombre: formulario2) llamas asi:

thisform.tuobjeto1.value=formulario1.p1
thisform.tuobjeto2.value=formulario1.p2
thisform.tuobjeto3.value=formulario1.p3

Espero entiendas la idea.

Saludos



> Date: Tue, 11 Oct 2011 16:35:36 -0700
> Subject: [vfp] Pasar datos entre forms usando parametros
> From: elj...@gmail.com
> To: publice...@googlegroups.com

Daniel

unread,
Oct 12, 2011, 8:37:00 PM10/12/11
to Comunidad de Visual Foxpro en Español
Hola:

Concuerdo con la forma que escribieron antes sobre crear propiedades
del formulario. Agrego que también está la posibilidad, si no
necesitás que esos datos persistan (se mantengan en el tiempo), de
pasarlos como parámetro de alguno de los métodos (como el Show).

En el caso de Show, el prototipo del método indica que recibe un
parámetro: LPARAMETERS nStyle

nStyle indica la forma de visualización del formulario (1: modal, 2:
modless). Se pude reescribir para agregarle más parámetros. Por
ejemplo:
LPARAMETERS nStyle, Parametro1, Parametro2...

y, cuando se llame al formulario, se pasen esos datos. Ejemplo:
formulario2.Show(2, "Parámetro1", 999...).

LPARAMETERS indica que los parámetros son "locales". Una vez que la
ejecución del método termine, las variables que indican los parámetros
se liberan.


Con respecto a lo que preguntabas sobre liberar variables, te puede
servir el comando RELEASE. Ejemplo:
RELEASE nombre_variable

Si lo que intentás liberar son objetos conviene investigar el uso del
método Destroy, en vez de RELEASE.


Espero que sirva y que se entienda.

Éxitos.

Gorka

unread,
Oct 13, 2011, 3:09:27 AM10/13/11
to Comunidad de Visual Foxpro en Español
Hola
Si necesitas muchas variables disponibles en todo el proyecto puedes
crear una clase y definir en ella tantas propiedades como variables
utilices.
Al inicio del programa creas una variable publica a la que asignas el
objeto con esa clase y desde ese momento tendrás disponible en un
objeto todas las propiedades que le hayas definido en todo el
proyecto.

Por ejemplo:

Public Oapp
Oapp=CREATEOBJECT("Aplicacion")
Oapp.Variable1=lee_ini("Variable1")
Oapp.Variable2=lee_ini("Variable2")
Oapp.Variable3=lee_ini("Variable3")
Oapp.Variable4=lee_ini("Variable4")
Oapp.Variable5=lee_ini("Variable5")



**************************************************
*-- Class: Aplicacion (d:\libs\Inicio.vcx)
*-- ParentClass: custom
*-- BaseClass: custom
*-- Time Stamp: 03/28/11 01:18:01 PM
*
DEFINE CLASS Aplicacion AS custom

Height = 17
Width = 98
Name = "Aplicacion"
Variable1 = 0
Variable2 = 1
Variable3 = ""
Variable4 = 0
Variable5 = ""
Variable6 = ""
Variable7 = ""
Variable8 = ""
Variable9 = ""
Variable10 = ""
Variable11 = ""
Variable12 = ""
Variable13 = ""
Variable14 = .f.
Variable15 = .f.
Variable16 = .f.
Variable17 = .f.
Variable18 = .f.
Variable19 = .f.
Variable20 = 0
Variable21 = 0
Variable22 = 0
Variable23 = 0

ENDDEFINE
*
*-- EndDefine: Aplicacion
**************************************************


Espero que te sirva.
Saludos
Gorka

Victor Espina

unread,
Oct 13, 2011, 8:55:11 AM10/13/11
to publice...@googlegroups.com
La solucion mas versatil que he encontrado para este problema es crear una funcion que me permita crear rapidamente un objeto "buffer" y llenarlo con los datos que necesito pasar al otro formulario o metodo.

Por ejemplo, si necesito pasar a un formulario el codigo de cliente, fecha actual y usuario actual, podria hacer algo asi:

LOCAL oParams
oParams = CFBuffer("codcli,fecha,userId",cCodCli,DATE(),appContext.currentUser.Id)

DO FORM myForm with oParams


Para mas facilidad, siempre creo una clase basada en Form que me sirve de base para todos los formularios. En esa clase, recibo un parametro poParams en el evento Init y lo asocio a una propiedad Params en la clase.  De esta forma, todos mis formularios quedan preparados para recibir un parametro al ser invocados y almacenan dicho parametro en la propiedad Params.

Asi, en el form myForm podria hacer lo siguiente:

PROCEDUE Button1_Click
 MESSAGEBOX("Cliente: " + THISFORM.Params.codcli)
ENDPROC

Lo bueno es que si ese parametro es un objeto, estos se pasan por referencia, por lo que cualquier cambio que yo haga sobre los valores de Params en el formulario, permaneceran cuando vuelva al form original (suponiendo que el 2do form sea modal).  De esta forma, por ejemplo, podria incluir una propiedad en el buffer que me indique si el usuario cancelo o no el dialogo:

LOCAL oParams
oParams = CFBuffer("Cancelado",.F.)

DO FORM modalForm WITH oParams

IF oParams.Cancelado
 RETURN
ENDIF

Y en el evento Click del boton Cancelar del form modal, pondria:

THISFORM.Params.Cancelado = .T.
THISFORM.Release()


Aqui te dejo una version simplificada de la funcion CFBuffer, por si te interesa:


*-- CFBuffer
*   Crea un objeto buffer con el contenido indicado. Esta version soporta un maximo de 10
*   propiedades y es compatible con VFP 6 o superior.
*
*   Autor: V. Espina
*
PROCEDURE CFBuffer(pcPropList,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10)
 *
 LOCAL oBuffer
 oBuffer = CREATEOBJECT("Relation")  && Se puede usar cualquier clase base; Relation es de las mas pequenas
 
 
 *-- Se convierte los separadores "," en saltos de linea, para poder obtener cada
 *   propiedad individualmente
 LOCAL cCRLF,nCount,i,cProp,cPVar
 LOCAL ARRAY aProps[1]
 cCRLF = CHR(13) + CHR(10)
 nCount = ALINES(aProps, STRT(pcPropList,",",cCRLF))
 
 
 *-- Se recorre la lista de propiedades y se anaden al objeto oBuffer
 FOR i = 1 TO nCount
  cProp = aProps[i]
  cPVar = "M.P" + ALLT(STR(i))
  oBuffer.AddProperty(cProp,EVAL(cPVar))
 ENDFOR
 
 RETURN oBuffer
 *
ENDPROC

Saludos

Victor Espina

Viktor Velazquez

unread,
Oct 13, 2011, 10:03:00 AM10/13/11
to publice...@googlegroups.com
por que no me jor usas un conjunto de formularios asi tienes acceso directo a los objetos  padre-hijo

Thisformset.formpadre.objeto.valor..

y acceso de padre a hijo.. Thisformset.formhijo.objeto.. valor   saludos...


Date: Thu, 13 Oct 2011 05:55:11 -0700
From: vesp...@gmail.com
To: publice...@googlegroups.com
Subject: [vfp] Re: Pasar datos entre forms usando parametros

Victor Espina

unread,
Oct 13, 2011, 12:52:30 PM10/13/11
to publice...@googlegroups.com
Los FormSets son TERRIBLES y sumamente dificiles de manejar. Creo que todos los que programamos con VFP intentamos usar alguna vez el tema de los FormSets y terminamos por abandonarlos en algun momento.

Saludos

Victor Espina

Intel Man

unread,
Oct 13, 2011, 1:24:26 PM10/13/11
to publice...@googlegroups.com
Es verdad yo los use alguna vez pero me parecieron impracticos, es mi opinión  y opté por usar form separados y me va mucho mejor.

Saludos



Date: Thu, 13 Oct 2011 09:52:30 -0700
From: vesp...@gmail.com
To: publice...@googlegroups.com
Subject: Re: [vfp] Re: Pasar datos entre forms usando parametros

Miguel Canchas

unread,
Oct 13, 2011, 1:30:57 PM10/13/11
to publice...@googlegroups.com

Totalmente de acuerdo contigo…los FormSet son TERRIBLES ….. aunque cuando le agarras maña se te hace fácil, MEJOR NOOOOO

 

 

MK

Mario Alfredo

unread,
Oct 13, 2011, 2:59:44 PM10/13/11
to Comunidad de Visual Foxpro en Español
ustedes son demasiados inteligentes mas espina, no entiendo
si no colocan un ejemplo, como lo explico
aqui lo aprendi
yo hago esto cunado doy click un boton de comando
para consultar por ejemplo

ovariable=createobject("custom")
ovariable.addproperty("Retorno1",0)
ovariable.addproperty("Retorno2","")
DO FORM edicionc WITH ovariable
thisform.txtcodigo.value=ovariable.retorno1
thisform.txtanombred.value=ovariable.retorno2

en el edicionc creo una propiedad ovariable
en el init del edicionc coloco esto

lparameters oVariable as object
thisform.ovariable=ovariable

y en el destroy de este formulario
thisform.ovariable.retorno1=thisform.txtcodigo.value
thisform.ovariable.retorno2=thisform.txtnombre.value
en este form existen estos textbox

On Oct 13, 11:30 am, "Miguel Canchas" <mcanc...@ximesa.com> wrote:
> Totalmente de acuerdo contigo...los FormSet son TERRIBLES ..... aunque cuando le agarras maña se te hace fácil, MEJOR NOOOOO
>
> MK
>
> De:publice...@googlegroups.com[mailto:publice...@googlegroups.com]En nombre de Intel Man
> Enviado el: jueves, 13 de octubre de 2011 12:24 p.m.Para:publice...@googlegroups.com
> Asunto: RE: [vfp] Re: Pasar datos entre forms usando parametros
>
> Es verdad yo los use alguna vez pero me parecieron impracticos, es mi opinión  y opté por usar form separados y me va mucho mejor.
>
> Saludos
>
> ________________________________
>
> Date: Thu, 13 Oct 2011 09:52:30 -0700
> From: vespi...@gmail.comTo:publice...@googlegroups.com

Walter R. Ojeda Valiente

unread,
Oct 13, 2011, 3:06:17 PM10/13/11
to publice...@googlegroups.com
Muy cierto, concuerdo contigo.

Saludos.

Walter.




Date: Thu, 13 Oct 2011 09:52:30 -0700
From: vesp...@gmail.com
To: publice...@googlegroups.com
Subject: Re: [vfp] Re: Pasar datos entre forms usando parametros

GeoSys Diseño de Software

unread,
Oct 13, 2011, 4:50:23 PM10/13/11
to publice...@googlegroups.com
El formset yo lo utilizo solo para las barras de herramientas, o sea tengo un formulario llamada principal que contiene el formset para ese fin, las barras de herramientas hacen de menú y están accesibles en cualquier parte de la aplicación, pero los demás todos son formularios independientes, porque si son complicado los formset
--
José Anthony Contreras Peralta

GeoSys Costa Rica.


GeoSys Diseño de Software

unread,
Oct 13, 2011, 4:52:35 PM10/13/11
to publice...@googlegroups.com
Otra cosa que no uso son los campos memos en las tablas DBF´s, tienden a corromperse  pasé muy malas experiancias con ellos.

Victor Espina

unread,
Oct 13, 2011, 4:57:45 PM10/13/11
to publice...@googlegroups.com
Mario, estamos hablando de lo mismo. La unica diferencia es que en mi caso, yo me cree la funcion CFBuffer() para que en lugar de tener que escribir este codigo:

ovariable=createobject("custom") 
ovariable.addproperty("Retorno1",0) 
ovariable.addproperty("Retorno2","") 

CADA vez que iba a invocar un Form, lo hago todo en una sola linea, lo cual me parece mas facil, conveniente y legible:

oVariable = CFBuffer("Retorno1,Retorno2",0,"")

Esto es especialmente cierto cuando oVariable tiene no dos sino 10 propiedades o mas.  Para mi la legibilidad del codigo es algo de vital importancia, asi que cualquier esfuerzo que vaya en lograr escribir un codigo mas corto y mas legible es siempre algo deseable y sobre todo rentable en el largo plazo.

Saludos

Victor Espina

Victor Espina

unread,
Oct 13, 2011, 4:59:08 PM10/13/11
to publice...@googlegroups.com
Es cierto. Lamentablemente, en VFP no hay otras alternativas sencillas para manejar campos memo, asi que la unica solucion es migrar a un esquema cliente-servidor.  

Saludos

Victor Espina

Walter R. Ojeda Valiente

unread,
Oct 13, 2011, 5:18:08 PM10/13/11
to publice...@googlegroups.com
Muy cierto, también concuerdo con esto.

Saludos.

Walter.




Date: Thu, 13 Oct 2011 14:52:35 -0600

Subject: Re: [vfp] Re: Pasar datos entre forms usando parametros

Sprangaren

unread,
Oct 14, 2011, 3:22:35 AM10/14/11
to Comunidad de Visual Foxpro en Español
No sabia ese detalle de los campos memo, aunque particularmente los he
usado muy poco. Siempre se aprende algo nuevo! Muchas gracias a todos
por sus sugerencias! Me han sido bastante utiles :)

Mario Alfredo

unread,
Oct 19, 2011, 2:34:45 PM10/19/11
to Comunidad de Visual Foxpro en Español
gorka porque si tienes tiempo la explicas mejor

por favor

Douglas Sánchez Guillén

unread,
Oct 19, 2011, 3:18:25 PM10/19/11
to publice...@googlegroups.com
Para eso necesitas trabajar con propiedades de dos formularios, para que se destruyan y asi alimentas los objetos posteriormente del segundo form.

Ejemplo No.  01    

Pasando parametros de un form a otro, forma1, forma2,  la forma1 es el principal la dos es donde deseo mostrar algun detalle no se si es lo que tu kieres pero se adaptara la idea me imagino.
Datos:   tabla1 idproducto, codigo, descripcion, existencia, costo    algo simple
            tabla2  idproducto, fecha, codigo, entrada, salida, costo, tipo  &&&& irelevante pero la idea es pasar un parametros

forma1 tiene los text de la tabla 1 ya cargado, igual la forma2 tiene los objetos text de los campos de la tabla2.
Quiero mostrar el detalle de las entrdas y salidas del forma1, el codigo 12345
lo podes hacer en el text1 dd dijitas el codigo 12345 o simplemente pones un boton cmd, dd diga mostrar detalle.

pongasmos que lo haces en un boton cmd1. ahi en el evento click ponemos

DO FORM FORMA1 WITH THISFORM

forma2, en el init hago esto.
Lparameter toParentForm
Thisform.oParentForm = toParentForm   &&&& Propiededad oparentform, o sea es el formulario anterior. esta propiedad la creas aqui
thisform.pcodigo =toParentForm .text1.value &&&& la propiedad toma el valor de lo q contenga el text1 del forma1
select tabla2
seek  thisform.pcodigo
if found()
muestro los datos que encuentre en una grilla en los objetos y con flechas pa navegar
endif
Cuando retornes mediante escape si lo programas en keypress event del forma1 o mediante release de un boton ok. borras las propiedades que creastes y asi es la forma mas facil de trabajar pasando datos de un form al otro ya que estas heredando en esa propiedad  Thisform.oParentForm todo los objetos que contenga el forma1.

Ejemplo No.  02    


Pasar parametros de un formulario y retornar un valor.
igual seria. misma tabla mismas formas, pero cambiamos algo

en el boton cmd1, le vamos a poner esto

Local  valbus As Integer   &&&& integer como yo necesito que retorne el idproducto
do form forma1 with thsform.name    to valbuscar

ahora en el forma2 en el init ponemos los siguiente

PARAMETER noWinAc
thisform.winact =noWinAc

buscamos en una interactivechenge del text1 y localizamos el registro y los retornamos en en unload

ACTIVATE WINDOWS (thisform.winact)
RETURN thisform.valbus

esos son los ejemplos creo que mas sensillos que existen.



Espero le sirva a alguien

Saludes des de Nicaragua.


 
Ing. Douglas Sánchez Guillén
      Consultor Informatico
Movistar: 505 8759 - 5342
Claro: 505 88495476

Gorka

unread,
Oct 20, 2011, 3:37:30 AM10/20/11
to Comunidad de Visual Foxpro en Español
Desde el menu de Vfox:
Nuevo - Clase

Nombre: El que quieras (ej. Entorno)
Basado en: Custom
Almacenar en: Tu libreria de clases (Ejemplo: Entorno.scx)

Una vez tienes tu clase vas a
Menu - Clase - Nueva Propiedad

y Creas tantas propiedades como variables publicas estes usando ahora.
A esas propiedades les puedes dar ya un valor por defecto o dejarlas a
nulo

En tu prg de inicio:

SET CLASSLIB TO ENTORNO ADDITIVE

PUBLIC oAPP
oApp = CREATEOBJECT("Entorno")

A partir de aqui en todo tu proyecto, formularios, reportes,
procedimientos, etc... dispondras del objeto oApp
y todas sus propiedades disponibles para almacenar o recuperar los
valores que necesites:

oApp.propiedad1="Mi Valor 1"

Espero haberme explicado.
Saludos
Gorka

Mario Alfredo

unread,
Oct 20, 2011, 6:09:58 PM10/20/11
to Comunidad de Visual Foxpro en Español
hoy si entendi lo de las clases
gracias por tu explicacion
yo soy de los dinosarios
me inicie en foxpro 2.6
pero no me apeno
aqui aprendo con ustedes gracias

solo una pregunta
Oapp.Variable1=lee_ini("Variable1")
aqui utilisastes lee_ini

oApp.propiedad1="Mi Valor 1"
aqui no utilisastes ninguna

gracias nuevamente

Gorka

unread,
Oct 21, 2011, 2:17:11 AM10/21/11
to Comunidad de Visual Foxpro en Español
Hola
lee_ini() puede ser una funcion que recupere el valor de un
archivo .ini
Era solo un ejemplo.... no es una función de Vfox.
Saludos
Gorka

Antonio Meza

unread,
Oct 21, 2011, 11:28:08 AM10/21/11
to publice...@googlegroups.com
Hola!!
 
Y como que tipo de datos necesitas pasar entre tus formularios? creo que seria mas facil darte ayuda!!
 
saludos!!

Yvan Carranza

unread,
Oct 21, 2011, 11:53:43 AM10/21/11
to publice...@googlegroups.com
ha un select mi cursor o tabla
antes de hace el report form.. etc. etc

Yvan Carranza

unread,
Oct 21, 2011, 11:54:23 AM10/21/11
to publice...@googlegroups.com
ooop.. google lento..  responde al tema equivocado.

Mario Alfredo

unread,
Oct 21, 2011, 6:46:17 PM10/21/11
to Comunidad de Visual Foxpro en Español
gracias gorka
Reply all
Reply to author
Forward
0 new messages