Error al retornar una variable al form principal

213 views
Skip to first unread message

integral

unread,
Jan 26, 2026, 12:49:44 AM (6 days ago) Jan 26
to Comunidad de Visual Foxpro en Español
Que tal amigos del Foro :

A continuacion adjunto una imagen del error presentado... 

ERROR_TRANSFER_0001.jpg

Aqui copio el codigo utilizado...

Form : Prestamos    (Principal NO Modal )
Objecto: CboModalidad      Evento : LostFocus

LOCAL lcAcepta AS String    

Addproperty(Thisform,"lcAcepta"," ")

DO CASE
   CASE ThisForm.CboModalidad.DisplayValue = "Transferencia"

   lcAcepta = .NULL.
   DO FORM ".\FORMS\frm_tipo_pago.scx" WITH lnLeft, lnTop TO lcAcepta
   
   IF VARTYPE(lcAcepta) # "O"
      RETURN
   ENDIF

   OTHERWISE
        Thisform.TxtTot_Interes.Setfocus()
ENDCASE

CommandBotton : Grabar

   m.med_trans  = Thisform.lcAcepta.Prop_Codigo_1  

   TEXT TO cSQL_04 NOSHOW
     INSERT INTO dbo.prestamos (
        registro, cod_pres, id_pres, cod_doc, tipo_doc, nro_doc, ruta_prod, med_trans
         ) VALUES (
       ?m.registro, ?m.cod_pres, ?m.id_pres, ?m.cod_doc, ?m.tipo_doc, ?m.nro_doc, ?m.ruta_prod, ?m.med_trans
         )
   ENDTEXT


*/////////////////////////////////////////////////////////////////////////////////////////////

Form : Frm_Tipo_Pago   (Modal)
Objecto : Form1               Procedure : INIT

*-- En el INIT del Formulario                                      
THISFORM.AddProperty("oRet")
THISFORM.oRet = CREATEOBJECT("Empty")

Thisform.Cbo_Transfer.SetFocus()

CommandBotton1: Click

LOCAL m.DisplayTrans                                        

ADDPROPERTY(THISFORM.oRet_2,"Prop_Codigo_1",m.DisplayTrans)
m.DisplayTrans = ALLTRIM(Thisform.Cbo_Transfer.DisplayValue)
WAIT WINDOW "Valor Almacenado : " + ALLTRIM(m.DisplayTrans) TIMEOUT 1

Thisform.Release

Unload:

RETURN Thisform.oRet_2

Agradezco sus comentarios y sugerencias

integral

unread,
Jan 26, 2026, 12:59:06 AM (6 days ago) Jan 26
to Comunidad de Visual Foxpro en Español

Amigos :

Corregi el error, pero ahora aparece el siguiente error...

ERROR_TRANSFER_0002.jpg

Agradezco sus sugerencias.

Atte.,

Integral

RS “Ricardo”

unread,
Jan 26, 2026, 11:48:00 AM (6 days ago) Jan 26
to Comunidad de Visual Foxpro en Español
Ese error indica que no encuentra la propiedad lcAcepta

Alfonso Ramirez Diaz

unread,
Jan 26, 2026, 3:22:41 PM (6 days ago) Jan 26
to Comunidad de Visual Foxpro en Español
Talvez solo falta el Thisform.lcAcepta para hacer referencia a la propiedad.

Zarlu

unread,
Jan 27, 2026, 9:02:55 AM (5 days ago) Jan 27
to Comunidad de Visual Foxpro en Español
Buenos días Integral!

Ojo!

Tienes "lcAcepta" como variable y como propiedad, quizá por eso si la encuentra dentro del código, pero fuera falla.

Suerte
zarlu
Chetumal, Quintana Roo, México

integral

unread,
Jan 27, 2026, 3:34:11 PM (5 days ago) Jan 27
to Comunidad de Visual Foxpro en Español
Que tal amigos del Foro

Muy Buenas Tardes

