Page 1 of 2

La rueda del ratón debe mover todo el reporte arriba y abajo

PostPosted: Sat Aug 16, 2014 10:48 am
by Antonio Linares
Debe proporcionar la misma funcionalidad que al pulsar en la barra de scroll vertical (que parece seguir mal todavía)

Re: La rueda del ratón debe mover todo el reporte arriba y abajo

PostPosted: Sat Aug 16, 2014 11:26 pm
by cnavarro
Antonio Linares wrote:Debe proporcionar la misma funcionalidad que al pulsar en la barra de scroll vertical (que parece seguir mal todavía)


Programa: EREPORT.PRG
Se soluciona con:
Code: Select all  Expand view

Function Main( ... )
...
   oMainWnd:oMsgBar:KeybOn()
   oMainWnd:oWndClient:bMouseWheel= {|nKey, nDelta, nXPos, nYPos| Er_MouseWheel( nKey, nDelta, nXPos, nYPos ) }

   BarMenu()

   ACTIVATE WINDOW oMainWnd ;
...

 


Code: Select all  Expand view

*-- function -----------------------------------------------------------------
* Name........: Er_MouseWheel
* Beschreibung:
* Argumente...:
* Rückgabewert: .t.
* Author......:
*-----------------------------------------------------------------------------

#define MK_MBUTTON          0x0010

function Er_MouseWheel( nKey, nDelta, nXPos, nYPos )
   local aPoint := { nYPos, nXPos }
   
   ScreenToClient( oMainWnd:oWndClient:hWnd, aPoint )

   if IsOverWnd( oMainWnd:oWndClient:hWnd, aPoint[ 1 ], aPoint[ 2 ] )
      if lAnd( nKey, MK_MBUTTON )
         if nDelta > 0
            ScrollVertical( ,,.T. )        //WheelScroll()
         else
            ScrollVertical( ,,,.T.,, )
         endif
      else
         if nDelta > 0
            ScrollVertical( .T.,,,, .T., -(WheelScroll()) )
         else
            ScrollVertical( ,.T.,,, .T., WheelScroll() )
         endif
      endif
      oMainWnd:oWndClient:oVScroll:Refresh()
   endif
return .t.
 


Pero, tal y como indicas, el cálculo del desplazamiento de las ventanas sigue mal

Re: La rueda del ratón debe mover todo el reporte arriba y abajo

PostPosted: Sun Aug 17, 2014 10:04 am
by Antonio Linares
Cristobal,

Implementado, Muchas gracias! :-)

He notado que al mover la rueda del ratón hacia arriba y hacia abajo, se puede apreciar como las areas por debajo de la primera, se van "metiendo" por debajo. Debe haber un fallo de cálculo en las coordenadas, ó alguna función de FWH funciona diferente de como lo hacía entonces...

Re: La rueda del ratón debe mover todo el reporte arriba y abajo

PostPosted: Sun Aug 17, 2014 10:14 am
by cnavarro
Antonio, yo creo que es un problema de cálculo de coordenadas en la funcion ScrollVertical
Antes de implementar esta funcion, cuando movias la barra de scroll vertical ya se movia la ventana hacia abajo

Re: La rueda del ratón debe mover todo el reporte arriba y abajo

PostPosted: Sun Aug 17, 2014 11:03 am
by Antonio Linares
Cristobal,

Si en la línea 655 cambio el valor de nZugabe el comportamiento varia.

No se si es nTotalHeight que esté mal. Tampoco he encontrado en donde se inicializa...

Re: La rueda del ratón debe mover todo el reporte arriba y abajo

PostPosted: Sun Aug 17, 2014 11:17 am
by mastintin
Por si sirve como pista ... al lanzar un informe , si miramos el "botón" del scroll su tamaño es pequeño , como de medio centímetro . si hago un pequeño scroll con la rueda del raton su tamaño no cambia , pero en el segundo scroll pasa a tener un tamaño mucho mayor ( yo diría que el correcto ) . He puesto una pausa en:

FUNCTION ScrollVertical( lUp, lDown, lPageUp, lPageDown, lPos, nPosZugabe )

LOCAL i, aFirstWndCoors, nAltWert
LOCAL nZugabe := 14
LOCAL nPageZugabe := 392
LOCAL aCliRect := oMainWnd:GetCliRect()

DEFAULT lUp := .F.
DEFAULT lDown := .F.
DEFAULT lPageUp := .F.
DEFAULT lPageDown := .F.
DEFAULT lPos := .F.

