Page 1 of 1

Combobox y enter no funciona

Posted: Thu Aug 07, 2014 4:37 pm
by carlos vargas
Antonio.

la clase combobox cuando su tipo es DROPDOWN no esta permitiendo que la presionar ENTER salgamos del control y saltemos al siguiente, si no que se queda sin hacer nada, hay que presionar TAB para que salte al siguiente control.
lo puedes verificar ejecutando fivedbu, y seleccionas la opcion buscar.

salu2
carlos vargas

Re: Combobox y enter no funciona

Posted: Thu Aug 07, 2014 7:33 pm
by Antonio Linares
Carlos,

Ese es en realidad el comportamiento por defecto de Windows: que saltemos de un control a otro usando Tab.

Entiendo que para los programas de gestión es importante poder usar enter pues asi no hay que usar la mano izquierda y todo se puede hacer con una mano.

Has revisado la Clase TComboBox para ver si procesamos Enter en KeyChar ó en KeyDown ? gracias

Re: Combobox y enter no funciona

Posted: Thu Aug 07, 2014 9:53 pm
by carlos vargas
Lo revisare hoy noche, por que ademas note que no esta evaluando bien el valid, te comentare como me fue
espero que no este dificil la cosa :-)

tengo entendido que la clase combobox cuando es de este tipo especifico, tiene un control Get asociado, por lo que la validación y la evaluación de las teclas correspondería en parte a esa clase, en fin, ya veremos como me va.

salu2
carlos vargas

Re: Combobox y enter no funciona

Posted: Thu Aug 07, 2014 11:11 pm
by carlos vargas
Antonio, con este código en tget, metodo Keychar ya funciona el salto con en enter en combobox, estilo CBS_DROPDOWN

Code: Select all

        case nKey == VK_TAB .or. nKey == VK_RETURN
           if ::bChange != nil .and. ( ::oGet:Changed .or. ::oGet:UnTransform() != ::oGet:Original )
              lAccept = Eval( ::bChange, nKey, nFlags, Self )
              if ValType( lAccept ) == "L"
                 if lAccept
                    //aca no se si es necesario el evaluar si ::oWnd:IsKindOf( "TCOMBOBOX" )  como el la ultima parte del codigo
                    ::oWnd:GoNextCtrl( ::hWnd )
                 endif
              else
                    //aca no se si es necesario el evaluar si ::oWnd:IsKindOf( "TCOMBOBOX" ) como el la ultima parte del codigo
                 ::oWnd:GoNextCtrl( ::hWnd )
              endif
           else
              if ::oWnd:IsKindOf( "TCOMBOBOX" )       //kds - modificado para permitir salto de control con ENTER cuando el get portenece a un combobox
                 ::oWnd:oWnd:GoNextCtrl( ::hWnd )
              else
                 ::oWnd:GoNextCtrl( ::hWnd )
              endif
           endif
 
este es el programa de prueba

Code: Select all

// DropDown ComboBoxes

#include "FiveWin.ch"

function Main()

   local oDlg, oCbx1, oCbx2
   local cText1 := "     "
   local cText2 := "     "
   local oVar, cVar := space(20)

   DEFINE DIALOG oDlg FROM 10, 10 TO 20, 50 ;
      TITLE "DropDown ComboBox Test"

   @ 0.5, 1 COMBOBOX oCbx1 VAR cText1 STYLE CBS_DROPDOWN ;
      ITEMS { "One", "Two", "Three" } ;
      VALID ( Msginfo(1), .t. )

   @ 2.0, 1 GET oVar VAR cVar PICTURE "@!"

   @ 3.5, 1 COMBOBOX oCbx2 VAR cText2 STYLE CBS_DROPDOWNLIST ;
      ITEMS { "One", "Two", "Three" } ;
      VALID ( Msginfo(2), .t. )

   ACTIVATE DIALOG oDlg CENTERED

return nil
 
ahora, tengo una duda:
en la clase combobox, método KeyChar, esta este código que no veo que se ejecute nunca, dado que la tecla Enter se evalúa en el método KeyDown

Code: Select all

   if nKey == VK_RETURN
      return ::oWnd:GoNextCtrl( ::hWnd )
   endif
 
ademas, la clase combobox no esta evaluando el valid, cuando el tipo es CBS_DROPDOWN, ahi no he podido hallar el problema, si me das una guia,
cabe señalar que el valid si funciona si el tipo es CBS_DROPDOWNLIST. por lo que me inmagino que la data ::bValid deberia ser pasada al objeto tget, para que lo evaluara,
tambien habria que revisar el bWhen y bChange.

ademas otra pregunta, antes hace años la clase tcombobox creaba el objeto tget solo si el combobox era CBS_DROPDOWN, ahora lo crea siempre, por que?

Re: Combobox y enter no funciona

