Ir al contenido


Foto

Problema con el evento OnKeyPress de un TSpinEdit


  • Por favor identifícate para responder
16 respuestas en este tema

#1 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 23 mayo 2016 - 06:24

Pues eso, no sé si algunos de ustedes les ha pasado, trabajo con Delphi XE7 y Windows 10, estoy tratando de capturar el botón Enter del teclado en el evento OnKeyPress del objeto:


delphi
  1. procedure TfrmSQLEditor.spinRecordKeyPress(Sender: TObject; var Key: Char);
  2. begin
  3. if key = #13 then begin
  4. showMessage('he presionado enter');
  5. Key := #0;
  6. end;
  7. end;

No funciona!, ¿me echan una mano?.

 

Saludos.


  • 0

#2 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 831 mensajes
  • LocationArgentina

Escrito 23 mayo 2016 - 08:25

Pon KeyPreview a True en el Form


Editado por Agustin Ortu, 23 mayo 2016 - 08:26 .

  • 0

#3 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 24 mayo 2016 - 06:37

Ah caray, ¿ahora es así?, en versiones anteriores no había que activar esa propiedad.
  • 0

#4 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 24 mayo 2016 - 08:03

Ah caray, ¿ahora es así?, en versiones anteriores no había que activar esa propiedad.

 

Mmm, al menos desde 2007 si es necesario activar la propiedad... o sería que antes estaba en True por default ? Habría que investigar...

 

Saludox ! :)


  • 0

#5 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 24 mayo 2016 - 09:20

Pues yo he trabajado en las versiones 7, 2007, XE2, XE5 y ninguno tuve que activarlo a excepción de XE5 que no llegué aplicar el KeyPress.
  • 0

#6 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 24 mayo 2016 - 12:23

Enhorabuena por la solución enecumene, por parte de Agustín y Fenareth. Tomo nota, aunque no se si en mi caso en Lazarus me será útil, lo probaré.


  • 0

#7 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 24 mayo 2016 - 03:25

Pues sigo teniendo problemas, aún activado la propiedad KeyPreview del formulario (Porque el componente no lo tiene) no captura la tecla, anteriormente no sonaba al presionar la tecla y ahora sí, pero no entra al mensaje, incluso hice lo siguiemte para saber el carácter exacto tampoco entra:

delphi
  1. procedure TfrmSQLEditor.spinRecordKeyPress(Sender: TObject; var Key: Char);
  2. begin
  3. MessageDLG('Se ha presionado ' + Key, mtInformation,[mbOk],0);
  4. end;

¿Alguien podrá replicar el problema?
  • 0

#8 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 24 mayo 2016 - 03:49

Lo he resuelto usando el evento OnKeyDown:

delphi
  1. procedure TfrmSQLEditor.spinRecordKeyDown(Sender: TObject; var Key: Word;
  2.   Shift: TShiftState);
  3. begin
  4.   if Key = VK_RETURN then
  5.   begin
  6.     Consulta.RecNo := StrToInt(spinRecord.Text);
  7.   end;
  8. end;

Pero aún sigo sin entender por qué no funciona en el evento OnKeyPress.
  • 0

#9 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 24 mayo 2016 - 04:00

Pos... ya me dejas intrigado.

No puedo reproducir el problema, aunque podría ver que sucede en Lazarus.

¿Será que el TSpinEdit tiene alguna cosilla con el evento OnKeyPress?

 

Saludos,


  • 0

#10 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 24 mayo 2016 - 04:30

Pos... ya me dejas intrigado.
No puedo reproducir el problema, aunque podría ver que sucede en Lazarus.
¿Será que el TSpinEdit tiene alguna cosilla con el evento OnKeyPress?
 
Saludos,


Pues yo creo tiene algún bug.
  • 0

#11 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 24 mayo 2016 - 04:39

Por eso yo me lo decía... quien sabe, todo puede ser.

 

Lo que quizá estoy pensando es que al ser un componente tan particular, internamente anule o sobreescriba el evento OnKeyPress justamente para impedir y/o controlar que no se escriba cualquier cosa en el. El TSpinEdit está pensado para escribir números justamente. Asi que quizá esto tiene algo que ver.

 