pausa(1)

UnSelectAll()

FOR i := 1 TO 100
IF aWnd[i] <> NIL
aFirstWndCoors := GetCoors( aWnd[i]:hWnd )
EXIT
ENDIF
NEXT
....

cuando realizo el primer scroll pasa la pausa sin cambiar nada , pero al realizar el segundo scroll se redimensiona antes de llegar a la pausa ...

Re: La rueda del ratón debe mover todo el reporte arriba y abajo

PostPosted: Sun Aug 17, 2014 7:36 pm
by cnavarro
Antonio Linares wrote:Cristobal,

Implementado, Muchas gracias! :-)

He notado que al mover la rueda del ratón hacia arriba y hacia abajo, se puede apreciar como las areas por debajo de la primera, se van "metiendo" por debajo. Debe haber un fallo de cálculo en las coordenadas, ó alguna función de FWH funciona diferente de como lo hacía entonces...


Si, lo vi desde que lo implementé
Prueba esta solucion
Ha mejorado sustancialmente el desplazamiento con la rueda, pero va muy lento, hay que afinarlo
Tambien hay que comprobar el movimiento con la barra de scroll vertical tanto al pulsar en las flechas como en la propia barra

Code: Select all  Expand view

function SetScrollBar()

   local oVScroll
   local nPageZugabe := 392

   if !empty( oMainWnd:oWndClient:oVScroll )
      //oMainWnd:oWndClient:oVScroll:SetRange( 0, 100 )
      oMainWnd:oWndClient:oVScroll:SetRange( 0, nTotalHeight )

      oMainWnd:oWndClient:oVScroll:bGoUp     = {|| ScrollVertical( .T. ) }
      oMainWnd:oWndClient:oVScroll:bGoDown   = {|| ScrollVertical( , .T. ) }
      oMainWnd:oWndClient:oVScroll:bPageUp   = {|| ScrollVertical( ,, .T. ) }
      oMainWnd:oWndClient:oVScroll:bPageDown = {|| ScrollVertical( ,,, .T. ) }
      oMainWnd:oWndClient:oVScroll:bPos      = {| nWert | ScrollVertical( ,,,, .T., nWert ) }
      oMainWnd:oWndClient:oVScroll:nPgStep   = nPageZugabe   //392

      //oMainWnd:oWndClient:oVScroll:Refresh()
      oMainWnd:oWndClient:oVScroll:SetPos(0)
   endif

   if ! Empty( oMainWnd:oWndClient:oHScroll )
      //oMainWnd:oWndClient:oHScroll:SetRange( 0, 100 )
      oMainWnd:oWndClient:oHScroll:SetRange( 0, nTotalWidth )

      oMainWnd:oWndClient:oHScroll:bGoUp     = {|| ScrollHorizont( .T. ) }
      oMainWnd:oWndClient:oHScroll:bGoDown   = {|| ScrollHorizont( , .T. ) }
      oMainWnd:oWndClient:oHScroll:bPageUp   = {|| ScrollHorizont( ,, .T. ) }
      oMainWnd:oWndClient:oHScroll:bPageDown = {|| ScrollHorizont( ,,, .T. ) }
      oMainWnd:oWndClient:oHScroll:bPos      = {| nWert | ScrollHorizont( ,,,, .T., nWert ) }
      oMainWnd:oWndClient:oHScroll:nPgStep   = 602

      oMainWnd:oWndClient:oHScroll:SetPos(0)
   endif

return .T.
 


y tambien

Code: Select all  Expand view

