Page 1 of 1

Scrolling en Browse al estilo Excel

Posted: Fri May 10, 2019 8:12 am
by Carlos Ortiz
Buenos días.
Me sumo a una pregunta del año pasado en el foro en Ingles acerca de cómo funciona el componente TDBBrowse.
Cuando usamos el componente browse y moves la rueda del mouse se desplaza entre registros y a veces esto esta trasmitiendo mucha info ni hablar si hay 2 o 3 browsers y tienen sus onchanges respectivos, se que hay una sugerencia con un timer pero pregunto
¿hay alguna forma de que el desplazamiento con la rueda del mouse desplace la grilla de datos para arriba o para abajo pero que no se mueva del registro hasta que el usuario haga clic en alguno? sería un funcionamiento similar a Excel o incluso a la misma ventana del editor de código de Xailer te permite ese efecto (claro es otro tipo de control) pero por ahi viendo que ya existe el metodo mousewheel se pudiera hacer algo sencillo.

Gracias

Re: Scrolling en Browse al estilo Excel

Posted: Tue May 14, 2019 12:46 am
by Carlos Ortiz
Le puse un waiton y waitoff en el onchange de la clase y llamativamente dejo de fallar pero claro por cada browse que tiene un detalle me muestra un pantallazo cada vez que me muevo con el scroll del mouse.
Que efecto hace el waiton o enviar un cartel en pantalla que no pueda lograr lo mismo con un refresh o us setfocus???

Code: Select all

METHOD WMMouseWheel( nWParam, nLParam ) CLASS TBrowse
   LOCAL nKeys, nDelta, nXPos, nYPos
   STATIC LastOnChange := 0

   IF Len( ::aDisplay ) == 0
      RETURN Nil
   ENDIF

   ::CancelEdit()

   nKeys  := LoWord( nWParam )
   nDelta := HiWord( nWParam )
   nXPos  := LoWord( nLParam )
   nYPos  := HiWord( nLParam )

   IF abs(nDelta) = 120
      IF ::nLen=0 .or. (::nKeyNo=::nLen .and. nDelta<0) .or. (::nKeyNo=1 .and.  nDelta>0)
         //LogDebug("esta en el primero o en el ultimo")
         RETURN NIL
      ENDIF
   ENDIF

   IF abs(nDelta) = 120
      IF nDelta > 0
         IF ::nKeyNo > 5
            ::Skip(-5)
            ::Refresh( .f. )
         ELSE
            ::GoPageUp()
         ENDIF
      ELSEIF nDelta = -120
         IF ::nKeyNo + 5 < ::nLen
            ::Skip(5)
            ::Refresh( .f. )
         ELSE
            ::GoPageDown()
         ENDIF
      ENDIF[code][code][/code][/code]
      IF ::EventAssigned( "OnChange" )       
         waiton("Actualizando los datos de los detalles")         /// CON ESTO ANDA PERFECTO, SACO EL WAITON Y FALLA
         IF lastOnChange <> ::nKeyNo
            ::OnChange(.t.)
            LastOnChange := ::nKeyNo
         ENDIF
         waitoff()
      ENDIF
   ENDIF
RETURN Nil

Cualquier ayuda será bienvenida, gracias.