Intentaré explicar esto que me tiene para atrás.
en un form tengo un dateedit, una grilla y un par de componentes más.
tengo definidas un par de teclas que llaman a una pantalla para elegir
un registro, hace un par de cosas y sigue, el código es el de mas abajo.
METHOD WMKeyDown( nKey, nFlags ) CLASS TTurnosABM
/* Aca se definen las teclas de función que deberían estar visibles
solo en turnos */
local identidadturno := ::identidadturno
::oTimerRefrescarGrilla:lEnabled := .f.
IF nKey == VK_F3
//::oEditCodAgenda:Setfocus() // F3 ->
Buscar agenda
identidadturno :=
::oEntidadesturno:BuscarEntidadTurno(alltrim(::oEditCodAgend a:Value), "C")
ELSEIF nKey == VK_F9
identidadturno :=
::oEntidadesturno:BuscarEntidadTurno(alltrim(::oEditAgenda:V alue), "D")
ENDIF
IF identidadturno > 0
::identidadturno := identidadturno
::oEntidadesturno:DevolverPorID(::identidadturno)
::oEditCodAgenda:Value := ::oEntidadesturno:codigo
::PostElegirEntidadTurno()
ENDIF
::oTimerRefrescarGrilla:lEnabled := .t.
RETURN Super:WMKeyDown(nKey, nFlags)
la rutina del usuario es ingresar una fecha en el dateedit y luego
presionar F3 o F9 para elegir la agenda de turnos que quiere gestionar,
todo bien pero luego de haber presionado estas teclas una vez cuando se
dirije al dateedit para cambiar de día apenas tipea un numero (un
digito) sale por el onexit del dateedit por ende es un embole por que te
deja tipear la fecha pero por cada digito te saca.
tiene cierta relacion con algunos comentarios en el foro sobre por que
se ejecutan dos veces algunos onexit de algunos controles
es cierto tambien que ::PostElegirEntidadTurno() hace un monton de cosas
e interactua y refresca controles en pantalla pero que tiene que ver eso
con que el dateedit quede atrapado de esa forma, probé haciendo RETURN 0
como se comenta por el foro, no se que se yo me tiene amargado este
tema. para colmo preparar un ejemplo es casi imposible.
gracias.
In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.
Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.
Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.
Problema con WMKeyDown - algo queda seteado y no se que hacer
- Carlos Ortiz
- Mensajes: 873
- Registrado: Mié Jul 01, 2009 5:44 pm
- Ubicación: Argentina - Córdoba
- Contactar:
Problema con WMKeyDown - algo queda seteado y no se que hacer
Carlos
Solo como una prueba. ponle un boton delante del edit. de manera que sea el siguiente control que retenga el foco.
A mi me sucedio algo parecido, tenia un edit despues una "grilla", despues de pasar por el metodo onexit del edit hacia muchos pantallazos raros. lo solucione de la menera que te indico.
Un Saludo
Solo como una prueba. ponle un boton delante del edit. de manera que sea el siguiente control que retenga el foco.
A mi me sucedio algo parecido, tenia un edit despues una "grilla", despues de pasar por el metodo onexit del edit hacia muchos pantallazos raros. lo solucione de la menera que te indico.
Un Saludo
- Carlos Ortiz
- Mensajes: 873
- Registrado: Mié Jul 01, 2009 5:44 pm
- Ubicación: Argentina - Córdoba
- Contactar:
Problema con WMKeyDown - algo queda seteado y no se que hacer
Gracias Gabriel
veo que me has entendido lo que me pasa, eso ya es algo por que la
verdad hace 1 mes que tengo este problema y no me animaba a plantearlo
por que temía me tomaran por loco, la verdad es que me está volviendo un
poco loco.
Le puse un botón y me apoye en OnKeyDown como está mas abajo
METHOD FechaKeyDown( oSender, nKey, nFlags ) CLASS TTurnosABM
IF allstr(nKey)$'35/36/39/37/13/114/120'
RETURN Nil
ENDIF
RETURN 0
y por lo menos no me repite la llamada al OnExit por cada número o tecla
que tipea, solo me resta corregir que al salir por el OnExit me vuelve a
llamar al OnExit otra vez para colmo en el onexit trae los turnos de la
base de datos que son muchos y setea unas alertas del médico y un par de
cosas mas y demora un par de segundos pero al volver a llamarlo pinta
todo de nuevo, un embole y los usuarios me reclaman este fallo en la
interfaz.
Algo le pasa al onexit cuando se ve sobrecargado con varios proceso.
Lo que hago en el onexit de la fecha es esto
METHOD FechaExit( oSender, oNextCtl ) CLASS TTurnosABM
IF ::oFecha:Value#::oFecha:Cargo // cargo algo
distinto a lo que había en el control
::ValidarFechaCalendar(::oFecha:Value) // Se fija en el
calendario los feriados y festivos
::CargarMemoMsgAgenda() //Carga en el mem
de alertas q es Hay un evento para recordarle al usuario
::oFecha:Cargo := ::oFecha:Value
::ActualizarLabelFecha() //
actualiza un label que muestra el nombre del día en texto
IF !empty(::oEditCodAgenda:Value)
::oTimerRefrescarGrilla:lEnabled := .f.
::ArmarGrillaTurnos() //
carga un browse con los turnos del dia seleccionado
::OrdenarBuscar("''") // lo
reordena (es un memdataset)
::ArmarGrillaHorarios() //
muestra otro browse que dice los dias que atiende el medico
//::oDBBrowseTurnos:SetFocus()
::nSegundos := 0
::oTimerRefrescarGrilla:lEnabled := .t.
ENDIF
ENDIF
RETURN NIL
O sea es cierto que hace un monton de cosas pero Xailer siempre se la
banco acá no se que pasa, mira que tengo miles de lineas de código
escrito con esta herramienta y hace 1 mes que no logro resolver esto.
Nuevamente gracias Gabriel.
Uso Xailer 2.4.4. + Postgres
PD adjunto la pantalla de asignación de turnos por las dudas sirva de algo.
--
veo que me has entendido lo que me pasa, eso ya es algo por que la
verdad hace 1 mes que tengo este problema y no me animaba a plantearlo
por que temía me tomaran por loco, la verdad es que me está volviendo un
poco loco.
Le puse un botón y me apoye en OnKeyDown como está mas abajo
METHOD FechaKeyDown( oSender, nKey, nFlags ) CLASS TTurnosABM
IF allstr(nKey)$'35/36/39/37/13/114/120'
RETURN Nil
ENDIF
RETURN 0
y por lo menos no me repite la llamada al OnExit por cada número o tecla
que tipea, solo me resta corregir que al salir por el OnExit me vuelve a
llamar al OnExit otra vez para colmo en el onexit trae los turnos de la
base de datos que son muchos y setea unas alertas del médico y un par de
cosas mas y demora un par de segundos pero al volver a llamarlo pinta
todo de nuevo, un embole y los usuarios me reclaman este fallo en la
interfaz.
Algo le pasa al onexit cuando se ve sobrecargado con varios proceso.
Lo que hago en el onexit de la fecha es esto
METHOD FechaExit( oSender, oNextCtl ) CLASS TTurnosABM
IF ::oFecha:Value#::oFecha:Cargo // cargo algo
distinto a lo que había en el control
::ValidarFechaCalendar(::oFecha:Value) // Se fija en el
calendario los feriados y festivos
::CargarMemoMsgAgenda() //Carga en el mem
de alertas q es Hay un evento para recordarle al usuario
::oFecha:Cargo := ::oFecha:Value
::ActualizarLabelFecha() //
actualiza un label que muestra el nombre del día en texto
IF !empty(::oEditCodAgenda:Value)
::oTimerRefrescarGrilla:lEnabled := .f.
::ArmarGrillaTurnos() //
carga un browse con los turnos del dia seleccionado
::OrdenarBuscar("''") // lo
reordena (es un memdataset)
::ArmarGrillaHorarios() //
muestra otro browse que dice los dias que atiende el medico
//::oDBBrowseTurnos:SetFocus()
::nSegundos := 0
::oTimerRefrescarGrilla:lEnabled := .t.
ENDIF
ENDIF
RETURN NIL
O sea es cierto que hace un monton de cosas pero Xailer siempre se la
banco acá no se que pasa, mira que tengo miles de lineas de código
escrito con esta herramienta y hace 1 mes que no logro resolver esto.
Nuevamente gracias Gabriel.
Uso Xailer 2.4.4. + Postgres
PD adjunto la pantalla de asignación de turnos por las dudas sirva de algo.
--
@dbfarma
www.dbfarma.com.ar
www.dbfarma.com.ar
-
- Mensajes: 558
- Registrado: Mar Feb 09, 2010 2:26 pm
Problema con WMKeyDown - algo queda seteado y no se que hacer
Saludos:
Solo como sugerencia, yo tengo esta otra secuencia de programación al
usar un TEdit, y nunca me ha dado problemas, yo probaría a adaptarla a
su secuencia de programación haber lo que pasa la secuencia es esta:
METHOD WMKeyDown( nKey, nFlags ) CLASS TEdit
IF nKey == VK_UP
::GoPrevControl()
ELSEIF nKey == VK_DOWN
::GoNextControl()
ELSE
RETURN ::Super:WMKeyDown( nKey, nFlags )
ENDIF
RETURN 0
Por probar no se pierde nada.
José R. Castro
El 06/06/2013 1:47, Carlos Ortiz escribió:
> Intentaré explicar esto que me tiene para atrás.
>
> en un form tengo un dateedit, una grilla y un par de componentes más.
> tengo definidas un par de teclas que llaman a una pantalla para elegir
> un registro, hace un par de cosas y sigue, el código es el de mas abajo.
>
> METHOD WMKeyDown( nKey, nFlags ) CLASS TTurnosABM
> /* Aca se definen las teclas de función que deberían estar visibles
> solo en turnos */
> local identidadturno := ::identidadturno
> ::oTimerRefrescarGrilla:lEnabled := .f.
> IF nKey == VK_F3
> //::oEditCodAgenda:Setfocus() // F3 ->
> Buscar agenda
> identidadturno :=
> ::oEntidadesturno:BuscarEntidadTurno(alltrim(::oEditCodAgend a:Value), "C")
> ELSEIF nKey == VK_F9
> identidadturno :=
> ::oEntidadesturno:BuscarEntidadTurno(alltrim(::oEditAgenda:V alue), "D")
> ENDIF
> IF identidadturno > 0
> ::identidadturno := identidadturno
> ::oEntidadesturno:DevolverPorID(::identidadturno)
> ::oEditCodAgenda:Value := ::oEntidadesturno:codigo
> ::PostElegirEntidadTurno()
> ENDIF
> ::oTimerRefrescarGrilla:lEnabled := .t.
> RETURN Super:WMKeyDown(nKey, nFlags)
>
> la rutina del usuario es ingresar una fecha en el dateedit y luego
> presionar F3 o F9 para elegir la agenda de turnos que quiere gestionar,
> todo bien pero luego de haber presionado estas teclas una vez cuando se
> dirije al dateedit para cambiar de día apenas tipea un numero (un
> digito) sale por el onexit del dateedit por ende es un embole por que te
> deja tipear la fecha pero por cada digito te saca.
>
> tiene cierta relacion con algunos comentarios en el foro sobre por que
> se ejecutan dos veces algunos onexit de algunos controles
>
> es cierto tambien que ::PostElegirEntidadTurno() hace un monton de cosas
> e interactua y refresca controles en pantalla pero que tiene que ver eso
> con que el dateedit quede atrapado de esa forma, probé haciendo RETURN 0
> como se comenta por el foro, no se que se yo me tiene amargado este
> tema. para colmo preparar un ejemplo es casi imposible.
>
> gracias.
>
>
Solo como sugerencia, yo tengo esta otra secuencia de programación al
usar un TEdit, y nunca me ha dado problemas, yo probaría a adaptarla a
su secuencia de programación haber lo que pasa la secuencia es esta:
METHOD WMKeyDown( nKey, nFlags ) CLASS TEdit
IF nKey == VK_UP
::GoPrevControl()
ELSEIF nKey == VK_DOWN
::GoNextControl()
ELSE
RETURN ::Super:WMKeyDown( nKey, nFlags )
ENDIF
RETURN 0
Por probar no se pierde nada.
José R. Castro
El 06/06/2013 1:47, Carlos Ortiz escribió:
> Intentaré explicar esto que me tiene para atrás.
>
> en un form tengo un dateedit, una grilla y un par de componentes más.
> tengo definidas un par de teclas que llaman a una pantalla para elegir
> un registro, hace un par de cosas y sigue, el código es el de mas abajo.
>
> METHOD WMKeyDown( nKey, nFlags ) CLASS TTurnosABM
> /* Aca se definen las teclas de función que deberían estar visibles
> solo en turnos */
> local identidadturno := ::identidadturno
> ::oTimerRefrescarGrilla:lEnabled := .f.
> IF nKey == VK_F3
> //::oEditCodAgenda:Setfocus() // F3 ->
> Buscar agenda
> identidadturno :=
> ::oEntidadesturno:BuscarEntidadTurno(alltrim(::oEditCodAgend a:Value), "C")
> ELSEIF nKey == VK_F9
> identidadturno :=
> ::oEntidadesturno:BuscarEntidadTurno(alltrim(::oEditAgenda:V alue), "D")
> ENDIF
> IF identidadturno > 0
> ::identidadturno := identidadturno
> ::oEntidadesturno:DevolverPorID(::identidadturno)
> ::oEditCodAgenda:Value := ::oEntidadesturno:codigo
> ::PostElegirEntidadTurno()
> ENDIF
> ::oTimerRefrescarGrilla:lEnabled := .t.
> RETURN Super:WMKeyDown(nKey, nFlags)
>
> la rutina del usuario es ingresar una fecha en el dateedit y luego
> presionar F3 o F9 para elegir la agenda de turnos que quiere gestionar,
> todo bien pero luego de haber presionado estas teclas una vez cuando se
> dirije al dateedit para cambiar de día apenas tipea un numero (un
> digito) sale por el onexit del dateedit por ende es un embole por que te
> deja tipear la fecha pero por cada digito te saca.
>
> tiene cierta relacion con algunos comentarios en el foro sobre por que
> se ejecutan dos veces algunos onexit de algunos controles
>
> es cierto tambien que ::PostElegirEntidadTurno() hace un monton de cosas
> e interactua y refresca controles en pantalla pero que tiene que ver eso
> con que el dateedit quede atrapado de esa forma, probé haciendo RETURN 0
> como se comenta por el foro, no se que se yo me tiene amargado este
> tema. para colmo preparar un ejemplo es casi imposible.
>
> gracias.
>
>
Problema con WMKeyDown - algo queda seteado y no se que hacer
Carlos
Lo puedes solucionar agregando botones para F3 y F9
Con el metodo OnExit del edit, valida y recupera todo los datos que necesites.
y en el metodo KeyDown solo para simular el uso de las teclas F3 y F9
METHOD WMKeyDown( nKey, nFlags ) CLASS TTurnosABM
..... codigo ..
IF nKey == VK_F3
::oBtn_F3:Click()
ELSEIF nKey == VK_F9
::oBtn_F9:Click()
ENDIF
... codigo ...
RETURN NIL
Los botones son quienes ejecutan el resto del proceso que necesites. si no cumple con las validaciones regresa el foco al edit.
Esta fué la solucion que yo encontre obligue al usuario a dar un click más.
Un Saludo
Lo puedes solucionar agregando botones para F3 y F9
Con el metodo OnExit del edit, valida y recupera todo los datos que necesites.
y en el metodo KeyDown solo para simular el uso de las teclas F3 y F9
METHOD WMKeyDown( nKey, nFlags ) CLASS TTurnosABM
..... codigo ..
IF nKey == VK_F3
::oBtn_F3:Click()
ELSEIF nKey == VK_F9
::oBtn_F9:Click()
ENDIF
... codigo ...
RETURN NIL
Los botones son quienes ejecutan el resto del proceso que necesites. si no cumple con las validaciones regresa el foco al edit.
Esta fué la solucion que yo encontre obligue al usuario a dar un click más.
Un Saludo
Problema con WMKeyDown - algo queda seteado y no se que hacer
Carlos,
> Intentaré explicar esto que me tiene para atrás.
>
> en un form tengo un dateedit, una grilla y un par de componentes más.
> tengo definidas un par de teclas que llaman a una pantalla para elegir
> un registro, hace un par de cosas y sigue, el código es el de mas abajo.
>
> METHOD WMKeyDown( nKey, nFlags ) CLASS TTurnosABM
> /* Aca se definen las teclas de función que deberían estar visibles
> solo en turnos */
> local identidadturno := ::identidadturno
> ::oTimerRefrescarGrilla:lEnabled := .f.
> IF nKey == VK_F3
> //::oEditCodAgenda:Setfocus() // F3 ->
> Buscar agenda
> identidadturno :=
> ::oEntidadesturno:BuscarEntidadTurno(alltrim(::oEditCodAgend a:Value), "C")
> ELSEIF nKey == VK_F9
> identidadturno :=
> ::oEntidadesturno:BuscarEntidadTurno(alltrim(::oEditAgenda:V alue), "D")
> ENDIF
> IF identidadturno > 0
> ::identidadturno := identidadturno
> ::oEntidadesturno:DevolverPorID(::identidadturno)
> ::oEditCodAgenda:Value := ::oEntidadesturno:codigo
> ::PostElegirEntidadTurno()
> ENDIF
> ::oTimerRefrescarGrilla:lEnabled := .t.
> RETURN Super:WMKeyDown(nKey, nFlags)
>
> la rutina del usuario es ingresar una fecha en el dateedit y luego
> presionar F3 o F9 para elegir la agenda de turnos que quiere
> gestionar, todo bien pero luego de haber presionado estas teclas una
> vez cuando se dirije al dateedit para cambiar de día apenas tipea un
> numero (un digito) sale por el onexit del dateedit por ende es un
> embole por que te deja tipear la fecha pero por cada digito te saca.
>
> tiene cierta relacion con algunos comentarios en el foro sobre por que
> se ejecutan dos veces algunos onexit de algunos controles
y yo estoy seguro al 99,99% de que no tiene nada que ver
> es cierto tambien que ::PostElegirEntidadTurno() hace un monton de
> cosas e interactua y refresca controles en pantalla pero que tiene que
> ver eso con que el dateedit quede atrapado de esa forma, probé
> haciendo RETURN 0 como se comenta por el foro, no se que se yo me
> tiene amargado este tema. para colmo preparar un ejemplo es casi
> imposible.
La verdad es que sin un ejemplo que podamos probar, es muy muy
complicado encontrar el problema y la solución. De todos modos, al menos
sería necesaria más información al respecto, como qué hace
::oEntidadesturno:BuscarEntidadTurno(), si se muestra otro formulario y
si es modal o no, etc. Sobretodo, lo más importante es saber por dónde
ha pasado el foco desde que se pulsa la tecla hasta que vuelve al dateedit.
En cualquier caso, voy a tratar de especular un poco...
Veo que ese código lo tienes puesto como método WMKeyDown() del
formulario. Lo correcto sería usar el evento OnKeyDown. No es que no
funcione el método, pero en ese caso hay que tener muy claro todo lo que
ocurre, porque podría tener otras implicaciones. Y una pregunta: ¿Tienen
el dateedit o el formulairo asignados sus eventos OnKeyDown?
Supongo que cuando el usuario pulsa esas teclas, se abre otro formulario
donde hace alguna selección. Y espero que en ningún caso estés llamando
a SetFocus(), ni como función ni como método de ningún control, porque
entonces sí que hay un problema. Por otro lado, aunque el foco cambie a
otro formulario, dentro del formulario que contiene el dateedit no se
cambia el foco, ¿verdad?
Un saludo,
José F. Giménez
http://www.xailer.com
http://www.xailer.info
> Intentaré explicar esto que me tiene para atrás.
>
> en un form tengo un dateedit, una grilla y un par de componentes más.
> tengo definidas un par de teclas que llaman a una pantalla para elegir
> un registro, hace un par de cosas y sigue, el código es el de mas abajo.
>
> METHOD WMKeyDown( nKey, nFlags ) CLASS TTurnosABM
> /* Aca se definen las teclas de función que deberían estar visibles
> solo en turnos */
> local identidadturno := ::identidadturno
> ::oTimerRefrescarGrilla:lEnabled := .f.
> IF nKey == VK_F3
> //::oEditCodAgenda:Setfocus() // F3 ->
> Buscar agenda
> identidadturno :=
> ::oEntidadesturno:BuscarEntidadTurno(alltrim(::oEditCodAgend a:Value), "C")
> ELSEIF nKey == VK_F9
> identidadturno :=
> ::oEntidadesturno:BuscarEntidadTurno(alltrim(::oEditAgenda:V alue), "D")
> ENDIF
> IF identidadturno > 0
> ::identidadturno := identidadturno
> ::oEntidadesturno:DevolverPorID(::identidadturno)
> ::oEditCodAgenda:Value := ::oEntidadesturno:codigo
> ::PostElegirEntidadTurno()
> ENDIF
> ::oTimerRefrescarGrilla:lEnabled := .t.
> RETURN Super:WMKeyDown(nKey, nFlags)
>
> la rutina del usuario es ingresar una fecha en el dateedit y luego
> presionar F3 o F9 para elegir la agenda de turnos que quiere
> gestionar, todo bien pero luego de haber presionado estas teclas una
> vez cuando se dirije al dateedit para cambiar de día apenas tipea un
> numero (un digito) sale por el onexit del dateedit por ende es un
> embole por que te deja tipear la fecha pero por cada digito te saca.
>
> tiene cierta relacion con algunos comentarios en el foro sobre por que
> se ejecutan dos veces algunos onexit de algunos controles
y yo estoy seguro al 99,99% de que no tiene nada que ver