function ScrollVertical( lUp, lDown, lPageUp, lPageDown, lPos, nPosZugabe )

   local i, aFirstWndCoors, nAltWert
   local nZugabe     := WheelScroll() * 14      // Aumentar
   local nPageZugabe := 392
   local aCliRect    := oMainWnd:GetCliRect()

   DEFAULT lUp       := .F.
   DEFAULT lDown     := .F.
   DEFAULT lPageUp   := .F.
   DEFAULT lPageDown := .F.
   DEFAULT lPos      := .F.

   UnSelectAll()

   FOR i := 1 TO 100
      IF aWnd[i] <> nil
         aFirstWndCoors := GetCoors( aWnd[i]:hWnd )
         EXIT
      ENDIF
   NEXT

   
   IF lUp = .T. .OR. lPageUp = .T.
      IF aFirstWndCoors[ 1 ] = 0
         nZugabe := 0
      ELSEIF ( aFirstWndCoors[ 1 ] + IIF( lUp, nZugabe, nPageZugabe ) ) >= 0
         nZugabe     := -1 * aFirstWndCoors[ 1 ]
         nPageZugabe := -1 * aFirstWndCoors[ 1 ]
      ENDIF
   ENDIF

   IF lDown = .T. .OR. lPageDown = .T.
      IF ( aFirstWndCoors[ 1 ] + nTotalHeight ) <= aCliRect[3] - 80
         nZugabe     := 0
         nPageZugabe := 0
      ENDIF
   ENDIF
   

   IF lPos = .T.
      nAltWert := oMainWnd:oWndClient:oVScroll:GetPos()
      oMainWnd:oWndClient:oVScroll:SetPos( nPosZugabe )
      nZugabe := -1 * nTotalHeight * ( oMainWnd:oWndClient:oVScroll:GetPos() - nAltWert ) / nTotalHeight //100
   ENDIF
 

   FOR i := 1 TO 100
      IF aWnd[i] <> nil
         IF lUp = .T. .OR. lPos = .T.
            aWnd[i]:Move( aWnd[i]:nTop + nZugabe, aWnd[i]:nLeft, 0, 0, .T. )
         ELSEIF lDown = .T.
            aWnd[i]:Move( aWnd[i]:nTop - nZugabe, aWnd[i]:nLeft, 0, 0, .T. )
         ELSEIF lPageUp = .T.
            aWnd[i]:Move( aWnd[i]:nTop + nPageZugabe, aWnd[i]:nLeft, 0, 0, .T. )
         ELSEIF lPageDown = .T.
            aWnd[i]:Move( aWnd[i]:nTop - nPageZugabe, aWnd[i]:nLeft, 0, 0, .T. )
         ENDIF
      ENDIF
   NEXT

return .T.
 


https://navarro_cristobal@bitbucket.org ... ort_n1.git

Re: La rueda del ratón debe mover todo el reporte arriba y abajo

PostPosted: Sun Aug 17, 2014 8:07 pm
by cnavarro
Asi muchisimo mejor el desplazamiento con el raton, pero la barra mal

Code: Select all  Expand view

function SetScrollBar()

   local oVScroll
   local nPageZugabe := 392

   if !empty( oMainWnd:oWndClient:oVScroll )
      //oMainWnd:oWndClient:oVScroll:SetRange( 0, 100 )
      oMainWnd:oWndClient:oVScroll:SetRange( 0, nTotalHeight/100 )
.../...
 


Code: Select all  Expand view

function ScrollVertical( lUp, lDown, lPageUp, lPageDown, lPos, nPosZugabe )

.../...

   IF lPos = .T.
      nAltWert := oMainWnd:oWndClient:oVScroll:GetPos()
      oMainWnd:oWndClient:oVScroll:SetPos( nPosZugabe )
      nZugabe := -1 * nTotalHeight * ( oMainWnd:oWndClient:oVScroll:GetPos() - nAltWert ) / ( nTotalHeight / 100 )
   ENDIF
.../...

 

Re: La rueda del ratón debe mover todo el reporte arriba y abajo

PostPosted: Mon Aug 18, 2014 5:30 am
by Antonio Linares
Cristobal,

Esta genial! :-)

Muchísimo mejor y además se solucionó el efecto de que el segundo grupo se iba metiendo debajo del primero! :-D

Veamos donde se crea la barra de scroll y como se ha definido...

Re: La rueda del ratón debe mover todo el reporte arriba y abajo

PostPosted: Thu Aug 21, 2014 6:49 pm
by mgsoft
Hola,

Me temo que no funciona, cuando usas el scrollbar de la WndMain se acaba quedando la pantalla en blanco sin las áreas.

Pero ya cada vez tiene una pinta impresionante y mucho más rápido que el vrd.exe de Tim.

Re: La rueda del ratón debe mover todo el reporte arriba y abajo

PostPosted: Sun Aug 24, 2014 7:04 pm
by lucasdebeltran
Si se maneja la rueda del ratón con la versión de hoy funciona OK.

Ahora bien, efectivamente como apunta Eduardo si se maneja la barra de scroll de la ventana del diseñador entonces desaparece todo el diseño y se queda la pantalla en gris:

Image

Re: La rueda del ratón debe mover todo el reporte arriba y abajo

