oBrw:bKeyDown VK_LEFT y VK_RIGHT ( SOLUCIONADO )

oBrw:bKeyDown VK_LEFT y VK_RIGHT ( SOLUCIONADO )

Postby cuatecatl82 » Sun Aug 25, 2013 5:41 pm

Saludos de nuevo:


Alguien ha podido detectar cuando las teclas VK_LEFT y VK_RIGHT son presionadas via oBrw:bKeyDown de XBrowse.?

El teclado alfanumerico es detectado más no así las teclas arriba, abajo, derecha e izquierda.

Code: Select all  Expand view
oBrw:bKeyDown := { | nKey |MSGInfo(nKey)}


No hace nada al presionar dichas teclas, necesito detectarlas para continuar mi proyecto, ya he buscado en el foro pero los que preguntan por lo mismo en el foro no han sido rrespondidos o no han corpatido la solución..

Gracias.. :oops:

Gracias..
Last edited by cuatecatl82 on Tue Aug 27, 2013 7:19 pm, edited 1 time in total.
Soluciones y Diseño de Software
Damos Soluciones...

I.S.C. Victor Daniel Cuatecatl Leon
Director y Diseñador de Proyectos

http://www.soldisoft.unlugar.com
http://www.sisa.unlugar.com
danyleon82@hotmail.com
www.facebook.com/victordaniel.cuatecatlleon
User avatar
cuatecatl82
 
Posts: 625
Joined: Wed Mar 14, 2007 6:49 pm
Location: San Cristobal de las Casas, Chiapas México

Re: oBrw:bKeyDown VK_LEFT y VK_RIGHT

Postby colthop » Mon Aug 26, 2013 8:44 am

Hola que tal:

Yo pude capturar las pulsaciones de VK_Down y VK_Right pero cambiándolas en el tGet.prg por lo que mi contestación te valdría si tienes un Get cuando quieres capturarlas.

Yo me cree una variable publica que la llame zGetKey y la puse en valor 1 y en las ventanas que quiero capturar el VK_Left, el VK_Right, el VK_Up y el VK_Down les cambie el valor a 2, 3 y 4. Después copie el tGet.prg de Source a la carpeta de la aplicación y lo edite y me fui al METHOD KeyDown y dentro del do case en : case nKey == VK_UP, nKey == VK_DOWN, nKey == VK_LEFT y nKey == VK_RIGHT, cree un do case en cada uno con las acciones que quiero y lo meti dentro de la compilación.

El METHOD KeyDown del tGet.prg me queda así:

