Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   problemas con TMaskEdit (https://www.clubdelphi.com/foros/showthread.php?t=16840)

squenda 14-12-2004 05:18:39

problemas con TMaskEdit
 
Mi problema es que cuando entro a un maskedit pongo un valor y luego lo borro y me quiero salir me manda el error:

Invalid input value. Use escape key to abandon changes.

tengo entonces que teclear la tecla escape y luego salir del control. Cómo puedo hacer para que esto no suceda, es decir, que pueda introducir un valor, borrarlo y salirme del control sin tener que teclear escape?

Gracias.

saludos

roman 14-12-2004 05:58:30

Cita:

Empezado por squenda
Mi problema es que cuando entro a un maskedit pongo un valor y luego lo borro y me quiero salir me manda el error:

Invalid input value. Use escape key to abandon changes.

Sí, el MaskEdit es un poco necio. El problema está en que al salir del control (pero antes de que se genere el evento OnExit) la componente verifica si el texto ha sido modificado y en tal caso lo valida. Cuando borras el texto, la componente considera que ya se modificó y claro, la validación falla.

Una posible solución es usar el evento OnChange del control para reasignar true a la propiedad Modified en caso de que el texto no contenga nada. Para esto hay que tener en consideración la forma en que se especifica la máscara. Por ejemplo, si la máscara es (para una fecha):

MaskEdit1.EditMask := !99/99/00;0;_

entonces basta que compares con la cadena vacía:

Código Delphi [-]
procedure TForm1.MaskEdit1Change(Sender: TObject);
begin
  if MaskEdit1.Text = '' then
    MaskEdit1.Modified := false;
end;

pero si es:

MaskEdit1.EditMask := !99/99/00;1;_

entoncs deberá de comparar así:

Código Delphi [-]
procedure TForm1.MaskEdit1Change(Sender: TObject);
begin
  if MaskEdit1.Text = '  /  /  ' then
    MaskEdit1.Modified := false;
end;

Esto es así porque el 1 en la segunda parte de la especificación de la máscara indica que los caracteres literales ('/' en este caso) son parte del texto.

// Saludos

mr_mustard 21-05-2008 20:23:38

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/


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

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