Page 1 of 1

Varias evaluaciones de bEditValid de la clase TxBrwColumn

PostPosted: Thu Mar 02, 2006 4:06 pm
by Biel EA6DD
Hola amigos,
estoy utilizando el siguente codigo en un TxBrowse sobre un array
Code: Select all  Expand view
   oBrw:aCols[1]:cHeader      := 'TIP'
   oBrw:aCols[1]:cEditPicture := '@k 99'
   oBrw:aCols[1]:bClrEdit     := oBrw:bClrStd
   oBrw:aCols[1]:bOnPostEdit  := {|o,x| aLin[ oBrw:nArrayAt,1] := x}
   oBrw:aCols[1]:nEditType    := EDIT_GET
   oBrw:aCols[1]:bEditValid   := {|oGet| ChkTip(oGet,oSayTip)


El "problema" es que bEditValid, es evaluado varias veces, si lo que se evalua no visualiza nada por pantalla tipo (MsgAlert('Tipo no existe')), ni me entero, pero en mi caso que si quiero visualizar el mensaje de error, pos eso que si hay alguna solución. Si en lugar de hacer un msgAlert, visualizo el error en un oSay del dialogo funciona bien, pero no es lo ideal. Alguna sugerencia. ?
Gracias anticipadas.
Saludos.

Con un ejemplo funcional se entiende mejor

PostPosted: Fri Mar 03, 2006 2:33 pm
by Biel EA6DD
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,{i,'Descripción '+Str(i)})
   NEXT
   DEFINE WINDOW oWnd
   //--Definición Objeto TxBrowse
   oBrw:=TxBrowse():New(oWnd)
   oBrw:SetArray(aLin)
   oBrw:nColDividerStyle := LINESTYLE_BLACK
   oBrw:nRowDividerStyle := LINESTYLE_BLACK
   oBrw:nMarqueeStyle    := MARQSTYLE_HIGHLCELL

   oBrw:aCols[1]:cHeader      := 'Cod'
   oBrw:aCols[1]:cEditPicture := '@k 99'
   oBrw:aCols[1]:bClrEdit     := oBrw:bClrStd
   oBrw:aCols[1]:bOnPostEdit  := {|o,x| aLin[ oBrw:nArrayAt,1] := x }
   oBrw:aCols[1]:nEditType    := EDIT_GET
   oBrw:aCols[1]:bEditValid   := {|oGet| Valida(oGet:Value()) } //<========
   //--
   oBrw:aCols[2]:cHeader      := 'Descripción'
   oBrw:aCols[2]:bClrEdit     := oBrw:bClrStd
   oBrw:aCols[2]:bOnPostEdit  := {|o,x| aLin[ oBrw:nArrayAt,2] := x }
   oBrw:aCols[2]:nEditType    := EDIT_GET
   //--
   oBrw:CreateFromCode()
   oWnd:oClient:=oBrw
   ACTIVATE WINDOW oWnd
RETURN NIL
//-----------------------------------
STATIC FUNCTION Valida(nVal)
//-----------------------------------
    LOCAL lValRet:=.T.
    IF nVal>6
        MsgAlert('No puede ser mayor que 6')
        lValRet:=.f.
    ENDIF
RETURN lValRet

Si lo ejecutais y en la columna cod poneis un valor superior a 6 vereeis como el codeblock valid es evaluado 2 veces.
En mi aplicación lo que pretendo es cmprobar la existencia de un codigo en una tabla, y visualizar mensaje en caso de que no exista, o visualizar un dialogo para que seleccione uno de valido. La verdad que llevo dos dias con FW e igual estoy haciendo algo mal.
Cualquier ayuda sera bien venida.
Gracias anticipadas.

PostPosted: Fri Mar 03, 2006 6:37 pm
by Antonio Linares
Biel,

El MsgAlert() provoca una pérdida de foco que dispara una comprobación extra del valid. Una solución es esta:
Code: Select all  Expand view
   oBrw:aCols[1]:bEditValid   := {|oGet| Valida( oGet ) }
   ...

STATIC FUNCTION Valida( oGet )
//-----------------------------------
    LOCAL lValRet:=.T.
    local bValid := oGet:bValid
    local nVal := oGet:Value()
   
    oGet:bValid = nil
   
    IF nVal>6
        MsgAlert('No puede ser mayor que 6')
        lValRet:=.f.
    ENDIF
   
    oGet:bValid = bValid
RETURN lValRet

PostPosted: Tue Mar 07, 2006 9:32 am
by Biel EA6DD
Gracias Antonio, efectivmanete con esta modificación solo se evalua una vez, pero aunque en este ejemplo todo queda funcionando bien, en el real tengo problemas con el foco(no vuelve al campo editado) y con el valid en si. Ahora ando algo liado, y obtare por visualizar los mensajes en un oSay, y así no hay perdida de foco, y todo parece funcionar bien. Mas adelante, volvere a revisarlo con el msgAlert.