Posted: Sat Aug 09, 2014 9:12 pm
by carlos vargas
Antonio, no he sido capaz de encontrar el error de por que el combobox como lista no evalúa correctamente el valid,
he revisado la clase tcombobox, tget sin resultado positivo, ahora he encontrado otro error, cuando el combobox es una lista y esta abierta y presionas escape,
la lista se cierra, pero el valor de la variable se le agrega un símbolo al final, señal de que la tecla escape chr(26) fue sumada al contenido de la variable.
nota que solo el tercer combobox esta evaluando bien el valid.

Image
Image

tengo este ejemplo para revision.

Code: Select all

// DropDown ComboBoxes

#include "FiveWin.ch"

function Main()

   local oDlg
   local oCbx1, oCbx2, oCbx3
   local cText1 := "     "
   local cText2 := "     "
   local cText3 := "     "
   local cVar   := Space(10)

   DEFINE DIALOG oDlg FROM 10, 10 TO 25, 60 ;
      TITLE "DropDown ComboBox Test"

   @ 0.5, 1 COMBOBOX oCbx1 VAR cText1 STYLE CBS_DROPDOWN ;
      ITEMS { "One", "Two", "Three" } ;
      ON CHANGE oDlg:SetText( cText1 ) ;
      VALID (Msginfo("1"),.t.)

   @ 1.5, 1 GET cVar ;
      PICTURE "@!"

   @ 3.0, 1 COMBOBOX oCbx2 VAR cText2 STYLE CBS_DROPDOWN ;
      ITEMS { "Uno", "Dos", "Tres" } ;
      ON CHANGE oDlg:SetText( cText2 );
      VALID (Msginfo("2"),.t.)

   @ 4.5, 1 COMBOBOX oCbx3 VAR cText3 STYLE CBS_DROPDOWNLIST ;
      ITEMS { "Uno1", "Dos2", "Tres3" } ;
      ON CHANGE oDlg:SetText( cText3 );
      VALID (Msginfo("3"),.t.)

   ACTIVATE DIALOG oDlg CENTERED

return nil
 
asi mismo he mirado un msginfo que creo que no aplica en el metodo keychar de tcombobox

Code: Select all

METHOD KeyChar( nKey, nFlags ) CLASS TComboBox

   local nNewAT := 0, nOldAT := ::nAT, uItem
...
      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 )
...
 

Re: Combobox y enter no funciona

Posted: Sun Aug 10, 2014 6:26 am
by Antonio Linares
Carlos,

Mucha gracias por el tiempo y esfuerzo que has pasado investigándolo. A esto se llama ayudar de verdad :-)

El Get del combobox no evalua su valid porque su contenedor no tiene más hijos (controles). Asi que hace unos dias hice _ en el Método Initiate del ComboBox:

Code: Select all

METHOD Initiate( hDlg ) CLASS TComboBox

   ::Super:Initiate( hDlg )

   ::Default()

   if ::oGet != nil
      ::oGet:hWnd = GetWindow( ::hWnd, GW_CHILD )
      ::oGet:SetText( ::VarGet() )
      if ::oGet:hWnd != 0
         ::oGet:Link()
      endif
      ::oGet:bKeyChar = { | nKey | Eval( ::bSetGet, ::oGet:GetText() + ;
                                   If( nKey != VK_TAB, Chr( nKey ), "" ) ),;
                                   ::SetText( ::oGet:GetText() + Chr( nKey ) ),;
                                   If( nKey == VK_TAB .and. ! GetKeyState( VK_SHIFT ),;
                                   oWndFromHwnd( ::oWnd:GoNextCtrl( ::hWnd ) ):SetFocus(),),;
                                   nKey }
      ::oGet:bLostFocus = ;
      { | hCtlFocus, nAt, cItem | cItem := ::oGet:GetText(),;
      Eval( ::bSetGet, cItem ),;
      If( ::bValid != nil .and. ;
      GetParent( hCtlFocus ) == GetParent( ::hWnd ),;
      If( ! Eval( ::bValid, ::oGet, Self ),;
      ::PostMsg( WM_SETFOCUS ),),) }
      if ::oGet:hWnd != 0
         ::oGet:SetFont( ::oFont )
      endif
   endif

   ::Refresh()

return nil
Por favor pruébalo a ver que tal te funciona.

Por otra parte te diré que estoy temporalmente en "off" porque bitbucket me hizó un extraño que me obligó a cambiar el password y luego simplemente se me olvidó el que puse antes de anotarlo :-D

Asi que les he enviado un email de ayuda porque su sistema de recuperación de contraseñas no esta funcionando bien, asi que dice que me ha enviado el email pero no me envia nada. Afortunadamente cualquiera de mis colaboradores puede acceder a todo con su contraseña (no se pierde nada) y yo tuve tiempo de hacer copia de seguridad de todo. Pero la lata es que no puedo guardar mis cambios, asi que me toca esperar.

En cuanto tenga esto solucionado probaré tus cambios con los mios, y subiré la versión definitiva a bitbucket :-)