Agradezco sus comentarios y sugerencias.  Les comento brevemente la idea que deseo implementar adicionalmente.

Por falta de espacio en el formulario principal he decidido crear unos formularios secundarios de tipo modal

Y dichas variables las deseo grabar en la tabla principal relacionada en el formulario principal.

NVA_TRANSFERENCIA.jpg

NVOS_CAMPOS_DETALLE.jpg

El formulario secundario me devuelve la variable de la opción seleccionada. Pero al parecer en el Formulario principal luego de mostrar la variable mediante un Wait Window. Se Pierde el alcanze de la variable y no muestra ningún Valor  

Aquí muestro el código utilizado con un nuevo cambio realizado...

Form : Prestamos    (Principal NO Modal )
Objecto: CboModalidad      Evento : LostFocus

LOCAL oParams ,  lcAcepta AS String    
oParams = Create("Empty")
Addproperty(oParams,"lcAcepta"," ")

DO CASE
      CASE ThisForm.CboModalidad.DisplayValue = "Transferencia"

      lcAcepta = .NULL.
 
     DO FORM ".\FORMS\frm_tipo_pago.scx" WITH lnLeft, lnTop TO  lcAcepta
   
     IF VARTYPE(lcAcepta) # "O"
         RETURN
     ENDIF

     OTHERWISE
           Thisform.TxtTot_Interes.Setfocus()
ENDCASE

* /

CommandBotton : Grabar

m.med_trans = Thisform.oParams.lcAcepta.Prop_Codigo_1

   TEXT TO cSQL_04 NOSHOW
     INSERT INTO dbo.prestamos (
        registro, cod_pres, id_pres, cod_doc, tipo_doc, nro_doc, ruta_prod, med_trans
         ) VALUES (
       ?m.registro, ?m.cod_pres, ?m.id_pres, ?m.cod_doc, ?m.tipo_doc, ?m.nro_doc, ?m.ruta_prod, ?m.med_trans
         )
   ENDTEXT

Agradezco vuestra ayuda.

Saludos,

Integral
Message has been deleted

Zarlu

unread,
Jan 27, 2026, 5:47:22 PM (5 days ago) Jan 27
to Comunidad de Visual Foxpro en Español
Buenas tardes Integral!

Quizá te convenga más usar una propiedad en el screen, es similar a la variable pública

Antes de llamar al formulario secundario:
_screen.addproperty("spMedioTransfer")
_Screen.spMedioTransfer=""
Do Form secundario......

En el formulario secundario, cuando elijas la opción la almacenas en la propiedad

_Screen.spMedioTransfer=Valor seleccionado

Al regresar al formulario principal:

m.med_trans= _Screen.spMedioTransfer
removeproperty(_Screen,"spMedioTransfer")
If   m.med_trans ==""
Return
EndIF
...
...

Suerte
zarlu
Chetumal, Quintana Roo, México


Martin Inga

unread,
Jan 27, 2026, 10:49:02 PM (5 days ago) Jan 27
to publice...@googlegroups.com

Estimado buenas noches

 

Un pequeño aporte de mi experiencia:

 

DO FORM ".\FORMS\frm_tipo_pago.scx" WITH lnLeft, lnTop TO  lcAcepta

En el formulario secundario o apoyo que es Modal, haces return en el unload

 

Ejemplo

*Unload

 

Return this.devolver

 

Yo utilizo de esa forma y luego:

lcAcepta tendrá el valor que enviaste

 

Saludos,

Martín Inga

 

 

From: publice...@googlegroups.com <publice...@googlegroups.com> On Behalf Of integral
Sent: martes, 27 de enero de 2026 15:34
To: Comunidad de Visual Foxpro en Español <publice...@googlegroups.com>
Subject: [vfp] Re: Error al retornar una variable al form principal

 

Que tal amigos del Foro

 

Muy Buenas Tardes

 

