Ver Mensaje Individual
  #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
Reputación: 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 15:50:03.
Responder Con Cita