Lo que si estoy viendo ahora es que en tu último código haces una conversión de string a integer... Creería que no es necesario que captures el texto del TSpinEdit y lo pases a entero. ¿Que no es que el TSpinEdit tiene una propiedad Value o algo por el estilo que almacena el valor actual? ;)

 

Saludos,


  • 0

#12 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 24 mayo 2016 - 05:05

No sabría decirte pero aún sin esa línea y colocando un Showmessage de todos modos no entra sólo suena, por ahí estaba leyendo que hay sobreescribir (Override) con la misma clase del SpinEdit y utilizar la función isValidChar(), pero no encuentro ejemplo de ello.
  • 0

#13 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 24 mayo 2016 - 05:41

Pues que cosas... acabo de probar que sucede en Lazarus esto:


delphi
  1. procedure TForm1.SpinEdit1KeyPress(Sender: TObject; var Key: char);
  2. begin
  3. if Key = #13
  4. then Label1.Caption := 'Pulsado: ENTER'
  5. else Label1.Caption := 'Pulsado: ' + Key;
  6. end;

Y efectivamente, si presiono enter, muestra el respectivo mensaje en el label, mientras que en el TSpinEdit no muestra nada.

Para cualquier otra tecla en label se muestra el carácter en cuestión, y en el caso de números se los ve bien en el TSpinEdit. Si presiono el backspace muestra el símbolo corazón... se me hace que entra en juego el UTF-8 en Lazarus.

 

La verdad es que es bastante curioso lo que dices amigo. Puede que tenga pinta de bug.

 

Saludos,


  • 0

#14 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 24 mayo 2016 - 05:46

Pues acabo de dar con la solución en Delphi, no me pude quedar tranquilo :D, creé una entrada en mi blog informando de la solución:

http://www.enecumene...edit-en-delphi/

Saludos.
  • 2

#15 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 24 mayo 2016 - 07:32

Si hay que sobreescribir IsValidChar es que justamente internamente el componente está diseñado para anular algunos chars. Entre ellos los que no tienen sentido mostrar para el tipo y uso del componente.
Le apunté medio cerca del palo con mi 2da hipótesis.

En el truco de interpuser class que usas es aconsejable que nombres a esa clase heredada con otro nombre. THackSpinEdit o algo por el estilo.

Saludos,
  • 1

#16 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 831 mensajes
  • LocationArgentina

Escrito 24 mayo 2016 - 08:37

Interesante, use alguna que otra vez este componente en algun form que quedo por ahi

 

Yo apunte al KeyPreview porque algo similar me pasaba cuando queria detectar eventos de pulsacion de teclas, no recuerdo cual era el componente que las ignoraba. Entonces procesaba las teclas en el Form con KeyPreview y listo. No se realmente si es una muy buena idea

 

Ultimamente ando pasando a Actions con Shortcuts para disparar la gran mayoria de eventos del teclado, y redefino el KeyDown (metodo protegido de TForm) como lugar centralizado para capturar lo que me resta. Quiza es cierto que llena de codigo algo innecesario a TForm, pero por lo menos no dependo de un componente en particular. Mas de una vez me paso que por A o por B se desvinculan los eventos de los controles (porque lo cambio, o sin querer, o porque tengo el mal habito de hacer malabares raros con el portapales) y en ningun lado te avisa


  • 0

#17 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 24 mayo 2016 - 09:14


Ultimamente ando pasando a Actions con Shortcuts para disparar la gran mayoria de eventos del teclado, y redefino el KeyDown (metodo protegido de TForm) como lugar centralizado para capturar lo que me resta. Quiza es cierto que llena de codigo algo innecesario a TForm, pero por lo menos no dependo de un componente en particular. Mas de una vez me paso que por A o por B se desvinculan los eventos de los controles (porque lo cambio, o sin querer, o porque tengo el mal habito de hacer malabares raros con el portapales) y en ningun lado te avisa

 

El uso de Actions es quizá lo más aconsejable. Sobre todo si se va a disponer de más de una forma de llegar al mismo evento.

Los controles pueden variar, y los Actions quedan y no hay que tocarlos.

Yo no los usé. Y no porque no me gustaban, simplemente se me pasa por alto. Falta de (buenas) costumbres.

 

Saludos,


  • 0




IP.Board spam blocked by CleanTalk.