Agradezco sus comentarios y sugerencias.  Les comento brevemente la idea que deseo implementar adicionalmente.

 

Por falta de espacio en el formulario principal he decidido crear unos formularios secundarios de tipo modal

 

Y dichas variables las deseo grabar en la tabla principal relacionada en el formulario principal.

 

 

 

Agradezco sus sugerencias.

 

Atte.,

 

Integral

El lunes, 26 de enero de 2026 a las 0:49:44 UTC-5, integral escribió:

Que tal amigos del Foro :

 

A continuacion adjunto una imagen del error presentado... 

 

--
Blog de la Comunidad Visual FoxPro en Español http://comunidadvfp.blogspot.com
---
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver este debate, visita https://groups.google.com/d/msgid/publicesvfoxpro/8fe00e0f-6a4b-4d43-8842-6b44c985feebn%40googlegroups.com.

integral

unread,
Jan 28, 2026, 10:20:57 AM (4 days ago) Jan 28
to Comunidad de Visual Foxpro en Español
Que tal amigos del Foro

Muy Buenos Dias

Aplique la sugerencia del colega ZARLU...Y ahora me marca otro error ver imagen adjunta. He notado que la variable  lcAcepta lo muestra como logica .en F. 

ERROR_UNICO.jpg

A continuación el código utilizado...

LOCAL lnLeft, lnTop            
LOCAL lcAcepta AS String

THIS.SpecialEffect = 1
THIS.BorderColor=RGB(0,0,0)
THIS.ForeColor=RGB(0,0,0)
This.BackColor=RGB(255,255,255)

lnLeft = ThisForm.Left + ThisForm.CboModalidad.Left + 135
lnTop  = ThisForm.Top  + ThisForm.CboModalidad.Top - 76

_SCREEN.Addproperty("pTransfer"," ")                    && Agregado


DO CASE
   CASE ThisForm.CboModalidad.DisplayValue = "Transferencia"

   lcAcepta = .NULL.
   DO FORM ".\FORMS\frm_tipo_pago.scx" WITH lnLeft, lnTop TO lcAcepta
   
   IF VARTYPE(lcAcepta) # "O"
      RETURN
   ENDIF

  _SCREEN.pTransfer = lcAcepta.Prop_Codigo_1
   WAIT WINDOWS "Valor Retornado (1) : " + TRANSFORM(_SCREEN.pTransfer) TIMEOUT 1
 
   OTHERWISE
        Thisform.TxtTot_Interes.Setfocus()
ENDCASE

