Raro comportamiento XBROWSE (Bug?)

Raro comportamiento XBROWSE (Bug?)

Postby FranciscoA » 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.
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.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2111
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Raro comportamiento XBROWSE (Bug?)

Postby nageswaragunupudi » Tue Aug 30, 2011 9:15 am

Regards

G. N. Rao.
Hyderabad, India
User avatar
nageswaragunupudi
 
Posts: 10254
Joined: Sun Nov 19, 2006 5:22 am
Location: India


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 5 guests