Code: Select all  Expand view
METHOD KeyDown( nKey, nFlags ) CLASS TGet

   local nHi, nLo, nPos, nLastHi := -1, uVal

   ::nLastKey = nKey

   if ::bKeyDown != nil
      if ValType( uVal := Eval( ::bKeyDown, nKey, nFlags, Self ) ) == "N" .and. ;
         uVal == 0
         return 0
      endif
   endif

   do case
          case nKey == VK_PRIOR
               if ::lSpinner
                  Self--
               endif

          case nKey == VK_NEXT
               if ::lSpinner
                  Self++
               endif

      case nKey == VK_UP
        do case
           case zGetKey = 1
             if Len( ::oWnd:aControls ) > 1
               ::oWnd:GoPrevCtrl( ::hWnd )
               return 1   // avoid default behavior
             endif
           case zGetKey = 2
             arriba()
           case zGetKey = 3
             arribaf()
           case zGetKey = 4
             arriadfa()
         endcase
      case nKey == VK_DOWN
        do case
           case zGetKey = 1
             if Len( ::oWnd:aControls ) > 1
               ::oWnd:GoNextCtrl( ::hWnd )
               return 1
             endif
           case zGetKey = 2
             abajo()
           case zGetKey = 3
             abajof()
           case zGetKey = 4
             abajadfa()
         endcase

      case nKey == VK_LEFT
        do case
           case zGetKey = 1
             if GetKeyState( VK_CONTROL )
                ::oGet:WordLeft()
             else
                ::oGet:Left()
             endif

             ::oGet:Pos = Max( ::oGet:Pos, 1 )

             while .t.
                CallWindowProc( ::nOldProc, ::hWnd, WM_KEYDOWN, nKey, nFlags )
                ::GetSelPos( @nLo, @nHi )
                if nLo <= ::oGet:Pos - 1
                   EXIT
                endif
             end
             ::nPos = nLo + 1
             if ::nPos < ::oGet:Pos
                ::SetPos( ::oGet:Pos )
             else
                ::oGet:Pos = ::nPos
             endif
             return 0
           case zGetKey = 2
             izquierda()
           case zGetKey = 3
             izquierdaf()
           case zGetKey = 4
             izquadfa()
         endcase

      case nKey == VK_RIGHT
        do case
           case zGetKey = 1
             nPos = ::oGet:Pos
             if GetKeyState( VK_CONTROL )
                ::oGet:wordRight()
             else
                ::oGet:right()
             endif
             if nPos <> ::oGet:Pos
                while .t.
                   CallWindowProc( ::nOldProc, ::hWnd, WM_KEYDOWN, nKey, nFlags )
                   ::GetSelPos( @nLo, @nHi )
                   if nHi + 1 >= ::oGet:Pos .or. ::lPassword .or. ;
                      nHi == nLastHi
                      EXIT
                   endif
                   nLastHi = nHi
                end
                ::oGet:Pos = nHi + 1
                ::nPos     = nHi + 1
             endif
             return 0
           case zGetKey = 2
             derecha()
           case zGetKey = 3
             derechaf()
           case zGetKey = 4
             dereadfa()
         endcase
                                          // Many thanks to HMP
      case nKey == VK_INSERT .and. ! GetKeyState( VK_SHIFT ) ;
           .and. ! GetKeyState( VK_CONTROL )   // to copy to the clipboard

           Set( _SET_INSERT, ! Set( _SET_INSERT ) )
           DestroyCaret()
           if Set( _SET_INSERT )
              CreateCaret( ::hWnd, 0, 6, ::nGetChrHeight() - 1 )
           else
              CreateCaret( ::hWnd, 0, 2, ::nGetChrHeight() )
           endif
           ShowCaret( ::hWnd )
           return 0

      case ( nKey == VK_INSERT .and. GetKeyState( VK_SHIFT ) ) .or. ;
           ( nKey == ASC("V") .and. GetKeyState( VK_CONTROL ) ) .or. ;
           ( nKey == ASC('X') .and. GetKeyState( VK_CONTROL ) ) .and. ;
           ! lAnd( nFlags, 2 ** 29 )

          if ! ::lReadOnly
             CallWindowProc( ::nOldProc, ::hWnd, WM_KEYDOWN, nKey, nFlags )
             SysRefresh()
             if ValType( ::oGet:buffer ) = "C"
                ::oGet:buffer = Pad( GetWindowText( ::hWnd ), Len( ::oGet:buffer ) )
                SetWindowText( ::hWnd, ::oGet:buffer )
             else
                ::oGet:buffer = GetWindowText( ::hWnd )
             endif
             ::oGet:Assign()
             // ::GetSelPos( @nLo, @nHi )
             // ::nPos = nHi + 1
             // ::oGet:Pos = ::nPos
             if ::bChange != nil
                Eval( ::bChange, nKey, nFlags, Self )
             endif
          endif

          return 0

      case nKey == VK_HOME .or. nKey == VK_END

           if GetKeyState( VK_SHIFT )
              CallWindowProc( ::nOldProc, ::hWnd, WM_KEYDOWN, nKey, nFlags )

              ::GetSelPos( @nLo, @nHi )
              ::oGet:Pos = nLo + 1
              ::nPos = nLo + 1
           else
               if nKey == VK_HOME
                  ::oGet:Home()
                  ::SetPos( ::oGet:Pos )
               endif

               if nKey == VK_END
                  ::oGet:End()
                  ::SetPos( ::oGet:Pos )
               endif
           endif
           return 0

      case nKey == VK_DELETE .or. nKey == VK_BACK

           if ::lReadOnly
              return 0
           endif

           if ::lDrag
              return Super:KeyDown( nKey, nFlags )
           endif

           ::GetSelPos( @nLo, @nHi )

           // Deletes selection
           if nHi != nLo
              ::GetDelSel( nLo, nHi )
              if GetKeyState( VK_SHIFT )
                 CallWindowProc( ::nOldProc, ::hWnd, WM_KEYDOWN, nKey, nFlags )
              endif
           else
              if nKey == VK_DELETE
                 ::oGet:Delete()
              else
                 ::oGet:BackSpace()
              endif
           endif
           ::EditUpdate()
           if ::bChange != nil
              Eval( ::bChange, nKey, nFlags, Self )
           endif
           return 0
   endcase

return Super:KeyDown( nKey, nFlags )


