Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
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 21-05-2008
mr_mustard mr_mustard is offline
Registrado
 
Registrado: feb 2006
Posts: 8
Poder: 0
mr_mustard Va por buen camino
Talking Otra solución

Hola, hallé una solución muy buena a este problema de un amigo brasileño. Parece que están más adelantados allá jajaja!
Está en portugués pero creo que da para entender:


Delphi: como interceptar o evento OnExit de um TMaskEdit?

Autor: Marcos Dell Antonio - Categorias: Delphi

Com certeza o componente TMaskEdit foi modelado às pressas pela equipe responsável, pois forçar uma validação com uma mensagem fixa sempre que o usuário sai do campo é um crime. E tem mais: eu diria que a pena é de prisão perpétua, pois além disso, quando você limpa o conteúdo do campo e sai dele, a validação também é executada. Neste caso, adivinha o que acontece? Uma mensagem de erro aparece mesmo sem ter valor algum no campo.
Há quem diga que é impossível desabilitar esta validação. Realmente é, se pensarmos de forma racional. No entanto, não custa nada partir pra baixaria uma vez ou outra.
Todos os componentes trabalham com mensagens enviadas pelo Windows para ativar os eventos. Portanto, o que acontece com o TMaskEdit?
Ele recebe uma mensagem informando que o usuário saiu do campo, executa o OnExit e, neste momento, faz a validação do conteúdo.
Já que o problema descrito acima acontece mesmo quando o usuário limpa o valor do campo, a solução é interceptar o evento OnExit e só executar o código padrão caso algum valor tenha sido informado.
Como fazer? Simples. Veja:
Declare uma procedure type of object (em outra palavras, um método) e um field do tipo TWndMethod:

FOldWindowProc: TWndMethod;
procedure WMWindowProc(var Msg: TMessage);

A implementação do método é a seguinte:

procedure TfrmForm.WMWindowProc(var Msg: TMessage);
begin

if
(Msg.Msg = CM_EXIT) then
begin

if
(maskEdit.Text <>) then
FOldWindowProc(Msg);

end

else

FOldWindowProc(Msg);

end
;

No evento FormShow do formulário faça as seguintes atribuições:

FOldWindowProc := maskEdit.WindowProc;
maskEdit.WindowProc :
= WMWindowProc;

Pronto! Agora sempre que o evento OnExit do TMaskEdit for executado ele só fará a validação se o Text for diferente de vazio.
T+
Ps1: falei especificamente do TMaskEdit, porém este conceito de captura de eventos vale para todos os componentes.

Fuente: http://www.marcosdellantonio.net/category/delphi/

Última edición por mr_mustard fecha: 21-05-2008 a las 20:39:13. Razón: estaba ilegible el código
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


La franja horaria es GMT +2. Ahora son las 10:48:33.


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