Ayuda: Estoy empezando a usar xBrowse
Posted: Fri Sep 19, 2008 6:20 pm
Amigos del foro: Estoy por decidirme a utilizar xBrowse y en mis primeras pruebas he logrado algunos avances. Puedo hacerlo en codigo xBase, pero, deseo llevar a cabo la creacion utilizando FOR...NEXT. (quiero editar una DBF con _ (45) creando el browse de manera automatica). Como dije, he logrado algún avance, pero estoy "pegado" en lo que corresponde a bEditValid y cEditPicture. Estos no me trabajan. Estoy utilizando el modo lFastEdit y deseo validar _ y en los numericos que el get aparezca con el picture "999,999,999.99".
Pueden ayudarme con un pequeño ejemplo funcional?
He probado todos los ejemplos que he visto en el foro, pero no lo consigo:
Una de las validaciones es que aunque se haya entrado el valor y se oprime tecla scape que no cambie el valor (lo hace indistintamente)
Aquí está el código: (FWH 7.12)
//-------------------------------
Function MiXBrow(oRecta,oBar)
local oChild, cAlias, oBrw, oCol
local n:=0
DBUSEAREA(.T.,,"WMDATA",cAlias:=cGetNewAlias("WMDAT"),.t.)
dbSelectArea(cAlias)
DEFINE WINDOW oChild MDICHILD OF oWnd TITLE "FICHERO: " + cAlias ;
FROM 0, oRecta:nWidth+1 TO oWnd:nHeight-140, oWnd:nWidth-4 PIXEL ;
COLOR nRGB(247, 243, 232), nRGB(228, 213, 184) //CREMITA
oBrw := TXBrowse():New( oChild )
oBrw:cAlias := cAlias //nunca omitir esto
//ESTILOS DE LINEAS
oBrw:nColDividerStyle := LINESTYLE_INSET
oBrw:nRowDividerStyle := LINESTYLE_INSET
//HEADERS Y FOOTERS
oBrw:nHeaderHeight := 30 //Altura cabeceras de col
oBrw:lFooter := .t. //Que tendrá footer
oBrw:nFooterLines := 1 //Lineas del footer
oBrw:nFooterHeight := 24 //Altura del Footer
//COLORES (texto y fondo del texto)
oBrw:bClrHeader := {|| { nRGB(140, 0, 0), nRGB(229,0,0) } } // VERDECITO
oBrw:bClrFooter := {|| { nRGB(255,248,220), nRGB(157,138, 0) } } // VERDECITO
oBrw:bClrStd := {|| { nRGB( 0, 0, 0), nRGB(255,248,220) } } // colores para lineas normales
oBrw:bClrSel := {|| { nRGB(255,255,255), nRGB(241,222,088) } } // para barra de linea selecc cuando el control no tiene el foco
oBrw:bClrSelFocus := {|| { nRGB( 0, 0, 0), nRGB(248,195, 34) } } // para barra de linea selecc cuando el control tiene el foco
oBrw:SetRDD()
//BARRA SELECTORA
oBrw:nMarqueeStyle := MARQSTYLE_HIGHLCELL //solo ilumina la celda actual
//EDICION
oBrw:lFastEdit := .t. //.t.= edicion rapida, salta a sig col
For n:=1 to len( oBrw:aCols )
oCol:=oBrw:aCols[n]
oCol:nEditType := 1 // SETGET Sets or Gets de Edit Mode: 0=none, 1=Get, 2=Listbox, 3=block, 4=Get+Listbox, 5 = Get+block
oCol:bOnPostEdit := {|oCol, uVal, nKey| if(nKey != VK_ESCAPE, FEditar(oCol,uVal,nKey,oBrw),) }
** oCol:bEditValid := {| o,u,n | FValidar( o,u,n ) } //Este
** oCol:cEditPicture := MyPicture( oCol,oBrw ) //Este
Next
oBrw:CreateFromCode()
oChild:oClient := oBrw
ACTIVATE WINDOW oChild ON INIT oBrw:SetFocus()
RETURN NIL
//----------------------------------------
Function FEditar(oCol,uVal,nLastKey,oBrw)
local nValorAnt := Eval( oCol:bEditValue )
IF nLastKey == VK_ESCAPE //no evalua, deja pasar, siempre reemplaza
return nil
endif
If nLastKey == VK_RETURN //.Or. nKey = VK_UP .Or. nKey = VK_DOWN .Or. nKey = VK_LEFT .Or. nKey = VK_RIGHT
if uVal <> nValorAnt //Si se modifico valor en columna actual...
If (oBrw:cAlias)->(PudoBloq(.f.))
FieldPut( oCol:nCreationOrder, TipoDato(@uVal,oBrw,oCol) )
(oBrw:cAlias)->( DbUnLock() )
EndIf
endif
EndIf
Return nil
//-------------------------
Function TipoDato(uVal,oBrw,oCol)
local uValor := uVal
if ValType( (oBrw:cAlias)->(FieldGet(oCol:nCreationOrder)) ) =="N"
uValor := Val(uVal)
endif
return uValor
Pueden ayudarme con un pequeño ejemplo funcional?
He probado todos los ejemplos que he visto en el foro, pero no lo consigo:
Una de las validaciones es que aunque se haya entrado el valor y se oprime tecla scape que no cambie el valor (lo hace indistintamente)
Aquí está el código: (FWH 7.12)
//-------------------------------
Function MiXBrow(oRecta,oBar)
local oChild, cAlias, oBrw, oCol
local n:=0
DBUSEAREA(.T.,,"WMDATA",cAlias:=cGetNewAlias("WMDAT"),.t.)
dbSelectArea(cAlias)
DEFINE WINDOW oChild MDICHILD OF oWnd TITLE "FICHERO: " + cAlias ;
FROM 0, oRecta:nWidth+1 TO oWnd:nHeight-140, oWnd:nWidth-4 PIXEL ;
COLOR nRGB(247, 243, 232), nRGB(228, 213, 184) //CREMITA
oBrw := TXBrowse():New( oChild )
oBrw:cAlias := cAlias //nunca omitir esto
//ESTILOS DE LINEAS
oBrw:nColDividerStyle := LINESTYLE_INSET
oBrw:nRowDividerStyle := LINESTYLE_INSET
//HEADERS Y FOOTERS
oBrw:nHeaderHeight := 30 //Altura cabeceras de col
oBrw:lFooter := .t. //Que tendrá footer
oBrw:nFooterLines := 1 //Lineas del footer
oBrw:nFooterHeight := 24 //Altura del Footer
//COLORES (texto y fondo del texto)
oBrw:bClrHeader := {|| { nRGB(140, 0, 0), nRGB(229,0,0) } } // VERDECITO
oBrw:bClrFooter := {|| { nRGB(255,248,220), nRGB(157,138, 0) } } // VERDECITO
oBrw:bClrStd := {|| { nRGB( 0, 0, 0), nRGB(255,248,220) } } // colores para lineas normales
oBrw:bClrSel := {|| { nRGB(255,255,255), nRGB(241,222,088) } } // para barra de linea selecc cuando el control no tiene el foco
oBrw:bClrSelFocus := {|| { nRGB( 0, 0, 0), nRGB(248,195, 34) } } // para barra de linea selecc cuando el control tiene el foco
oBrw:SetRDD()
//BARRA SELECTORA
oBrw:nMarqueeStyle := MARQSTYLE_HIGHLCELL //solo ilumina la celda actual
//EDICION
oBrw:lFastEdit := .t. //.t.= edicion rapida, salta a sig col
For n:=1 to len( oBrw:aCols )
oCol:=oBrw:aCols[n]
oCol:nEditType := 1 // SETGET Sets or Gets de Edit Mode: 0=none, 1=Get, 2=Listbox, 3=block, 4=Get+Listbox, 5 = Get+block
oCol:bOnPostEdit := {|oCol, uVal, nKey| if(nKey != VK_ESCAPE, FEditar(oCol,uVal,nKey,oBrw),) }
** oCol:bEditValid := {| o,u,n | FValidar( o,u,n ) } //Este
** oCol:cEditPicture := MyPicture( oCol,oBrw ) //Este
Next
oBrw:CreateFromCode()
oChild:oClient := oBrw
ACTIVATE WINDOW oChild ON INIT oBrw:SetFocus()
RETURN NIL
//----------------------------------------
Function FEditar(oCol,uVal,nLastKey,oBrw)
local nValorAnt := Eval( oCol:bEditValue )
IF nLastKey == VK_ESCAPE //no evalua, deja pasar, siempre reemplaza
return nil
endif
If nLastKey == VK_RETURN //.Or. nKey = VK_UP .Or. nKey = VK_DOWN .Or. nKey = VK_LEFT .Or. nKey = VK_RIGHT
if uVal <> nValorAnt //Si se modifico valor en columna actual...
If (oBrw:cAlias)->(PudoBloq(.f.))
FieldPut( oCol:nCreationOrder, TipoDato(@uVal,oBrw,oCol) )
(oBrw:cAlias)->( DbUnLock() )
EndIf
endif
EndIf
Return nil
//-------------------------
Function TipoDato(uVal,oBrw,oCol)
local uValor := uVal
if ValType( (oBrw:cAlias)->(FieldGet(oCol:nCreationOrder)) ) =="N"
uValor := Val(uVal)
endif
return uValor