Hola amigos: Estoy desarrollando un pequeño aplicativo con tXbrowse, pero me he encontrado con los siguientes problemas:
1- Utilizando la edición directa en xbrowse, cuando ya se ha editado determinada celda (xVal grabado), y regreso a la misma celda, oprimo enter como que voy a editar de nuevo pero no lo hago; oprimo enter para salir, y el valor cambia cuando es una cantidad mayor a centenas. Es decir, si tenía un valor no mayor de 999.99 todo bien... pero si era 1.000.00 lo convierte en 1.00, si era 11.000.00 en 11.00, etc. ¿Qué sucede aquí?
2- En un oBrw creado desde recursos (oBrw:CreateFromResources(181), cuando oprimo la tecla ENTER en una columna editable, no hace nada y el cursor se sale del oBrw y pasa al siguiente control (por Ej: un botón). Si la edito utilizando doble click, todo bien. En un entorno MDI usando MDICHILDS funciona correctamente. ¿Qué hago mal? He tenido que hacer un truco, pero es anti-estético y no estoy seguro de que sea correcto. Aquí el código:
Cuento con su amable asistencia para solucionar esto.
...
...
DBSELECTAREA(cFicTemp)
oBrw := TXBrowse():New( oDlg )
oBrw:cAlias := (cFicTemp)
//ESTILOS
oBrw:lKinetic := .f.
oBrw:nMarqueeStyle := MARQSTYLE_HIGHLCELL //barra selectora (celda)
oBrw:nColDividerStyle := LINESTYLE_INSET
oBrw:nRowDividerStyle := LINESTYLE_INSET
oBrw:lColDividerComplete := .t. //completa pintado hasta el footer cuando lineas no llenan todo el browse
oBrw:nRowHeight := 20 //altura entre lineas
oBrw:lTransparent := .t.
oBrw:lContrastClr := .f. //para que no cambie color de texto automaticamente segun intensidad del fondo
oBrw:nStretchCol := STRETCHCOL_LAST //llenar espacio con ultima columna
oBrw:lAllowRowSizing := .f. // If true horizontal row sizing is allowed
oBrw:lAllowColSwapping := .f. // Si es .t., intercambiar col es permitido
//HEADERS Y FOOTERS
oBrw:nHeaderHeight := 36 //Altura cabeceras de col
oBrw:nHeaderLines := 2 //Lineas del header
oBrw:lFooter := .t. //Que tendrá footer
oBrw:nFooterLines := 1 //Lineas del footer
oBrw:nFooterHeight := 30 //Altura del Footer
oBrw:lRecordSelector := .t. //poner o no, COL de la flechita de la izq
//COLORES (texto y fondo del texto)
oBrw:bClrHeader := {|| { nRGB(140, 0, 0), nRGB(231,242,255) } }
oBrw:bClrFooter := oBrw:bClrHeader
oBrw:bClrStd := {|| { nRGB( 0, 0, 0), nRGB(255,248,220) } } // colores para lineas normales
oBrw:bClrSel := {|| { nRGB( 0, 0, 0), aGradBarSel } } // para barra de linea selecc cuando el control no tiene el foco
oBrw:bClrSelFocus := { || { CLR_BLACK, aGradBarSelFocus } } // para barra de linea selecc cuando el control tiene el foco
oBrw:oFont = oFont
oBrw:lFastEdit := .t.
//COLUMNAS DEL BROWSE
...
...
oCol = oBrw:AddCol()
oCol:bStrData = { || Transform((cFicTemp)->CuotaNum,"9999") }
oCol:nDataStrAlign := 1
oCol:cHeader = "Cuota" +CRLF+ "Num"
oCol:nWidth = 40
oCol:nEditType = 0 //no editable
oCol = oBrw:AddCol()
oCol:bStrData = { || Transform((cFicTemp)->PagoPrinc,"@Z 999,999,999.99") }
oCol:nDataStrAlign := 1
oCol:cHeader = "Pago" +CRLF+ "Principal"
oCol:nWidth = 100
oCol:nEditType = EDIT_GET
oCol:bOnPostEdit = { | oCol, xVal, nKey | If( nKey == VK_RETURN, ((cFicTemp)->PagoPrinc := VAL(xVal), Eval(bRecibido)) ,) }
oBrw:CreateFromResource(181)
oBrw:SetRDD()
oBrw:bKeyDown = { | nKey | TeclasDown( oBrw, nKey, bPagaDoc,bRecibido ) }
oBrw:bKeyChar = { | nKey | TeclasChar( oBrw, nKey, bAbonaDoc,bRecibido ) }
REDEFINE BUTTONBMP oBotAcept ID 100 OF oDLG BITMAP "ACEPTAR" TEXTRIGHT ;
ACTION IF(RCajaOK(nTotRecib,cCodigo, cDocum,dFecha,cConcepto1,cConcepto2,cCkEfect),(lSave:=.t.,oDlg:End(),SysRefresh()),lSave:=.f.)
oBotAcept:cTooltip := "Grabar e imprimir el documento"
REDEFINE BUTTONBMP oBotCance ID 101 OF oDLG BITMAP "CANCELAR" TEXTRIGHT ;
ACTION ( lSave:=.f., oDLG:END() ) CANCEL
oBotCance:cTooltip := "Abandonar edicion del documento"
ACTIVATE DIALOG oDlg NOWAIT ; //CENTERED ;
ON INIT ( oDlg:SetSize(oWnd:nWidth()-10,oWnd:nHeight()-4), oDlg:Move(0,0) ,;
oBrw:SetBackGround(".\STONE.BMP"), oBrw:Refresh() ,;
VALID if(!lSave, if(!empty((cFicTemp)), MsgNoYes("¿Está seguro(a) de abandonar la edición del documento?","Advertencia"),.t.),.t.)
oBrush:End()
oFont:End()
...
...
//-----------------------------------------------------------------//ESTE ES EL TRUCO
Static function TeclasChar( oBrw, nKey, bAbonaDoc, bRecibido )
local oCol
oCol:=oBrw:SelectedCol()
if oCol:lEditable
do case
case nKey == VK_RETURN
MsgRun("",,{|| inkey(.01) }) //SIN ESTO NO FUNCIONA, ¿WHY?
Eval(bAbonaDoc)
endcase
endif
return nil
//-----------------------------------------------------------//
Static function TeclasDown( oBrw, nKey, bPagaDoc, bRecibido )
do case
case nKey == VK_SPACE
Eval(bPagaDoc)
endcase
return nil
Saludos.