Observa que cuando vale zGetKey 1 es lo que originalmente había en el case.

Un saludo

Carlos
Colt Hop ED, S.L.
Carlos Blas Fernández Domínguez
Tlfo: 645847093
E-Mail: carlos@colthop.es

Nunca se termina de aprender, por eso necesito siempre ayuda.
colthop
 
Posts: 505
Joined: Sat Apr 22, 2006 9:09 am
Location: Madrid - España

Re: oBrw:bKeyDown VK_LEFT y VK_RIGHT

Postby Antonio Linares » Mon Aug 26, 2013 9:11 am

Victor,

Tienes que modificar el método KeyDown() de la Clase TXBrowse para detectar esas teclas y evaluar un codeblock (por ejemplo).

Que necesitas hacer para esas teclas ? Igual se nos ocurre otra forma
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42099
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: oBrw:bKeyDown VK_LEFT y VK_RIGHT

Postby cuatecatl82 » Mon Aug 26, 2013 1:11 pm

Gracias por tomarse la molestia de leer mi petición:

Carlos: Con get no hay problema, tengo algo similiar a lo que me comentas para obtener estas teclas, solo necesito obtenerlas y hacer que funcionen en la clase xbrowse, de todas maneras muchas gracias por tu comentario... :lol: :lol: 8) 8)

Maestro Antonio:

Estoy trabajando con oBrw:SetTree() de xBrowse para obtener el árbol de directorios de un disco duro, pero como solo tiene 1 columna y el scroll horizontal no reposiciona el xbrowse para ver lo que esta oculto:

Image

He solucionado este detalle haciendo chapuza, ocultando la barra de scroll horizontal que por defecto muestra xbrowse con: oBrw:lHScroll := .F. y a la vez poniendo una barra de scroll independiente para agrandar la columna y mover el xbrowse:

Code: Select all  Expand view
@ 30, nX1 xBROWSE oBrw SIZE nX2,425 Pixel OF oObj1 NOBORDER

@ 456, 01 SCROLLBAR oHScroll HORIZONTAL Pixel SIZE 192, 20 OF oObj1 RANGE 1, 1 ;
ON UP(IF(nX1 <= -2, (MueveBr(-10)),(SysRefresh()))) ON DOWN(IF(nX1 <= oBrw:aCols[1]:nWidth, (MueveBr(10)),(SysRefresh())))// ON THUMBPOS(nTrack:= oHScroll:GetPos(),  oHScroll:SETPOS(nTrack), MSGInfo(nTrack))
 


Code: Select all  Expand view
STATIC FUNCTION MueveBr(nMov)

LOCAL nLong,nPos,nRango

oHScroll:Show()
oHScroll:Refresh()

   nX1:= nX1 - nMov
   nX2:= nX2 + nMov
nRango:= oHScroll:GetRange()
 nLong:= oBrw:aCols[1]:nWidth
  nPos:= INT(nRango[2]) + (nMov/10)

oBrw:aCols[1]:nWidth:= nLong + nMov
oBrw:SetSize(nX2)
oBrw:Move(,nX1)
oBrw:Refresh()


oHScroll:SetRange(1,nPos)
oHScroll:SETPOS(nX2)
oHScroll:UPDATE()
SysRefresh()

RETURN Nil


Funciona, pero solo puedo mover el scroll con el mouse, aqui es donde necesito detectar VK_LEFT y VK_RIGHT dentro de xbrowse que siempre tiene el foco para mover el scroll como si fuera propio de xbrowse, temia que no pudiera detectarse sin modificar el método KeyDown().

¿ Cómo hacer que evalue un codeblock..?, Hasta ahora así he dejado el método cuando solo es 1 columna, que es lo más lógico para no afectar el funcionamiento normar de la Clase.

Code: Select all  Expand view
  CASE nKey == VK_LEFT

      IF GetKeyState( VK_CONTROL )
         ::GoLeftMost()
      ELSE
          IF LEN(::aCols) == 1
            msginfo("Aki la función","VK_LEFT")
          ELSE
             ::GoLeft()
          ENDIF

      ENDIF

   CASE nKey == VK_RIGHT

      IF GetKeyState( VK_CONTROL )
         ::GoRightMost()
      ELSE
         IF LEN(::aCols) == 1
            msginfo("Aki la función","VK_RIGHT")
         ELSE
            ::GoRight()
         ENDIF
      ENDIF


