Raro comportamiento XBROWSE (Bug?)
Posted: Mon Aug 29, 2011 10:58 pm
Amigos todos.
De casualidad, he notado un rarisimo comportamiento en Xbrowse (ver 10.06). Me explico:
En un ambiente MDI, tengo una ventana oChild of oWnd, que contiene un xbrowse para editar datos.
Este browse esta condicionado para que al llegar al final y sobrepasarlo (bPastEof), agrega un registro en blanco listo para su edicion. Si no se introduce ningun valor y se oprime enter, este estado se evalua y aparece un dialog de donde escoger los datos necesarios. (imaginemos que este dialog contiene el catalogo de productos).
Pués bien, si se utilizan las teclas direcciones para sobrepasar los items en el xbrowse, todo trabaja muy bien.
Pero... si se usa la flechita de abajo del scroll vertical, al sobrepasar aparece un registro en blanco, y si se da otro click a la flechita y se mantiene el cursor del mouse sobre ella, se dispara un evento de manera incontenible, abriendo el mencionado dialogo y esta accion no se detiene hasta que se coloca el mouse sobre el dialogo, teniendo que cerrar cada uno de ellos para continuar. Si esto no se hace inmediatamente, se puede llegar a consumir todos los recursos del equipo, y ya se sabe los resultados cuando esto sucede.
He codificado un pequeño ejemplo que muestro aquí, para que se compruebe lo expuesto. Uso el fichero Clientes.dbf que se encuentra en la carpeta de Samples.
Agradeceria vuestra ayuda para solucionar esto. He tenido que quitar el scroll vertical del xbrowse.
Saludos.
De casualidad, he notado un rarisimo comportamiento en Xbrowse (ver 10.06). Me explico:
En un ambiente MDI, tengo una ventana oChild of oWnd, que contiene un xbrowse para editar datos.
Este browse esta condicionado para que al llegar al final y sobrepasarlo (bPastEof), agrega un registro en blanco listo para su edicion. Si no se introduce ningun valor y se oprime enter, este estado se evalua y aparece un dialog de donde escoger los datos necesarios. (imaginemos que este dialog contiene el catalogo de productos).
Pués bien, si se utilizan las teclas direcciones para sobrepasar los items en el xbrowse, todo trabaja muy bien.
Pero... si se usa la flechita de abajo del scroll vertical, al sobrepasar aparece un registro en blanco, y si se da otro click a la flechita y se mantiene el cursor del mouse sobre ella, se dispara un evento de manera incontenible, abriendo el mencionado dialogo y esta accion no se detiene hasta que se coloca el mouse sobre el dialogo, teniendo que cerrar cada uno de ellos para continuar. Si esto no se hace inmediatamente, se puede llegar a consumir todos los recursos del equipo, y ya se sabe los resultados cuando esto sucede.
He codificado un pequeño ejemplo que muestro aquí, para que se compruebe lo expuesto. Uso el fichero Clientes.dbf que se encuentra en la carpeta de Samples.
- Code: Select all Expand view
- #include "FiveWin.ch"
#include "xbrowse.ch"
static oWnd
//----------------
Function Main()
SET DELETED ON
DEFINE WINDOW oWnd MDI TITLE "PRUEBA DE XBROWSE"
ACTIVATE WINDOW oWnd MAXIMIZED ;
ON INIT Prueba()
return nil
//----------------------------//
Function Prueba()
local oChild, oBrw, oCol
local cAlias
local oBotSave,oBotCanc
DbUseArea(.t.,,"Clientes","Clientes",.F.)
cAlias:=Alias()
DEFINE WINDOW oChild MDICHILD OF oWnd TITLE "PRUEBA XBROWSE"
@34,700 BTNBMP oBotSave LEFT 2007 PROMPT "Guardar" SIZE 100,28 OF oChild ACTION msgInfo("Hola")
@oBotSave:nBottom+8,700 BTNBMP oBotCanc LEFT 2007 PROMPT "Cancelar" SIZE 100,28 OF oChild ACTION oWnd:End()
oBrw := TXBrowse():New( oChild )
oBrw:cAlias := cAlias
oBrw:nMarqueeStyle := MARQSTYLE_HIGHLCELL
oBrw:nColDividerStyle := LINESTYLE_INSET
oBrw:nRowDividerStyle := LINESTYLE_INSET
oBrw:lColDividerComplete := .t.
oBrw:lFooter := .t.
oBrw:lRecordSelector := .t.
oBrw:lFastEdit := .t.
oBrw:bPastEof = {|| if( lCCtaOK(oBrw), (Dbappend(), oBrw:GoLeftMost(), oBrw:Refresh(), oBrw:aCols[ 1 ]:Edit() ),) }
oCol = oBrw:AddCol()
oCol:bEditValue = { || (cAlias)->telefono }
oCol:cHeader := "TELEFONO"
oCol:nEditType = EDIT_GET
oCol:nWidth = 140
oCol:bGetChange = {| k, f, o, oCol | If( Len( RTrim( o:oGet:Buffer ) ) == Len( o:oGet:Buffer ),; //Daniel
( o:SendMsg( WM_KEYDOWN, VK_RETURN ) ), ) } //Daniel
oCol:bOnPostEdit = { | oCol, xVal, nKey | If( RecCount() == 0, ( DbAppend(), oBrw:Refresh() ),) ,;
If( nKey == VK_RETURN, ((cAlias)->telefono := xVal,if(lCCtaOK(oBrw),oBrw:nColSel:=1,)) , ) ,;
If( nKey == VK_ESCAPE .and. Empty((cAlias)->telefono), ( (cAlias)->(dbDelete()),(cAlias)->(__dbPack()),(cAlias)->(dbGoBottom()),oBrw:Refresh() ), ) }
oCol = oBrw:AddCol()
oCol:bEditValue = { || (cAlias)->nombre }
oCol:cHeader := "NOMBRE"
oCol:nEditType = EDIT_GET
oCol:nWidth = 230
oCol:bGetChange = {| k, f, o, oCol | If( Len( RTrim( o:oGet:Buffer ) ) == Len( o:oGet:Buffer ),; //Daniel
( o:SendMsg( WM_KEYDOWN, VK_RETURN ) ), ) } //Daniel
oCol:bOnPostEdit = { | oCol, xVal, nKey | If( RecCount() == 0, ( DbAppend(), oBrw:Refresh() ),) ,;
If( nKey == VK_RETURN, ((cAlias)->nombre := xVal,if(lCCtaOK(oBrw),oBrw:nColSel:=1,)), ) }
oBrw:SetRDD()
oBrw:CreateFromCode()
oBrw:bKeyDown :={ | nKey | if(nKey == VK_DELETE, ( (oBrw:cAlias)->(dbdelete()), (oBrw:cAlias)->(dbpack()), oBrw:Refresh() ),) }
oChild:bGotFocus = { || dbselectarea( cAlias ) }
ACTIVATE WINDOW oChild MAXIMIZED;
ON INIT ( oBrw:nHeight := oChild:nHeight-163, oBrw:nWidth := oChild:nWidth-12, oBrw:nTop:=130 ) ;
VALID ( oBrw:CancelEdit(),(cAlias)->(dbCloseArea()), .T. )
RETURN NIL
//----------------//
Function lCCtaOK(oBrw)
local oDlg
local cCodigo:=(oBrw:cAlias)->telefono
if empty(cCodigo)
DEFINE DIALOG oDlg FROM 1,1 TO 30,60
ACTIVATE DIALOG oDlg CENTERED
return .f.
endif
Return .t.
Agradeceria vuestra ayuda para solucionar esto. He tenido que quitar el scroll vertical del xbrowse.
Saludos.