Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-02-2007
AFilth AFilth is offline
Miembro
 
Registrado: ago 2005
Posts: 119
Poder: 19
AFilth Va por buen camino
Problema con onkeyPress...ayuda por favor

Hola a todos,

Estoy haciendo un componente que hereda del TEdit.
He redefinido su evento OnKeyPress de tal forma que al final del mismo hago un:
Código Delphi [-]
caption := MiVariable

El problema es que siempre me pone lo que yo quiero en el edit pero siempre queda como primer caracter del edit la tecla que he pulsado en último lugar. Es decir, si por ejemplo escribo: 1234 en el edit me aparece 41234

Supongo que será debido a que por otro lado está escribiendo por el mensaje de windows en el onkeydown ó algo así...

Que solución fácil y rápida se os ocurre??

Un saludo.
Responder Con Cita
  #2  
Antiguo 07-02-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Código Delphi [-]
  // Coloca esto dentro del evento OnKeypress
  Key:= #0;
Responder Con Cita
  #3  
Antiguo 08-02-2007
AFilth AFilth is offline
Miembro
 
Registrado: ago 2005
Posts: 119
Poder: 19
AFilth Va por buen camino
Funciona perfecto poniendo lo que me dijiste al final del OnKeypress Seone, muchas gracias.

Una pregunta más, me gustaría saber el porqué de lo que me pasaba...si no es mucho pedir y alguien me lo puede explicar se lo agradecería. Un saludo.
Responder Con Cita
  #4  
Antiguo 08-02-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
La explicación es sencilla, aunque tu le asignaras un valor al edit en el evento OnKeypress, todavía no había llegado la pulsación al edit, así después de terminar el evento llegaba y como el cursor debía de estar al principio del texto de ahí que se añadiera al principio. Por eso el evento OnKeyPress pasa como var el valor key, de esta manera podemos cambiar su valor por otro, pudiendo cambiar una tecla por otra, pero cuando se sustituye por un cero es como si anuláramos la tecla.

Espero haberme explicado, porque me parece que al final me lié un poco
Responder Con Cita
  #5  
Antiguo 08-02-2007
AFilth AFilth is offline
Miembro
 
Registrado: ago 2005
Posts: 119
Poder: 19
AFilth Va por buen camino
Te has explicado bien

Lo qe comentas es lo que me imaginaba, pero mi pregunta no era esa exactamente. Yo he redefinido el evento OnKeypress y le he quitado el inherited, por tanto (como yo creía aunque veo que estoy equivocado), no debería poner en el edit nada. Es decir quien realmente escribe en el edit no es el evento OnKeyPress del TEdit si no algún otro evento ya que si yo anulo ese me sigue escribiendo a no ser que le meta el #0.

PD: Yo sí que me he explicado mal...
Responder Con Cita
  #6  
Antiguo 08-02-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
La explicacion esta en la implementacion de la clase TWinControl de la que desciende el TEdit. Cuando recibe el mensage WM_CHAR, se ejecuta lo siguiente:

Código Delphi [-]
function TWinControl.DoKeyPress(var Message: TWMKey): Boolean;
var
  Form: TCustomForm;
  Ch: Char;
begin
  Result := True;
  Form := GetParentForm(Self);
  if (Form <> nil) and (Form <> Self) and Form.KeyPreview and
    TWinControl(Form).DoKeyPress(Message) then Exit;
  if not (csNoStdEvents in ControlStyle) then
    with Message do
    begin
      Ch := Char(CharCode);
      KeyPress(Ch); // <-- Este es el evento OnKeyPress
      CharCode := Word(Ch);
      if Char(CharCode) = #0 then Exit;
    end;
  Result := False;
end;

procedure TWinControl.WMChar(var Message: TWMChar); // <- Esto maneja el mensaje WM_CHAR
begin
  if not DoKeyPress(Message) then inherited;
end;

Como ves, si no se pone el valor de key a cero, el resultado de la función DoKeyPress es FALSE, por lo que es delphi quien llama a inherited. Poniendo key a cero evitamos que eso pase.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
ayuda urgente por favor problema BDE Rabata Conexión con bases de datos 2 10-04-2008 19:43:00
Problema con DBGrid y Query...Ayuda por favor! AFilth Varios 2 03-11-2005 16:42:17
Problema con excepción en el ejecutable, ayuda por favor AFilth Varios 6 31-10-2005 14:40:59
Problema con TCP/IP en aplicación simple¿?¿?Ayuda por favor! AFilth Varios 1 01-09-2005 12:27:58
GRAN PROBLEMA. Por favor ayuda. zugazua2001 Varios 3 01-07-2005 05:59:15


La franja horaria es GMT +2. Ahora son las 07:38:58.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi