FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Abrir combobox con tecla Enter
Posts: 83
Joined: Wed Apr 20, 2011 03:08 PM
Abrir combobox con tecla Enter
Posted: Sat Apr 05, 2014 01:12 PM
Hola Foro:

No se si alguien me puede dar una ayuda a un problema doméstico. Necesito saber como puedo abrir un combobox o DbCombo, presionando la tecla Enter y luego de seleccionar un elemento de la lista volver a presionar enter y que se cierre dejando el elemento seleccionado en el combo y a la vez que pase el enfoque a otro control (por ejemplo un textbox).

Será posible hacer esto, he buscado en el foro casos similares y no aparece nada

Se agradece sugerencias

Gracias. :-)

Sergio Vacarezza S.
Programador Freelance
sergio@vacarezza.cl
Santiago, Chile

Harbour 3.2.0dev (r2407221137) - FWH 24.08 - MariaDB 12.2.2 - FivEdit 22.0214

Posts: 6755
Joined: Wed Feb 15, 2012 08:25 PM
Re: Abrir combobox con tecla Enter
Posted: Sat Apr 05, 2014 09:06 PM
Sergio, para conseguir lo que pretendes necesitas o modificar la clase TCombobox, o utilizar una clase que herede de ella ya que el problema está, según creo, en el método Keychar de la clase
Te adjunto una clase que tenía hecha hace tiempo para ello, y solo la usaba en los Combobox de la aplicación en los que necesitaba esta funcionalidad.
Es muy sencilla de implementar incluso en la propia clase TCombobox, aunque yo prefiero siempre no modificar las clases iniciales (cuestion de gustos)

Code (fw): Select all Collapse
// El comando ha de ser modificado
#xcommand @ <nRow>, <nCol> MCOMBOBOX [ <oCbx> VAR ] <cVar> ;
             [ <it: PROMPTS, ITEMS> <aItems> ] ;
             [ SIZE <nWidth>, <nHeight> ] ;
             [ <dlg:OF,WINDOW,DIALOG> <oWnd> ] ;
             [ <help:HELPID, HELP ID> <nHelpId> ] ;
             [ ON CHANGE <uChange> ] ;
             [ VALID <uValid> ] ;
             [ <color: COLOR,COLORS> <nClrText> [,<nClrBack>] ] ;
             [ <pixel: PIXEL> ] ;
             [ FONT <oFont> ] ;
             [ <update: UPDATE> ] ;
             [ MESSAGE <cMsg> ] ;
             [ WHEN <uWhen> ] ;
             [ <design: DESIGN> ] ;
             [ BITMAPS <acBitmaps> ] ;
             [ ON DRAWITEM <uBmpSelect> ] ;
             [ STYLE <nStyle> ] ;
             [ <pict: PICT, PICTURE> <cPicture> ];
             [ ON EDIT CHANGE <uEChange> ] ;
       => ;
          [ <oCbx> := ] TMComboBox():New( <nRow>, <nCol>, bSETGET(<cVar>),;
             <aItems>, <nWidth>, <nHeight>, <oWnd>, <nHelpId>,;
             [{|Self|<uChange>}], <{uValid}>, <nClrText>, <nClrBack>,;
             <.pixel.>, <oFont>, <cMsg>, <.update.>, <{uWhen}>,;
             <.design.>, <acBitmaps>, [{|nItem|<uBmpSelect>}], <nStyle>,;
             <cPicture>, [<{uEChange}>], [<(oCbx)>] )

//---------------------------------------------------------------------------//

CLASS TMComboBox FROM TComboBox
     DATA lOpen 
     METHOD New( nRow, nCol, bSetGet, aItems, nWidth, nHeight, oWnd, nHelpId,;
               bChange, bValid, nClrText, nClrBack, lPixel, oFont,;
               cMsg, lUpdate, bWhen, lDesign, acBitmaps, bDrawItem, nStyle,;
               cPict, bEChange ) CONSTRUCTOR
               
    
    METHOD KeyChar( nKey, nFlags )
    
ENDCLASS

//---------------------------------------------------------------------------//