Aqui dejo un ejemplo autocontenido
http://www.mediafire.com/download/9b4cwi7cyvbybaf/EXPLORAR.rar

Gracias Maestro y estare pendiente de la solución..
Soluciones y Diseño de Software
Damos Soluciones...

I.S.C. Victor Daniel Cuatecatl Leon
Director y Diseñador de Proyectos

http://www.soldisoft.unlugar.com
http://www.sisa.unlugar.com
danyleon82@hotmail.com
www.facebook.com/victordaniel.cuatecatlleon
User avatar
cuatecatl82
 
Posts: 625
Joined: Wed Mar 14, 2007 6:49 pm
Location: San Cristobal de las Casas, Chiapas México

Re: oBrw:bKeyDown VK_LEFT y VK_RIGHT

Postby Antonio Linares » Mon Aug 26, 2013 5:39 pm

Victor,

Porque no usas un Tree (arbol) estandard de Windows ?

Hay alguna razón en especial ?
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42099
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: oBrw:bKeyDown VK_LEFT y VK_RIGHT

Postby cuatecatl82 » Tue Aug 27, 2013 12:22 am

Maestro Antonio:

Porque los ejemplos que hay en samples no se adecuaron a lo que necesitaba, excepto xbrwdisk.prg que era lo más próximo por la facilidad que da xbrowse, lo adapte y modifique para lograr el objetivo, no sin antes haber probado con Treeview, pero era todo un lio armar todo el árbol jerarquizado a partir de "X" objetos hijos dependientes de un objeto padre en una DBF, y más aun el obtener los "PROMPTS" en base de los contenedores "CARGO", de hecho tambien me lie con SetTree, pero pude solucionarlo.

Probe varias opciones, pocos códigos de ejemplo en el foro y en la carpeta samples del uso de la Clase Treeview ampliamente detallados, o de una clase ya orientada y completa a crear Tree´s, me conducieron a usar XBrowse, en el foro muchos diseñan Tree´s con Xbrowse, para lo que necesito esta casi terminada, excepto este detalle, que el scroll horizontal que tiene por defecto Xbrowse solo trabaja entre multiples columnas y no con la longitud de la única columna que se crea con SetTree().

http://forums.fivetechsupport.com/viewtopic.php?f=6&t=26932#p149562

En el ejemplo que le envie puede probar y comprobar lo que le comento, comparandolo con xbrwdisk.prg.

//*-----------------------------------
Como comentario y sin intención de que suene a reclamo ni mucho menos:

Hace algún tiempo atras se nos suguirio que cuando abriermos un post con alguna dificultad o duda que tuvieramos con algún proceso, lo comentaramos tanto posibles ideas como soluciones, muchos aún optan por no compartir como solucionaron sus problemas y cierran sus post con etiqueta de "SOLUCIONADO" dejandonos a muchos sin oportunidad de soluciones, es por eso que en el foro no hay muchos que nos quedamos a medias y lo peor, se esta pediendo información valiosa.
*//-----------------------------------

De tomas maneras sigo probando a modificar la clase Xbrowse, haber como lo soluciono..

Saludos..
Soluciones y Diseño de Software
Damos Soluciones...

I.S.C. Victor Daniel Cuatecatl Leon
Director y Diseñador de Proyectos

http://www.soldisoft.unlugar.com
http://www.sisa.unlugar.com
danyleon82@hotmail.com
www.facebook.com/victordaniel.cuatecatlleon
User avatar
cuatecatl82
 
Posts: 625
Joined: Wed Mar 14, 2007 6:49 pm
Location: San Cristobal de las Casas, Chiapas México

Re: oBrw:bKeyDown VK_LEFT y VK_RIGHT

Postby cuatecatl82 » Tue Aug 27, 2013 12:57 pm

Victor,

Tienes que modificar el método KeyDown() de la Clase TXBrowse para detectar esas teclas y evaluar un codeblock (por ejemplo).


Alguien tiene una idea de como..?

Gracias..
Soluciones y Diseño de Software
Damos Soluciones...

I.S.C. Victor Daniel Cuatecatl Leon
Director y Diseñador de Proyectos

http://www.soldisoft.unlugar.com
http://www.sisa.unlugar.com
danyleon82@hotmail.com
www.facebook.com/victordaniel.cuatecatlleon
User avatar
cuatecatl82
 
Posts: 625
Joined: Wed Mar 14, 2007 6:49 pm
Location: San Cristobal de las Casas, Chiapas México

