FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour TXBrowse -> Se ejecuta 2 veces ::bEditValid ?
Posts: 1283
Joined: Fri Feb 10, 2006 02:34 PM
TXBrowse -> Se ejecuta 2 veces ::bEditValid ?
Posted: Tue Jun 23, 2009 10:12 AM
Hola,

Pues eso, parece ser q se me ejecuta 2 veces o hago algo mal, no se....

Code (fw): Select all Collapse
# INCLUDE "FiveWin.ch"
# INCLUDE "XBrowse.ch"

FUNCTION MAIN()

   local oWnd, aLin := {}, i, oBrw

   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 | ( MsgInfo( oGet:VarGet(), 'bEditValid'), oCol:PostEdit(), .t. ) }
      oBrw:aCols[1]:nEditType    := EDIT_GET

      oBrw:CreateFromCode()

      oWnd:oClient:=oBrw

   ACTIVATE WINDOW oWnd

RETU NIL


Alguna idea ?
Salutacions, saludos, regards

"...programar es fácil, hacer programas es difícil..."

UT Page -> https://carles9000.github.io/
Forum UT -> https://discord.gg/bq8a9yGMWh
HIX -> https://github.com/carles9000/hix
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 PM
Re: TXBrowse -> Se ejecuta 2 veces ::bEditValid ?
Posted: Wed Jun 24, 2009 10:09 AM
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 (fw): Select all Collapse
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.prg
Busca METHOD PostEdit( xValue, lButton ) CLASS TXBrwColumn
en ese metodo
Coloca despues de ::lOnPostEdit := .t.

Code (fw): Select all Collapse
   if ::oEditGet != nil
      ::oEditGet:bValid = nil
   endif


Guarda y cierra

Te 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 (fw): Select all Collapse
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
Posts: 1283
Joined: Fri Feb 10, 2006 02:34 PM
Re: TXBrowse -> Se ejecuta 2 veces ::bEditValid ?
Posted: Thu Jun 25, 2009 07:00 AM
Daniel,

Yo creo q la primera solucion es liosa, en cuanto siempre tienes de estar pendiente de este tipo de control. La segunda es la mas aceptable, q sea la propia clase quien lo gestione, yo no tengo porque preocuparme, leche :-)

Yo habia hecho un cambio similar y hasta ahora parece el comportamiento sea correcto. Piensa p.e. q el hecho de validar 2 veces, si estas conectado desde un entorno lento, via vpn, ... y tienes de chequear o validar datos, 2 veces se nota y demora el proceso.

Yo tenia en el ::postedit
Code (fw): Select all Collapse
   do case
      case ::nEditType == EDIT_GET
         if ::oEditGet != nil
            if ::cDataType == 'N'
               nVal        := ::Value()
            endif
            Eval( ::bOnPostEdit, Self, Eval( ::oEditGet:bSetGet ),::oEditGet:nLastKey )
            nLastKey := ::oEditGet:nLastKey
            lGoNext := ( AScan( { VK_RETURN, VK_DOWN, VK_UP, VK_TAB },::oEditGet:nLastKey ) > 0 )
            ::oEditGet:bValid = nil         // CAF
            ::oEditGet:End()
            ::oEditGet := nil
         endif


Pero creo q el tuyo afecta directamente a todos los ::oEditGet y es mas correcto


Gracias.
Salutacions, saludos, regards

"...programar es fácil, hacer programas es difícil..."

UT Page -> https://carles9000.github.io/
Forum UT -> https://discord.gg/bq8a9yGMWh
HIX -> https://github.com/carles9000/hix
Posts: 1816
Joined: Wed Oct 26, 2005 02:49 PM
Re: TXBrowse -> Se ejecuta 2 veces ::bEditValid ?
Posted: Sat May 28, 2011 04:00 PM

Daniel Gracias Funciono de mil maravillas.

Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Turbo Incremental Link64 6.98 Embarcadero 7.70 ] [ FiveWin 25.01 ] [ xHarbour 64 bits) ]

Continue the discussion