METHOD New( nRow, nCol, bSetGet, aItems, nWidth, nHeight, oWnd, nHelpId,;
               bChange, bValid, nClrText, nClrBack, lPixel, oFont,;
               cMsg, lUpdate, bWhen, lDesign, acBitmaps, bDrawItem, nStyle,;
               cPict, bEChange ) CLASS TMComboBox
  ::lOpen  := .F.
  ::Super:New( nRow, nCol, bSetGet, aItems, nWidth, nHeight, oWnd, nHelpId,;
               bChange, bValid, nClrText, nClrBack, lPixel, oFont,;
               cMsg, lUpdate, bWhen, lDesign, acBitmaps, bDrawItem, nStyle,;
               cPict, bEChange )
               
Return Self

//---------------------------------------------------------------------------//

METHOD KeyChar( nKey, nFlags ) CLASS TMComboBox 

   local nNewAT := 0, nOldAT := ::nAT, uItem 

   if Len( ::aItems ) == 0 
      return 0 
   endif

   if ::lIncSearch
      do case 
         case nKey = 32   // VK_DELETE (DO NOT WORK!) 
              if Empty( ::oGet:hWnd )
                 ::cSearchKey = "" 
                 nNewAt = 1 
                 uItem  = ::aItems[ nNewAt ]
              else    
                 ::cSearchKey += " "
              endif   
            
         case nKey = VK_BACK 
              ::cSearchKey = Left( ::cSearchKey, Len( ::cSearchKey ) - 1 ) 
            
         case nKey = 190 
              nKey = 0 
              ::cSearchKey += "." 
              
         case ! Empty( ::oGet:hWnd ) .and. nKey = VK_TAB
              if ! GetKeyState( VK_SHIFT )
                 ::oWnd:GoNextCtrl( ::hWnd )
              else   
                 ::oWnd:GoPrevCtrl( ::hWnd )
              endif
              return 0   
            
         otherwise
            if nKey <> VK_RETURN          
              if ::lCaseSensitive
                 ::cSearchKey += Chr( nKey )
              else
                ::cSearchKey += Upper( Chr( nKey ) )
              endif
            endif
      endcase 
      if nKey <> VK_RETURN
      if Empty( uItem ) 
         if nNewAt == 0 
            if ::lCaseSensitive
               nNewAt = AScan( ::aItems, { | x | SubStr( x, 1, Len( ::cSearchKey ) ) == ::cSearchKey } )
            else
               nNewAt = AScan( ::aItems, { | x | SubStr( Upper( x ), 1, Len( ::cSearchKey ) ) == ::cSearchKey } )
            endif
            if Empty( ::oGet:hWnd )
               uItem = ::aItems[ If( nNewAt > 0, nNewAt, Max( ::nAT, 1 ) ) ] 
            else   
               uItem = If( nNewAt > 0, ::aItems[ nNewAt ], ::cSearchKey )
               MsgInfo( uItem )
            endif   
         else 
            uItem = ::aItems[ Max( nNewAt, 1) ] 
         endif  
      endif 
      ::Set( If( ValType( Eval( ::bSetGet ) ) == "N", AScan( ::aItems, uItem ), uItem ) ) 
      if ! Empty( ::oGet:hWnd )
         ::oGet:SetPos( Len( ::cSearchKey ) + 1 )
      endif
      endif   
   endif   

   if ::bChange != nil 
      if ! Empty( ::oGet:hWnd ) .or. ( nNewAT != nOldAt .and. nNewAt != 0 ) 
         Eval( ::bChange, Self, ::VarGet() ) 
      endif   
   endif 

   if nKey == VK_RETURN
      if ::IsOpen()
         //return ::GoNextCtrl( ::hWnd )
      else
         if ::lOpen
            ::lOpen := .F.
            return ::oWnd:GoNextCtrl( ::hWnd )
         else
            ::Open()
            ::lOpen := .T.
         endif
      endif  
   endif 
   
return If( ::lIncSearch, 0, nil )

//----------------------------------------------------------------------------//


Como ves, sólo he añadido una DATA (aunque de igual manera podrías utilizar la DATA cargo en su lugar) y modificado el METODO KEYCHAR
Espero te sirva
Aqui un ejemplo, aunque es lo mismo que tenías

Code (fw): Select all Collapse
   @ 22, 10 MCOMBOBOX oCbx VAR cTit1 ITEMS aItems ; 
            OF oDlgR SIZE 140, 200 FONT oFont ;
            PIXEL COLOR CLR_BLACK, CLR_WHITE
            oCbx:lIncSearch  := .T.