*/*

CommandBotton : Grabar

LOCAL m.med_trans
   m.med_trans = _SCREEN.pTransfer
*  m.med_trans  = Thisform.lcAcepta.Prop_Codigo_1  


   TEXT TO cSQL_04 NOSHOW
     INSERT INTO dbo.prestamos (
        registro, cod_pres, id_pres, cod_doc, tipo_doc, nro_doc, ruta_prod, med_trans
         ) VALUES (
       ?m.registro, ?m.cod_pres, ?m.id_pres, ?m.cod_doc, ?m.tipo_doc, ?m.nro_doc, ?m.ruta_prod, ?m.med_trans
         )
   ENDTEXT

Quedo atento a sus comentarios y sugerencias.

Atte.,

Integral
Message has been deleted
Message has been deleted

Zarlu

unread,
Jan 28, 2026, 12:06:10 PM (4 days ago) Jan 28
to Comunidad de Visual Foxpro en Español
Buenos días Integral!

Mi sugerencia con una propiedad en el Screen es para no usar "to lcAcepta" al llamar al form
El valor a esa propiedad debes almacenarlo en form secundario, no muestras como lo almacenas
Te adjunto forms ejemplos con variable de retorno y con propiedad en el Screen. Ejecuta el form 1

La imagen del error que muestras parece ser por que mencionas que "lcAcepta" es un valor lógico que intentas guardar en un campo de tipo distinto

Suerte
Zarlu
Chetumal, Quintana Roo, México
form1.2SCT
form1.2scx
form2.2scx
form2.2SCT

Zarlu

unread,
Jan 28, 2026, 12:50:12 PM (4 days ago) Jan 28
to Comunidad de Visual Foxpro en Español
Qué tal Integral!

Un ejemplo más pasando el form principal como objeto y almacenando el valor en el form1 al seleccionarlo en el form 2

(las 1001 formas del zorrito)


Suerte
zarlu
Chetumal, Quintana Roo, México

form1.2scx
form1.2SCT
form2.2scx
form2.2SCT

integral

unread,
Jan 29, 2026, 2:26:31 PM (3 days ago) Jan 29
to Comunidad de Visual Foxpro en Español
Que tal amigos del Foro :

Muy Buenas Tardes.

Colega Zarlu te agradezco por tu tiempo y apoyo con tus ejemplos mostrados.

Pero me queda la duda en como solucionar el problema presentado...

No es la primera vez que utilizo el DO FORM  TO... 

A continuación te muestro parte del archivo de Ayuda de VFP 8.0 en español referente al

DO FORM ForName ? NAME VarName LINKED WITH cParamerList TO VarName NOREAD NOSHOW

TO VarName
Especifica una variable para contener un valor devuelto del formulario. Si la variable no existe, Visual FoxPro la crea automáticamente. Utilice el comando RETURN en el procedimiento de evento Unload del formulario para especificar el valor devuelto. Si no incluye un valor de retorno, se devolverá el valor predeterminado de verdadero (.T.). Para poder usar TO, la propiedad WindowType del formulario debe estar establecida como 1 (Modal). Si el evento Init del formulario devuelve .F., impidiendo el formulario de ser instanciado, el evento Unload no devolverá un valor a VarName.

Pareciera que estuviera ocurriendo lo resaltado en negrita, pero en mi caso , si devuelve el 2do. formulario el valor capturado, inclusive muestro el valor retornado mediante un WAIT WINDOW.

Pero al momento de dar click en el evento Grabar el valor capturado se vuelve en .F.

Seguiré investigando sobre el tema...

 Atte.,

Integral

Zarlu

unread,
Jan 29, 2026, 2:55:56 PM (3 days ago) Jan 29
to Comunidad de Visual Foxpro en Español
Buenas tardes Integral!

Si el formulario valida correctamente su INIT y se visualiza entonces ha sido instanciado con lo que se descarta lo que comentas.
En donde muestras el "Wait" en el primer o en el segundo formulario?
Sugerencia...
En el evento unload, justo antes de retornar el valor, haz un wait con la variable que retornas

( En "lcAcepta.Prop_Codigo_1" de donde viene "Prop_Codigo_1?? para que funcione lcAcepta debe ser un objeto)

Suerte
 zarlu
Chetumal, Quintana Roo, México

Mik

unread,
Jan 29, 2026, 8:39:52 PM (3 days ago) Jan 29
to Comunidad de Visual Foxpro en Español
Hola!

Veo que en el evento LostFocus del combobox estas declarando objetos y variables como Locales, las cuales solo te sirven dentro del evento donde fueron declaradas. Ahi te paso dos capturas que ilustran como tus variables, VFP ya no las puede evaluar fuera del metodo o evento LostFocus del combo.

Si quieres seguir haciendolo de esa manera te sugiero modifiques tu codigo:

Objecto: CboModalidad      Evento : LostFocus


Thisform.AddProperty('oParams', Createobject('empty'))
LOCAL lcAcepta AS String    


DO CASE
CASE ThisForm.CboModalidad.DisplayValue = "Transferencia"
   lcAcepta = .NULL.
   DO FORM ".\FORMS\frm_tipo_pago.scx" WITH lnLeft, lnTop TO lcAcepta
   IF VARTYPE(lcAcepta) # "O"
     RETURN
   ENDIF

   Addproperty(thisform.oParams,"lcAcepta", lcAcepta)

OTHERWISE
        Thisform.TxtTot_Interes.Setfocus()
ENDCASE

Consejo:  Echale un tiempo a aprender a usar la herramientra DEBUGGER. Espero te sirva. 

Saludos!!


N1.png

N2.png

Victor Espina

unread,
Jan 30, 2026, 7:37:13 AM (2 days ago) Jan 30
to Comunidad de Visual Foxpro en Español
Ibas por buen camino con lo de oParams, pero te falto implementarlo.  La idea es que el objeto oParams contenga una propiedad por cada valor que le quieres pasar al dialogo.  En el init del dialogo haces:

LPARAMETERS poParams
THISFORM.addProperty("oParams", poParams)

y luego para acceder a los valores pasados desde cualquier parte del dialogo:

THISFORM.oParams.lcAcepta = "...."

Como es un objeto, VFP pasa su REERENCIA, no su valor, por lo que no es necesario que el dialogo devuelva nada; simplemente al volver del dialogo puedes usar loParams para acceder a los valores que se hayan actualizado desde el dialogo:

IF NOT ISNULL(poParams.lcAcepta)
   ...
ENDIF


Finalmente, se considera una mala practica escribir codigo directamente en un evento; lo ideal es que uses el patron evento-delegado, donde el evento solo llamada a un metodo externo (el delegado), que puede estar definido en el formulario mismo o en una clase externa.  Por ejemplo, en tu caso, todo el codigo que tienes en el LostFocus deberia estar en un metoodo del formulario:


Form : Prestamos    (Principal NO Modal )
Objecto: CboModalidad      Evento : LostFocus

THISFORM.onCboModalidadLostFocus(THIS)

Form : Prestamos    (Principal NO Modal )
Objecto: THIsFORM      Metodo : onCboModalidadLostFocus

LPARMETERS poSource

LOCAL oParams ,  lcAcepta AS String    
oParams = Create("Empty")
Addproperty(oParams,"lcAcepta"," ")

DO CASE
      CASE poSource.DisplayValue = "Transferencia"

      lcAcepta = .NULL.
 
     DO FORM ".\FORMS\frm_tipo_pago.scx" WITH lnLeft, lnTop TO  lcAcepta
   
     IF VARTYPE(lcAcepta) # "O"
         RETURN
     ENDIF

     OTHERWISE
           Thisform.TxtTot_Interes.Setfocus()
ENDCASE



Saludos

Victor Espina

Victor Espina

unread,
Jan 30, 2026, 7:55:35 AM (2 days ago) Jan 30
to Comunidad de Visual Foxpro en Español
Esa tecnica tiene su utilidad pero no se puede usar para todo porque lleva a una saturacion del objeto _SCREEN, ademas de aumentar el coupling (interdependencia) del sistema en general.  Lo ideal SIEMPRE ES pasar referencias entre objetos o aplicar el patron Singleton para crear un objeto que permita compartir informacion entre distintos actores del sistema.

En el caso de VFP9 se podria incluso usar BINDEVENT para enlazar un evento del form modal con otro evento del form padre:

FORM PADRE:
LOCAL oModal
DO FORM formaModal NAME oModal NOSHOW
BINDEVENT(oModal, "alGrabar", THISFORM, "alGrabarModal")
oModal.Show(1)

FORM MODAL (alGrabar)
LPARAMETERS poData

FORM MODAL (boton Grabar)
LOCAL oDatos
oDatos = CREATE("Empty")
ADDPROPERTY(oDatos, "data1", THISFORM.txtData1.Value)
ADDPROPERTY(oDatos,"data2", THISFORM.txtData2.Value)
THISFORM.alGrabar(oDatos)

FORM PADRE (alGrabarModal)
LPARAMETERS poData

IF poData.Data1 = "..." 
   ...
ENDIF



Saludos

Victor Espina
Reply all
Reply to author
Forward
0 new messages