FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index Bugs report & fixes / Informe de errores y arreglos Combobox y enter no funciona
Posts: 1789
Joined: Tue Oct 11, 2005 05:01 PM

Combobox y enter no funciona

Posted: Thu Aug 07, 2014 04:37 PM

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

Salu2

Carlos Vargas

Desde Managua, Nicaragua (CA)
Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM

Re: Combobox y enter no funciona

Posted: Thu Aug 07, 2014 07:33 PM

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

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 1789
Joined: Tue Oct 11, 2005 05:01 PM

Re: Combobox y enter no funciona

Posted: Thu Aug 07, 2014 09:53 PM

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

Salu2

Carlos Vargas

Desde Managua, Nicaragua (CA)
Posts: 1789
Joined: Tue Oct 11, 2005 05:01 PM

Re: Combobox y enter no funciona

Posted: Thu Aug 07, 2014 11:11 PM
Antonio, con este c贸digo en tget, metodo Keychar ya funciona el salto con en enter en combobox, estilo CBS_DROPDOWN
Code (fw): Select all Collapse
聽 聽 聽 聽 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 ::IsKindOf( "TCOMBOBOX" )  como el la ultima parte del codigo
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 ::oWnd:GoNextCtrl( ::hWnd )
聽 聽 聽 聽 聽 聽 聽 聽 聽endif
聽 聽 聽 聽 聽 聽 聽 else
                    //aca no se si es necesario el evaluar si ::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 (fw): Select all Collapse
// 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 (fw): Select all Collapse
聽 聽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?
Salu2

Carlos Vargas

Desde Managua, Nicaragua (CA)
Posts: 1789
Joined: Tue Oct 11, 2005 05:01 PM

Re: Combobox y enter no funciona

Posted: Sat Aug 09, 2014 09:12 PM
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.




tengo este ejemplo para revision.

Code (fw): Select all Collapse
// 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 (fw): Select all Collapse
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 )
...
Salu2

Carlos Vargas

Desde Managua, Nicaragua (CA)
Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM

Re: Combobox y enter no funciona

Posted: Sun Aug 10, 2014 06:26 AM
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 unos cambios en el M茅todo Initiate del ComboBox:

Code (fw): Select all Collapse
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 :-)

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 :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com

Continue the discussion