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
Combobox y enter no funciona
- carlos vargas
- Posts: 1421
- Joined: Tue Oct 11, 2005 5:01 pm
- Location: Nicaragua
Combobox y enter no funciona
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
Carlos Vargas
Desde Managua, Nicaragua (CA)
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
Re: Combobox y enter no funciona
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
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
- carlos vargas
- Posts: 1421
- Joined: Tue Oct 11, 2005 5:01 pm
- Location: Nicaragua
Re: Combobox y enter no funciona
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
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)
Carlos Vargas
Desde Managua, Nicaragua (CA)
- carlos vargas
- Posts: 1421
- Joined: Tue Oct 11, 2005 5:01 pm
- Location: Nicaragua
Re: Combobox y enter no funciona
Antonio, con este código en tget, metodo Keychar ya funciona el salto con en enter en combobox, estilo CBS_DROPDOWN
este es el programa de prueba
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
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?
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
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
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
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?
Last edited by carlos vargas on Sat Aug 09, 2014 9:16 pm, edited 1 time in total.
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
Carlos Vargas
Desde Managua, Nicaragua (CA)
- carlos vargas
- Posts: 1421
- Joined: Tue Oct 11, 2005 5:01 pm
- Location: Nicaragua
Re: Combobox y enter no funciona
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.
asi mismo he mirado un msginfo que creo que no aplica en el metodo keychar de tcombobox
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: 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
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 )
...
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
Carlos Vargas
Desde Managua, Nicaragua (CA)
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
Re: Combobox y enter no funciona
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:
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
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 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