Saludos Carles...
Si se ejecuta 2 veces...
Si mal no recuerdo creo que el asunto es asi:
Cuando se edita se crea un objeto GET que se le pasa el bEditValid del xBrowse al
bValid del Get, el valid hace su trabajo no dejando salir de edicion hasta que se cumpla la condicion, cuando sale de la edicion ahora se ejecuta el bPostEdit que este a su vez manipula el objeto GET que tiene contenido el valid, por eso se ejecuta 2 veces, en GET y en el PostEdit
Sugerencia...
No hace falta que coloques en el valid el oCol:PostEdit(), la clase se encarga automaticamente del PostEdit al salir de edicion
Te doy 2 Posibles soluciones
1ra.
- Code: Select all Expand view
FUNCTION MAIN()
local oWnd, aLin := {}, i, oBrw, lValid := .F., lRet
for i := 1 TO 6
AAdd( aLin, { "Description " + Str( i ) } )
next
DEFINE WINDOW oWnd
oBrw := TxBrowse():New( oWnd )
oBrw:SetArray( aLin )
oBrw:aCols[1]:cHeader := 'Description'
oBrw:aCols[1]:bOnPostEdit := { | oCol, xVal, nKey | If( lValid, If( nKey == VK_RETURN, aLin[ oBrw:nArrayAt,1] := xVal,), ) }
oBrw:aCols[1]:bEditValid := { | oGet, oCol | lRet := .T., ;
If( ! lValid, ;
( lRet := MiValid( oGet:Value() ), lValid := lRet ),;
lValid := ! lRet ), lRet }
oBrw:aCols[1]:nEditType := EDIT_GET
oBrw:CreateFromCode()
oWnd:oClient:=oBrw
ACTIVATE WINDOW oWnd
RETU NIL
Function MiValid( cValue )
local lRet := .T.
if AllTrim( cValue ) == "123"
lRet = .F.
endif
LogFile( "msg.txt", { cValue } )
return lRet
2da. ( esta pruebala detalladamente con varios casos )
Aprovechando que cada vez que se entra en estado de edicion se genera un objeto GET nuevo y se reasigna los valores entonces podemos eliminar el valid del GET en el methodo PostEdit, ya que se reestablecera nuevamente cuando se vuelva a entrar en edicion...
Abre xbrowse.prgBusca METHOD PostEdit( xValue, lButton ) CLASS TXBrwColumnen ese metodo
Coloca despues de ::lOnPostEdit := .t.- Code: Select all Expand view
if ::oEditGet != nil
::oEditGet:bValid = nil
endif
Guarda y cierraTe dejo un ejemplo de como funciona, te repito debesrias probar esta forma un poco mas a fondo, teoricamente pienso que esta bien ( ya sabes como son las cosas en la practica )
- Code: Select all Expand view
FUNCTION MAIN()
local oWnd, aLin := {}, i, oBrw, lValid := .F., lRet
for i := 1 TO 6
AAdd( aLin, { "Description " + Str( i ) } )
next
DEFINE WINDOW oWnd
oBrw := TxBrowse():New( oWnd )
oBrw:SetArray( aLin )
oBrw:aCols[1]:cHeader := 'Description'
oBrw:aCols[1]:bOnPostEdit := { | oCol, xVal, nKey | If( nKey == VK_RETURN, aLin[ oBrw:nArrayAt,1] := xVal,) }
oBrw:aCols[1]:bEditValid := { | oGet, oCol | MiValid( oGet:Value() ) }
oBrw:aCols[1]:nEditType := EDIT_GET
oBrw:CreateFromCode()
oWnd:oClient:=oBrw
ACTIVATE WINDOW oWnd
RETU NIL
Function MiValid( cValue )
local lRet := .T.
if AllTrim( cValue ) == "123"
lRet = .F.
endif
return lRet