Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Problema con onkeyPress...ayuda por favor (https://www.clubdelphi.com/foros/showthread.php?t=40107)

AFilth 07-02-2007 16:08:25

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.

seoane 07-02-2007 16:30:24

Código Delphi [-]
  // Coloca esto dentro del evento OnKeypress
  Key:= #0;

AFilth 08-02-2007 09:45:22

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.

seoane 08-02-2007 12:05:35

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 :p

AFilth 08-02-2007 12:50:29

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...

seoane 08-02-2007 13:16:21

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.


La franja horaria es GMT +2. Ahora son las 13:05:14.

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