Varias evaluaciones de bEditValid de la clase TxBrwColumn

Varias evaluaciones de bEditValid de la clase TxBrwColumn

Postby Biel EA6DD » Thu Mar 02, 2006 4:06 pm

Hola amigos,
estoy utilizando el siguente codigo en un TxBrowse sobre un array
Code: Select all  Expand view  RUN
   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: 682
Joined: Tue Feb 14, 2006 9:48 am
Location: Mallorca

Con un ejemplo funcional se entiende mejor

Postby Biel EA6DD » Fri Mar 03, 2006 2:33 pm

Code: Select all  Expand view  RUN
# 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
Biel EA6DD
 
Posts: 682
Joined: Tue Feb 14, 2006 9:48 am
Location: Mallorca

Postby Antonio Linares » Fri Mar 03, 2006 6:37 pm

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  RUN
   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
Antonio Linares
Site Admin
 
Posts: 42122
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby Biel EA6DD » Tue Mar 07, 2006 9:32 am

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


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 53 guests