Cristobal Navarro

Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo

El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
Posts: 83
Joined: Wed Apr 20, 2011 03:08 PM
Re: Abrir combobox con tecla Enter
Posted: Sat Apr 05, 2014 09:52 PM
Cristobal:

Muchas gracias por tu ayuda y aporte, lo voy a probar y te comento. Sólo un pregunta, este cambio también se podria aplicar a un DbCombo??

Un abrazo desde Chile

Sergio Vacarezza S.
Programador Freelance
sergio@vacarezza.cl
Santiago, Chile

Harbour 3.2.0dev (r2407221137) - FWH 24.08 - MariaDB 12.2.2 - FivEdit 22.0214

Posts: 6755
Joined: Wed Feb 15, 2012 08:25 PM
Re: Abrir combobox con tecla Enter
Posted: Sat Apr 05, 2014 10:09 PM

Tengo que mirarlo
No he usado prácticamente nada el DBCombo
Dime si te funciona y lo miro, porque el DbCombo tiene su propio método KeyChar, aunque la clase herede de TComboBox
Sería más fácil si me proporcionas un pequeño ejemplo con DBCombo

Cristobal Navarro

Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo

El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
Posts: 83
Joined: Wed Apr 20, 2011 03:08 PM
Re: Abrir combobox con tecla Enter
Posted: Sat Apr 05, 2014 11:23 PM

Gracias Cristobal, lo revisare y te comento como resulta.

Un abrazo

Sergio Vacarezza S.
Programador Freelance
sergio@vacarezza.cl
Santiago, Chile

Harbour 3.2.0dev (r2407221137) - FWH 24.08 - MariaDB 12.2.2 - FivEdit 22.0214

Posts: 83
Joined: Wed Apr 20, 2011 03:08 PM
Re: Abrir combobox con tecla Enter
Posted: Mon Apr 07, 2014 03:11 PM

Crsitobal:

Efectué el cambio el Método KeyChar en la misma Clase TDbCombo, con el código que me enviaste, respaldando obviamente la librería FiveHx.lib antes de recomplilar la librería, pero no se ve ningún efecto en el sistema y no funciona como debiera, es decir al presionar Enter sobre el DBcombo, solo hace el cambio de foco, sin abrirse.

Crees tu que se debiera hacer otro cambio o que sugieres en este caso??

Te adjunto un ejemplo del código:

REDEFINE DBCOMBO oDesc_Emp VAR cDesc_Emp ID 4005 OF oDlg ;
ALIAS "Empresa" ;
ITEMFIELD "Codigo_Fem" ;
LISTFIELD "Nombre_Fem" ;
ON CHANGE Select_Emp(cDesc_Emp, oDesc_Emp, oBtn1);
VALID Get_Emp(cDesc_Emp, oDesc_Emp)

Sergio Vacarezza S.
Programador Freelance
sergio@vacarezza.cl
Santiago, Chile

Harbour 3.2.0dev (r2407221137) - FWH 24.08 - MariaDB 12.2.2 - FivEdit 22.0214

Posts: 6755
Joined: Wed Feb 15, 2012 08:25 PM
Re: Abrir combobox con tecla Enter
Posted: Mon Apr 07, 2014 04:42 PM

La modificacion era solo para Combobox

Cristobal Navarro

Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo

El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
Posts: 83
Joined: Wed Apr 20, 2011 03:08 PM
Re: Abrir combobox con tecla Enter
Posted: Mon Apr 07, 2014 07:08 PM

Cristobal:

Gracias por tu ayuda. Lo tendré presente, que sólo es para la Clase TCombobox. Que lastima, ya que en mis sistemas en la gran mayoría uso DBCombo.

Bueno seguiré buscando cómo puedo resolverlo. Aunque sólo es un tema de estética y una exigencia del Cliente.

Un abrazo :D

Saludos desde Chile

Sergio Vacarezza S.
Programador Freelance
sergio@vacarezza.cl
Santiago, Chile

Harbour 3.2.0dev (r2407221137) - FWH 24.08 - MariaDB 12.2.2 - FivEdit 22.0214

Continue the discussion