> es cierto tambien que ::PostElegirEntidadTurno() hace un monton de
> cosas e interactua y refresca controles en pantalla pero que tiene que
> ver eso con que el dateedit quede atrapado de esa forma, probé
> haciendo RETURN 0 como se comenta por el foro, no se que se yo me
> tiene amargado este tema. para colmo preparar un ejemplo es casi
> imposible.
La verdad es que sin un ejemplo que podamos probar, es muy muy
complicado encontrar el problema y la solución. De todos modos, al menos
sería necesaria más información al respecto, como qué hace
::oEntidadesturno:BuscarEntidadTurno(), si se muestra otro formulario y
si es modal o no, etc. Sobretodo, lo más importante es saber por dónde
ha pasado el foco desde que se pulsa la tecla hasta que vuelve al dateedit.
En cualquier caso, voy a tratar de especular un poco...
Veo que ese código lo tienes puesto como método WMKeyDown() del
formulario. Lo correcto sería usar el evento OnKeyDown. No es que no
funcione el método, pero en ese caso hay que tener muy claro todo lo que
ocurre, porque podría tener otras implicaciones. Y una pregunta: ¿Tienen
el dateedit o el formulairo asignados sus eventos OnKeyDown?
Supongo que cuando el usuario pulsa esas teclas, se abre otro formulario
donde hace alguna selección. Y espero que en ningún caso estés llamando
a SetFocus(), ni como función ni como método de ningún control, porque
entonces sí que hay un problema. Por otro lado, aunque el foco cambie a
otro formulario, dentro del formulario que contiene el dateedit no se
cambia el foco, ¿verdad?
Un saludo,
José F. Giménez
http://www.xailer.com
http://www.xailer.info