Page 1 of 1
Varias evaluaciones de bEditValid de la clase TxBrwColumn
Posted: 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
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
Posted: Fri Mar 03, 2006 2:33 pm
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.
Posted: 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
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
Posted: 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.