PostPosted: Sun Aug 31, 2014 6:15 pm
by lucasdebeltran
Hola,

Por favor, no paséis esto.

Gracias.

Re: La rueda del ratón debe mover todo el reporte arriba y abajo

PostPosted: Tue Sep 02, 2014 9:18 pm
by cnavarro
Probad la siguiente funcion
El movimiento sobre la barra de scroll mejora significativamente
No lo subo porque estoy probando otras modificaciones,
A ver qué opináis

Code: Select all  Expand view

function SetScrollBar()

   //local oVScroll
   local nPageZugabe := 392/100
   local oWnd        := oEr:oMainWnd:oWndClient

   if !Empty( oWnd:oVScroll )
      nPageZugabe := 392/100
      oWnd:oVScroll:SetRange( 0, nTotalHeight / 100 )
     
      oWnd:oVScroll:bGoUp     = { || ScrollVertical( .T. ) }
      oWnd:oVScroll:bGoDown   = { || ScrollVertical( , .T. ) }
      oWnd:oVScroll:bPageUp   = { || ScrollVertical( ,, .T. ) }
      oWnd:oVScroll:bPageDown = { || ScrollVertical( ,,, .T. ) }
      oWnd:oVScroll:bPos      = { | nWert | ScrollVertical( ,,,, .T., nWert/100 ) }
      oWnd:oVScroll:nPgStep   = nPageZugabe   //392
     
      oWnd:oVScroll:SetPos( 0 )
   endif

   if ! Empty( oWnd:oHScroll )
      nPageZugabe := 602/100
      oWnd:oHScroll:SetRange( 0, nTotalWidth / 100 )

      oWnd:oHScroll:bGoUp     = {|| ScrollHorizont( .T. ) }
      oWnd:oHScroll:bGoDown   = {|| ScrollHorizont( , .T. ) }
      oWnd:oHScroll:bPageUp   = {|| ScrollHorizont( ,, .T. ) }
      oWnd:oHScroll:bPageDown = {|| ScrollHorizont( ,,, .T. ) }
      oWnd:oHScroll:bPos      = {| nWert | ScrollHorizont( ,,,, .T., nWert/100 ) }
      oWnd:oHScroll:nPgStep   = nPageZugabe  //602

      oWnd:oHScroll:SetPos( 0 )
   endif

return .T.

 

Re: La rueda del ratón debe mover todo el reporte arriba y abajo

PostPosted: Wed Sep 03, 2014 8:20 am
by mastintin
cnavarro wrote:Probad la siguiente funcion

No funciona correctamante , llevo 2 dias con ello y no lo he conseguido ... , solo funciona bien y no del todo la parte del scroll del ratón.
Creo que nos estamos liando y debemos replantear el funcionamiento desde cero .
Pongamos el analisis en común .Desearia me confirmeis que puntos de los que espongo son correctos y cuales no .
1.- el total del largo a despalzar es ntotalHeight .
2.- si partimos que ntotalHeight es el 100% del desplazamiento podemos partir de un rango de scroll de 0 a 100 oVscroll:setrange( 0,100 )
3.- podemos poner que cada pulsacion goDown()/goup() en un desplazamiento de un 1% y cada gopagup()/gopagedown() es de un 10% por poner unos valores fijos.
4.- el "move" de cada ventana seria en caso de un godown() = ntotalheight /100 y en un gopagedown() = ntotlaHeiht/10

5.- de momento olvidemonos del scroll del raton hasta resolver esto .

Ahora los problemas ....
ovscroll:getpos() ...¿ que devuelve ? en teoria devería devolver la posicion del scroll en la barra ? . A mi no me lo esta haciendo ...

podriamos intentar declarar una variable statica nVpos que nos digera en que posicion se encuentra la barra de scroll y dependiendo de su valor mover las ventanas...

ante un godown() nVpos ++ y nZugabe := ntotalHeight/100 , ante un gopgdown() nVpos:=nvpos+10 y nZugabe := ntotalHeight/10, cuando nvpos llegue a 100 nZugabe := 0 ,etc..

comentarme algo al respecto ...
Saludos a todos.

Re: La rueda del ratón debe mover todo el reporte arriba y abajo

PostPosted: Wed Sep 03, 2014 10:18 am
by Antonio Linares
Manuel,

A mi me parece bien tu planteamiento.

Dices que la barra de scroll no devuelve correctamente la posición, como lo has comprobado ?