Varias evaluaciones de bEditValid de la clase TxBrwColumn

Post Reply
User avatar
Biel EA6DD
Posts: 680
Joined: Tue Feb 14, 2006 9:48 am
Location: Mallorca
Contact:

Varias evaluaciones de bEditValid de la clase TxBrwColumn

Post by Biel EA6DD »

Hola amigos,
estoy utilizando el siguente codigo en un TxBrowse sobre un array

Code: Select all

   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.
User avatar
Biel EA6DD
Posts: 680
Joined: Tue Feb 14, 2006 9:48 am
Location: Mallorca
Contact:

Con un ejemplo funcional se entiende mejor

Post by Biel EA6DD »

Code: Select all

# 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.
Saludos desde Mallorca
Biel Maimó
http://bielsys.blogspot.com/
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post 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

   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 
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Biel EA6DD
Posts: 680
Joined: Tue Feb 14, 2006 9:48 am
Location: Mallorca
Contact:

Post 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.
Saludos desde Mallorca
Biel Maimó
http://bielsys.blogspot.com/
Post Reply