Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-04-2006
santi33a santi33a is offline
Miembro
 
Registrado: jun 2005
Posts: 208
Poder: 19
santi33a Va por buen camino
Unhappy Problemas con evento OnExit

Hola a Todos:
Tengo un problema el cual de forma simplificada es:
en un formulario tengo dos controles un Edit y un Button, ahora yo quisiera que al abandonar el control Edit poder validar su contenido esto lo hago en el evento OnExit, si al terminar de llenar el Edit doy tab o click en el Button se activa el evento OnExit (sin problema), el problema esta que en el Button la propiedad Caption tengo &Ok, por lo que si tecleo Alt+O al finalizar de llenar el Edit no se me activa el evento OnExit de este y pasa directamente al Button
¿alguien me pudiera decir como solucionar esto sin quitar el acceso por teclado al Button ?

Santiago
Responder Con Cita
  #2  
Antiguo 14-04-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

A mí se me ocurre algo que no sé si será una barbaridad o qué. Se trataría de sustituir el procedimiento de ventana del formulario en que se encuentra el "TEdit", de tal modo que estuviéramos pendientes de cierto mensaje ("CM_DIALOGCHAR") que se produce justo al procesarse las "teclas aceleradoras".

Podríamos aprovechar ese mensaje, pues, para llamar al disparar el evento "OnExit" del "TEdit", o validar su contenido, en todo caso. Pero encuentro al menos dos posibles problemas. Primero, que el evento "OnClick" del botón se seguirá produciendo, eso sí, después de haber recibido (y procesado) el mensaje susomentado; el otro problema es que el mensaje en cuestión se producirá sean cuales sean las teclas aceleradoras utilizadas por el usuario.

Para esto último quizás valiera discriminar la tecla aceleradora en cuestión (se muestra en el código cómo puede hacerse), pero, sumado al primer problema no sé yo si haría viable esta solución, que, aparentemente, podría servir, pero, habría que verla "en marcha", o sea, en tu propio proyecto funcionando...

Se aceptan más sugerencias, de todos modos.

Código Delphi [-]
var
  { Para guardar el procedimiento
   de ventana original de Form1 }
  frmWindowProc: TWndMethod;

procedure TForm1.FormCreate(Sender: TObject);
begin
  // Guardamos el procedimiento de ventana original
  frmWindowProc := Self.WindowProc;

  // Asignamos nuestro propio procedimiento de ventana
  Self.WindowProc := myWindowProc;
end;

// Evento OnExit de Edit1
procedure TForm1.Edit1Exit(Sender: TObject);
begin
  // Validar el texto de Edit1
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  { Evento OnClick de Button1 (se producirá
    después de que se detecte la pulsación de
    teclas aceleradoras en el formulario
  }
  Memo1.Lines.Add('Evento OnClick del TButton');
end;

{ Este es un método privado de Form1
}
procedure TForm1.myWindowProc(var Message: TMessage);
begin
  // ¿Se detectan teclas aceleradoras?
  if Message.Msg = CM_DIALOGCHAR then
  begin
    { Entonces esto se escrbirá en el Memo1 antes
      que el evento OnClick de Button1, que se pro-
      ducirá a raiz del uso de teclas aceleradoras
    }
    Memo1.Lines.Add('Se usó una tecla aceleradora');

    { Podríamos disparar desde aquí el evento
      OnExit de Edit1, el cual se produciría
      antes del evento Onclick de Button1
    }
    Edit1.OnExit(Edit1);

    {
      Quizás cabría filtrar por una tecla en concreto...

    if TCMDialogChar(Message).CharCode = Ord('o') then
    begin
      Memo1.Lines.Add('Se usó la tecla aceleradora "o"');
      Edit1.OnExit(Edit1);
    end;
    }
  end;
  { En todo caso, dejamos que el procedimiento
    de ventana original se encarge de su curro }
  frmWindowProc(Message);
end;
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 14-04-2006 a las 16:50:03.
Responder Con Cita
  #3  
Antiguo 15-04-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Lo que yo hacía en estos casos era poner explícitamente el foco en el botón OK por código:

Código Delphi [-]
procedure TForm1.OkButttonClick(Sender: TObject);
begin
  OkButton.SetFocus();

  ...
end;

Así me aseguraba que cualquier evento OnExit se ejecutara.

// Saludos
Responder Con Cita
  #4  
Antiguo 15-04-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
Empezado por Román
Así me aseguraba que cualquier evento OnExit se ejecutara.
Pues sí que parece una forma mucho más sencilla y elegante, sí.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #5  
Antiguo 15-04-2006
santi33a santi33a is offline
Miembro
 
Registrado: jun 2005
Posts: 208
Poder: 19
santi33a Va por buen camino
Asombroso, yo me puse a investigar el comportamiento de los eventos con las teclas aceleradoras y me di cuenta que al activar una de estas ejecuta el codigo asosiado (en el ejemplo planteado el OnClick del Button) pero el Edit no perdía el foco por lo que nunca se ejecutaba el evento OnExit de este.
Habia pensado en el evento OnKeyDown del formulario de esta forma
Código Delphi [-]
procedure TFAFact.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
inherited;
if (Shift = [ssAlt]) and (ActiveControl = Edit1) then 
Edit1Exit(nil)
end;
pero de esta manera el codigo OnExit del edit se me ejecutaba dos veces pues como el edit se queda con el foco al salir de este se ejecuta nuevamente
La solución de roman me parece maravillosa por lo sencilla y efectiva
Muchas gracias a todos por la ayuda

¡Que fuera de nosotros sin los foros!

Siempre dos cabezas piensan mejor que una
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Evento OnExit de un Edit Caro OOP 1 03-02-2006 18:57:01
Evento Hint lotos8ar Varios 6 07-10-2005 18:23:55
Evento OnClick vtdeleon OOP 4 09-08-2005 00:40:18
OnExit DarioArg Varios 2 12-03-2005 03:34:55
El evento OnActivate esquerda21 Varios 8 18-06-2003 19:03:35


La franja horaria es GMT +2. Ahora son las 12:16:39.


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