Page 1 of 1
Refrescar controles en folderex [RESUELTO]
Posted: Tue Jan 21, 2020 10:27 pm
by Ramón J.
Hola, foro
Estoy construyendo un folderex con _ y me gustaría saber cómo actualizar _ una vez grabado. Lo he intentado con ofld:refresh(), pero no actualiza los datos. Un ejemplo sencillo de lo que pretendo hacer es lo siguiente:
#include "FiveWin.ch"
function Main()
local oDlg, oFld, oNombre, cNombre, cApellido, oApellido
REQUEST DBFCDX
RDDSETDEFAULT ( "DBFCDX" )
DEFINE DIALOG oDlg SIZE 400, 300
USE TEST NEW ALIAS "TEST"
go top
cNombre =test->nombre
cApellido=test->apellido
@ 3, 5 FOLDEREX oFld PIXEL ;
PROMPT "&Uno", "&Dos" ;
SIZE 190, 120
@ 1, 1 GET oNombre VAR cNombre OF oFld:aDialogs[ 1 ]
@ 2, 1 GET oApellido VAR cApellido OF oFld:aDialogs[ 1 ]
@ 4, 14 BUTTON "Cambiar" of oFld:aDialogs[ 1 ] ACTION cambia(cNombre,oNombre, cApellido, oApellido, ofld)
@ 7.2, 14 BUTTON "Salir" ACTION oDlg:End()
ACTIVATE DIALOG oDlg CENTERED
return nil
function cambia(cNombre, oNombre, cApellido, oApellido, oFld)
local oDlg2, cNombre2, oNombre2, cApellido2, oApellido2
cNombre2:=cNombre
cApellido2:=cApellido
DEFINE DIALOG oDlg2 SIZE 400, 300
@ 1, 1 GET oNombre2 VAR cNombre2 OF oDlg2 SIZE 60,10
@ 3, 1 GET oApellido2 VAR cApellido2 OF oDlg2 SIZE 60,10
@ 7.2, 10 BUTTON "Cambiar" of oDlg2 ACTION (graba(cNombre, oNombre, cApellido, oApellido,;
cNombre2, oNombre2, cApellido2, oApellido2, ofld), odlg2:end())
@ 7.2, 20 BUTTON "Cancelar" ACTION oDlg2:End()
ACTIVATE DIALOG oDlg2 CENTERED
return nil
Function graba(cNombre, oNombre, cApellido, oApellido,;
cNombre2, oNombre2, cApellido2, oApellido2, ofld)
TEST->nombre:= cNombre2
TEST->apellido:=cApellido2
cNombre:=cNombre2
oNombre:varput(cNombre2)
oNombre:refresh()
cApellido:=cApellido2
oApellido:varput(capellido2)
oApellido:refresh()
ofld:refresh()
Return nil
Un saludo
Re: Refrescar controles en folderex
Posted: Wed Jan 22, 2020 1:28 pm
by karinha
https://i.imgur.com/B5GCljM.png
Mira:
Code: Select all
#Include "FiveWin.ch"
ANNOUNCE RDDSYS
REQUEST DBFCDX, DBFFPT
FUNCTION Main()
LOCAL oDlg, oFld, oNombre, cNombre := SPACE(30), cApellido := SPACE(20), ;
oApellido
RDDSETDEFAULT ( "DBFCDX" )
USE TEST2
INDEX ON Field->APELLIDO TO TEST2
SET ORDER TO 01
USE
USE TEST2 NEW ALIAS "TEST2" // en \samples solo para teste p/Ramon.
GO TOP
BROWSE()
cNombre := test2->nombre
cApellido := test2->apellido
DEFINE DIALOG oDlg SIZE 400, 300
@ 3, 5 FOLDEREX oFld PIXEL ;
PROMPT "&Uno", "&Dos" ;
SIZE 190, 120
@ 1, 1 GET oNombre VAR cNombre OF oFld:aDialogs[ 1 ]
@ 2, 1 GET oApellido VAR cApellido OF oFld:aDialogs[ 1 ]
@ 4, 14 BUTTON "Cambiar" of oFld:aDialogs[ 1 ] ;
ACTION cambia( cNombre, oNombre, cApellido, oApellido, ofld )
@ 7.2, 14 BUTTON "Salir" ACTION oDlg:End()
ACTIVATE DIALOG oDlg CENTERED
RETURN nil
FUNCTION cambia( cNombre, oNombre, cApellido, oApellido, oFld )
LOCAL oDlg2, cNombre2, oNombre2, cApellido2, oApellido2
cNombre2 := cNombre
cApellido2 := cApellido
DEFINE DIALOG oDlg2 SIZE 400, 300
@ 1, 1 GET oNombre2 VAR cNombre2 OF oDlg2 SIZE 60, 10
@ 3, 1 GET oApellido2 VAR cApellido2 OF oDlg2 SIZE 60, 10
@ 7.2, 10 BUTTON "Cambiar" of oDlg2 ;
ACTION ( graba( cNombre, oNombre, cApellido, oApellido, cNombre2, ;
oNombre2, cApellido2, oApellido2, ofld ), odlg2:end() )
@ 7.2, 20 BUTTON "Cancelar" ACTION oDlg2:End()
ACTIVATE DIALOG oDlg2 CENTERED
RETURN nil
FUNCTION graba( cNombre, oNombre, cApellido, oApellido, cNombre2, oNombre2, ;
cApellido2, oApellido2, ofld )
TEST2->nombre := cNombre2
TEST2->apellido := cApellido2
cNombre := cNombre2
oNombre:varput( cNombre2 )
oNombre:refresh()
cApellido := cApellido2
oApellido:varput( cApellido2 )
oApellido:refresh()
ofld:refresh()
RETURN nil
Saludos y buén trabajo.
Re: Refrescar controles en folderex
Posted: Wed Jan 22, 2020 2:06 pm
by Ramón J.
Muchas gracias, João. Ahora funciona.
Una pregunta:
Si los controles get son de lectura, cómo se actualizarían? Siguiendo tu código sería así, pero no funciona:
Code: Select all
#Include "FiveWin.ch"
ANNOUNCE RDDSYS
REQUEST DBFCDX, DBFFPT
FUNCTION Main()
LOCAL oDlg, oFld, oNombre, cNombre := SPACE(30), cApellido := SPACE(20), ;
oApellido
RDDSETDEFAULT ( "DBFCDX" )
USE TEST2
INDEX ON Field->APELLIDO TO TEST2
SET ORDER TO 01
USE
USE TEST2 NEW ALIAS "TEST2" // en \samples solo para teste p/Ramon.
GO TOP
BROWSE()
cNombre := test2->nombre
cApellido := test2->apellido
DEFINE DIALOG oDlg SIZE 400, 300
@ 3, 5 FOLDEREX oFld PIXEL ;
PROMPT "&Uno", "&Dos" ;
SIZE 190, 120
@ 1, 1 GET oNombre VAR cNombre OF oFld:aDialogs[ 1 ] READONLY UPDATE // <--------- con READONLY no actualiza
@ 2, 1 GET oApellido VAR cApellido OF oFld:aDialogs[ 1 ] READONLY UPDATE //<--------- con READONLY no actualiza
@ 4, 14 BUTTON "Cambiar" of oFld:aDialogs[ 1 ] ;
ACTION cambia( cNombre, oNombre, cApellido, oApellido, ofld )
@ 7.2, 14 BUTTON "Salir" ACTION oDlg:End()
ACTIVATE DIALOG oDlg CENTERED
RETURN nil
FUNCTION cambia( cNombre, oNombre, cApellido, oApellido, oFld )
LOCAL oDlg2, cNombre2, oNombre2, cApellido2, oApellido2
cNombre2 := cNombre
cApellido2 := cApellido
DEFINE DIALOG oDlg2 SIZE 400, 300
@ 1, 1 GET oNombre2 VAR cNombre2 OF oDlg2 SIZE 60, 10
@ 3, 1 GET oApellido2 VAR cApellido2 OF oDlg2 SIZE 60, 10
@ 7.2, 10 BUTTON "Cambiar" of oDlg2 ;
ACTION ( graba( cNombre, oNombre, cApellido, oApellido, cNombre2, ;
oNombre2, cApellido2, oApellido2, ofld ), odlg2:end() )
@ 7.2, 20 BUTTON "Cancelar" ACTION oDlg2:End()
ACTIVATE DIALOG oDlg2 CENTERED
RETURN nil
FUNCTION graba( cNombre, oNombre, cApellido, oApellido, cNombre2, oNombre2, ;
cApellido2, oApellido2, ofld )
TEST2->nombre := cNombre2
TEST2->apellido := cApellido2
cNombre := cNombre2
oNombre:varput( cNombre2 )
oNombre:refresh()
cApellido := cApellido2
oApellido:varput( cApellido2 )
oApellido:refresh()
ofld:refresh()
RETURN nil
Un saludo
Re: Refrescar controles en folderex
Posted: Wed Jan 22, 2020 2:18 pm
by karinha
READONLY = SOLO LECTURA, SOLO PUEDES LEER LA ESCRITURA. NO SE PUEDE MODIFICAR. NO ENTENDÍ LA PREGUNTA.
Saludos.
Re: Refrescar controles en folderex
Posted: Wed Jan 22, 2020 2:51 pm
by Ramón J.
Perdona, João, que no me haya explicado bien.
MIra;
En el folder pongo un get de sólo lectura
@ 1, 1 GET oNombre VAR cNombre OF oFld:aDialogs[ 1 ] READONLY UPDATE
Y quiero cambiar el valor mediante:
@ 4, 14 BUTTON "Cambiar" of oFld:aDialogs[ 1 ] ;
ACTION cambia( cNombre, oNombre, cApellido, oApellido, ofld )
Después se graba con la función:
graba( cNombre, oNombre, cApellido, oApellido, cNombre2, oNombre2, ;
cApellido2, oApellido2, ofld )
TEST2->nombre := cNombre2
TEST2->apellido := cApellido2
cNombre := cNombre2
oNombre:varput( cNombre2 )
oNombre:refresh()
cApellido := cApellido2
oApellido:varput( cApellido2 )
oApellido:refresh()
ofld:refresh()
Lo que quiero decir es que, después de grabar la modificación, no se actualizan los datos del
@ 1, 1 GET oNombre VAR cNombre OF oFld:aDialogs[ 1 ] READONLY UPDATE
Un saludo
Re: Refrescar controles en folderex
Posted: Wed Jan 22, 2020 3:47 pm
by karinha
Use WHEN( lCondicion )
Saludos.
Re: Refrescar controles en folderex
Posted: Wed Jan 22, 2020 4:25 pm
by Ramón J.
Perdona, João, que abuse de tu paciencia
En el ejemplo que has mandado, dónde iria esa función?
Un saludo
Re: Refrescar controles en folderex
Posted: Wed Jan 22, 2020 4:51 pm
by Ramón J.
João, lo he resuelto sustituyendo el GET por SAY y funciona el refresco. No es lo que yo quería, ya que estéticamente prefiero el GET.
Code: Select all
#Include "FiveWin.ch"
ANNOUNCE RDDSYS
REQUEST DBFCDX, DBFFPT
FUNCTION Main()
LOCAL oDlg, oFld, oNombre, cNombre := SPACE(30), cApellido := SPACE(20), ;
oApellido
RDDSETDEFAULT ( "DBFCDX" )
USE TEST2
INDEX ON Field->APELLIDO TO TEST2
SET ORDER TO 01
USE
USE TEST2 NEW ALIAS "TEST2" // en \samples solo para teste p/Ramon.
GO TOP
BROWSE()
cNombre := test2->nombre
cApellido := test2->apellido
DEFINE DIALOG oDlg SIZE 400, 300
@ 3, 5 FOLDEREX oFld PIXEL ;
PROMPT "&Uno", "&Dos" ;
SIZE 190, 120
@ 1, 1 SAY oNombre VAR cNombre OF oFld:aDialogs[ 1 ] SIZE 60,10 //<--- Cambio GET por SAY
@ 2, 1 SAY oApellido VAR cApellido OF oFld:aDialogs[ 1 ] SIZE 60,10 //<--- Cambio GET por SAY
@ 4, 14 BUTTON "Cambiar" of oFld:aDialogs[ 1 ] ;
ACTION cambia( cNombre, oNombre, cApellido, oApellido, ofld )
@ 7.2, 14 BUTTON "Salir" ACTION oDlg:End()
ACTIVATE DIALOG oDlg CENTERED
RETURN nil
FUNCTION cambia( cNombre, oNombre, cApellido, oApellido, oFld )
LOCAL oDlg2, cNombre2, oNombre2, cApellido2, oApellido2
cNombre2 := cNombre
cApellido2 := cApellido
DEFINE DIALOG oDlg2 SIZE 400, 300
@ 1, 1 GET oNombre2 VAR cNombre2 OF oDlg2 SIZE 60, 10
@ 3, 1 GET oApellido2 VAR cApellido2 OF oDlg2 SIZE 60, 10
@ 7.2, 10 BUTTON "Cambiar" of oDlg2 ;
ACTION ( graba( cNombre, oNombre, cApellido, oApellido, cNombre2, ;
oNombre2, cApellido2, oApellido2, ofld ), odlg2:end() )
@ 7.2, 20 BUTTON "Cancelar" ACTION oDlg2:End()
ACTIVATE DIALOG oDlg2 CENTERED
RETURN nil
FUNCTION graba( cNombre, oNombre, cApellido, oApellido, cNombre2, oNombre2, ;
cApellido2, oApellido2, ofld )
TEST2->nombre := cNombre2
TEST2->apellido := cApellido2
cNombre := cNombre2
oNombre:varput( cNombre2 )
oNombre:refresh()
cApellido := cApellido2
oApellido:varput( cApellido2 )
oApellido:refresh()
ofld:refresh()
RETURN nil
Muchas gracias
Un saludo
Re: Refrescar controles en folderex
Posted: Wed Jan 22, 2020 5:00 pm
by karinha
Teste ahora. mira se comprende el uso de WHEN( .T. ) // .F.
Code: Select all
// \SAMPLES\RAMON2.PRG
#Include "FiveWin.ch"
ANNOUNCE RDDSYS
REQUEST DBFCDX, DBFFPT
STATIC lCondicion := .T.
FUNCTION Main()
LOCAL oDlg, oFld, oNombre, cNombre := SPACE(30), cApellido := SPACE(20), ;
oApellido
RDDSETDEFAULT ( "DBFCDX" )
USE TEST2
INDEX ON Field->APELLIDO TO TEST2
SET ORDER TO 01
USE
USE TEST2 NEW ALIAS "TEST2" // en \samples solo para teste p/Ramon.
GO TOP
BROWSE()
cNombre := test2->nombre
cApellido := test2->apellido
DEFINE DIALOG oDlg SIZE 400, 300
@ 3, 5 FOLDEREX oFld PIXEL ;
PROMPT "&Uno", "&Dos" ;
SIZE 190, 120
@ 1, 1 GET oNombre VAR cNombre OF oFld:aDialogs[ 1 ] WHEN( lCondicion )
@ 2, 1 GET oApellido VAR cApellido OF oFld:aDialogs[ 1 ] WHEN( lCondicion )
@ 4, 14 BUTTON "Cambiar" of oFld:aDialogs[ 1 ] ;
ACTION cambia( cNombre, oNombre, cApellido, oApellido, oFld )
@ 7.2, 14 BUTTON "Salir" ACTION oDlg:End()
ACTIVATE DIALOG oDlg CENTERED
RETURN nil
FUNCTION cambia( cNombre, oNombre, cApellido, oApellido, oFld )
LOCAL oDlg2, cNombre2, oNombre2, cApellido2, oApellido2
cNombre2 := cNombre
cApellido2 := cApellido
DEFINE DIALOG oDlg2 SIZE 400, 300
@ 1, 1 GET oNombre2 VAR cNombre2 OF oDlg2 SIZE 60, 10
@ 3, 1 GET oApellido2 VAR cApellido2 OF oDlg2 SIZE 60, 10
@ 7.2, 10 BUTTON "Cambiar" of oDlg2 ;
ACTION ( graba( cNombre, oNombre, cApellido, oApellido, cNombre2, ;
oNombre2, cApellido2, oApellido2, oFld ), odlg2:end() )
@ 7.2, 20 BUTTON "Cancelar" ACTION oDlg2:End()
ACTIVATE DIALOG oDlg2 CENTERED
lCondicion := .F.
RETURN nil
FUNCTION graba( cNombre, oNombre, cApellido, oApellido, cNombre2, oNombre2, ;
cApellido2, oApellido2, oFld )
TEST2->nombre := cNombre2
TEST2->apellido := cApellido2
cNombre := cNombre2
oNombre:varput( cNombre2 )
oNombre:refresh()
cApellido := cApellido2
oApellido:varput( cApellido2 )
oApellido:refresh()
oFld:refresh()
/*
IF RAMON_CONDICION
lCondicion := .F.
oNobre:Refresh()
ENDIF
*/
RETURN nil
Re: Refrescar controles en folderex [RESUELTO]
Posted: Wed Jan 22, 2020 5:15 pm
by Ramón J.
Ya funciona
Muchas gracias, João
Un saludo