oBrw:bKeyDown VK_LEFT y VK_RIGHT ( SOLUCIONADO )

Postby cuatecatl82 » Tue Aug 27, 2013 7:18 pm

Después de haber investigado y aprendido un poco sobre Clases y Métodos he logrado mi objetivo sin tocar nada en la clase Xbrowse, lo he logrado usando "OVERRIDE METHOD" sobre la clase Xbrowse con Harbour gracias a la ayuda de Carlos Vargas:
http://forums.fivetechsupport.com/viewtopic.php?f=6&t=6317

Y quedo de la siguiente manera:

Incluir en los defines:
Code: Select all  Expand view

# Include "FiveWin.ch"
# Include "xHbCls.ch"


En la llamada a la Función Principal de Programa, si mi Ingles no me falla aqui establecemos lo siguiente:
Anular Metodo KeyDown en la Clase TXbrowse con MiKeyDown

Code: Select all  Expand view
//------------------------------------------------------------------------------------------------------------------//


# Include "FiveWin.ch"
# Include "xHbCls.ch"

FUNCTION Main()

LOCAL oIco,oBru

OVERRIDE METHOD KeyDown IN CLASS TXBrowse WITH MiKeyDown

..........



Y el Procedimiento MiKeyDown()

Code: Select all  Expand view
//----------------------------------------------------------------------------//

FUNCTION MiKeyDown(nKey)

   DO CASE
     
      CASE nKey == VK_LEFT
           IF(nX1 <= -2, (MueveBr(-10)),(SysRefresh()))  //Muevo el Browse y el Scroll con el teclado a la Izquierda
     
      CASE nKey == VK_RIGHT
           nLong:= oBrw:aCols[1]:nWidth
           IF(nLong >= (nX2-5), (MueveBr(10)),(SysRefresh())) //Muevo el Browse y el Scroll con el teclado a la Derecha
     
      CASE nKey == VK_HOME
           oBrw:SELECT( 0 )
           oBrw:GoTop()    //Muevo el Browse y el Scroll con el teclado al Inicio ( nativo de la clase xbrowse)
           oBrw:SELECT( 1 )

      CASE nKey == VK_UP //Muevo el Browse y el Scroll con el teclado 1 Arriba ( nativo de la clase xbrowse)
           oBrw:SELECT( 0 )
           oBrw:GoUp()
           oBrw:SELECT( 1 )

      CASE nKey == VK_DOWN //Muevo el Browse y el Scroll con el teclado 1 Abajo ( nativo de la clase xbrowse)
           oBrw:SELECT( 0 )
           oBrw:GoDown()
           oBrw:SELECT( 1 )
     
      CASE nKey == VK_END //Muevo el Browse y el Scroll con el teclado al Final ( nativo de la clase xbrowse)
           oBrw:SELECT( 0 )
           oBrw:GoBottom()
           oBrw:SELECT( 1 )

      CASE nKey == VK_PRIOR //Muevo el Browse y el Scroll Pagina Arriba ( nativo de la clase xbrowse)
           oBrw:SELECT( 0 )
           IF GetKeyState( VK_CONTROL )
              oBrw:GoTop()
           ELSE
              oBrw:PageUp()
           ENDIF
           oBrw:SELECT( 1 )

      CASE nKey == VK_NEXT  //Muevo el Browse y el Scroll Pagina Abajo ( nativo de la clase xbrowse)
           oBrw:SELECT( 0 )
           IF GetKeyState( VK_CONTROL )
              oBrw:GoBottom()
           ELSE
              oBrw:PageDown()
           ENDIF
              oBrw:SELECT( 1 )  
     
      ENDCASE

RETURN 0


Y con esto doy por cerrado el tema, a mi me funciona de perlas, voy a preparar un ejemplo sencillo para compartirlo.

Gracias Maestro Antonio y a todos los que se tomaron la molestia de leer y comentar, seguiremos aprendiendo. :mrgreen: :mrgreen: :mrgreen:
Soluciones y Diseño de Software
Damos Soluciones...

I.S.C. Victor Daniel Cuatecatl Leon
Director y Diseñador de Proyectos

http://www.soldisoft.unlugar.com
http://www.sisa.unlugar.com
danyleon82@hotmail.com
www.facebook.com/victordaniel.cuatecatlleon
User avatar
cuatecatl82
 
Posts: 625
Joined: Wed Mar 14, 2007 6:49 pm
Location: San Cristobal de las Casas, Chiapas México


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 88 guests