TXBrowse -> Se ejecuta 2 veces ::bEditValid ?

TXBrowse -> Se ejecuta 2 veces ::bEditValid ?

Postby Carles » 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: Select all  Expand view
# 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
Skype -> https://join.skype.com/cnzQg3Kr1dnk
User avatar
Carles
 
Posts: 1115
Joined: Fri Feb 10, 2006 2:34 pm
Location: Barcelona

Re: TXBrowse -> Se ejecuta 2 veces ::bEditValid ?

Postby Daniel Garcia-Gil » 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: 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.prg
Busca METHOD PostEdit( xValue, lButton ) CLASS TXBrwColumn
en ese metodo
Coloca despues de ::lOnPostEdit := .t.

Code: Select all  Expand view

   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: 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  
 
User avatar
Daniel Garcia-Gil
 
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita

Re: TXBrowse -> Se ejecuta 2 veces ::bEditValid ?

Postby Carles » Thu Jun 25, 2009 7: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 :D

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: Select all  Expand view
  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
Skype -> https://join.skype.com/cnzQg3Kr1dnk
User avatar
Carles
 
Posts: 1115
Joined: Fri Feb 10, 2006 2:34 pm
Location: Barcelona

Re: TXBrowse -> Se ejecuta 2 veces ::bEditValid ?

Postby leandro » Sat May 28, 2011 4: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

[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
User avatar
leandro
 
Posts: 1489
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 39 guests