Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   MaskEdit (https://www.clubdelphi.com/foros/showthread.php?t=4453)

NuncaMas 16-10-2003 11:51:45

MaskEdit
 
Como puedo capturar el error que da el maskedit cuando introduces algo que no esta de acuerdo con la mascara???. El asunto es que quiero evitar que salgan errores en ingles, para ponerlos yo en cristiano. Gracias.

Viet 16-10-2003 15:24:23

Buenas.

Yo soy partidario de usar el metodo OnExit y ahi poner mi propio chequeo de tipos

por ejemplo :

Código:


    Try
            x := strtodate(MaskEdit.text);
  Except
          Showmessage('El dato ingresado no es una fecha');
  End;

Estoy de acuerdo que no es lo optimo, y que no aprovecho el Mask .... pero .... me funciona bien

Espero que te sirva ;)

marcoszorrilla 16-10-2003 15:35:53

Una solución, a falta de otra mejor, que de momento no se me ocurre, sería:
Bájate un componente ApplicationEvents y el evento OnException del mismo, escribes llo que sigue:

Código:

procedure TForm1.ApplicationEvents1Exception(Sender: TObject;
  E: Exception);
begin
ShowMessage(e.Message);
  if (lowercase(copy(E.Message,1,19)))='invalid input value' then
  Application.MessageBox('Formato de datos incorrecto inténtelo de nuevo.','Atención',mb_Ok +
  mb_IconQuestion);
end;

Te garantizo que funciona, si alguien sabe alguna manera mas elegante de resolverlo será bienvenido al hilo.

Un Saludo.

marcoszorrilla 16-10-2003 15:43:14

Al ver lo que ha escrito el amigo Viet, me he recordado que yo también utilizo esa técnica, por lo tanto, me retracto de la última parte de mi mensaje:

Esta es una muestra del código, que nada más ver el de Viet me sonaba mucho.

Código:

procedure TfrFactFechas.mkFiniExit(Sender: TObject);
begin
try
 fini:=StrToDate(mkFini.text);
  except
    Application.MessageBox('Formato de fecha incorrecto','Atención',mb_Ok +mb_IconQuestion);
    mkFini.SetFocus;
  end;


end;

Otro Saludo.

andres1569 16-10-2003 16:48:03

Hola:

Marcos, en este momento tienes el 666 de nº de posts, así que no sé si decirte nada :)

La opción de usar el componente ApplicationEvents me parece la mejor (si no la única) para interceptar Excepciones donde no es posible utilizar un bloque Try ... except. La única pega que le veo es que sólo nos puede servir para lanzar mensajes de advertencia al usuario, y poco más; quiero decir que difícilmente en este evento podemos tomar medidas respecto a un Control concreto, pues estos pueden ser varios / muchos desperdigados por los distintos forms, y no es cuestión que ese componente sepa cómo actuar en dichos controles.

Si necesitas actuar sobre el Control que lanzó la excepción, por ejemplo para devolverle el Foco, ahí es mejor la opción del evento OnExit (qué lástima que el TMaskEdit no tenga un evento OnMaskError, al estilo de los TDatasets ...).

Un saludo

roman 16-10-2003 17:38:13

Otra solución:

El error que se muestra (en inglés) se produce en el método virtual ValidateError de TCustomMaskEdit:

Código:

procedure TMaskEdit.ValidateError;
begin
  MessageBeep(0);
  raise EDBEditError.CreateResFmt(@SMaskEditErr, [EditMask]);
end;

Como el mensaje de error lo toma de un recurso del programa supongo entonces que puede sustituirse dicho recurso. Aquí mismo en el club están los recursos en español.

Pero otra manera de hacer esto consiste en derivar una clase de TMaskEdit redefiniendo dicho método virtual. Lo qe me parece interesante es que no es necesario instalar un nuevo componente y sustituir todas las ocurrencias que de él tengamos en nuesro formulario. Bastará declararlo así antes de la declaración de la clase del formulario:

Código:

type
  TMaskEdit = class(Mask.TMaskEdit)
  protected
    procedure ValidateError; override;
  end;

  TForm1 = class(TForm)
    { métodos y propiedades }
  end;

implementation

procedure TMaskEdit.ValidateError;
begin
  MessageBeep(0);
  raise EDBEditError.Create('Formato incorrecto');
end;
end.

"Mágicamente" todos los controles MaskEdit que hubiéramos tenido en el formulario serán instancias del nuevo TMaskEdit.

No sé si cumple los requisitos de "más elegante" que pide el amigo marcoszorrilla :) pero me parece interesante.

// Saludos

Viet 16-10-2003 17:47:31

Yo me quedo con lo de roman... porque la mayor ventaja es que el control y la validacion de la mascara va a seguir por parte de la clase MaskEdit... con lo que nos ahorramos tener que programarlo nosotros (que en definitiva estabamos usando un Edit y era lo mismo)

Gracias por el dato ;)

marcoszorrilla 16-10-2003 21:59:51

Pues Andrés ni me había enterado de ese número de mensajes tan palíndromo, en cuanto a lo que propone Román, acabo de probarlo y me parece:
Very Smart, es decir no solo elegante y bonito que es a lo que yo aludía sino inteligente.

Un Saludo.

andres1569 17-10-2003 12:32:44

Hola:

También abogo por la propuesta de Román. Todo lo que pueda hacer el componente sin mediación de terceros, mejor que mejor.

Por cierto, la técnica que se emplea en dicha solución para redefinir un método de un componente sin necesidad de instalarlo es la que se expone en el truco Clases interpuestas de la web de Ian Marteens (dicho sea de paso, creo que Marteens recibe mucha y buena publicidad en estos foros, no estaría mal que se pasara por aquí alguna vez :) ).

Saludos

AGAG4 14-08-2004 16:56:10

????
 
type
TMaskEdit = class(Mask.TMaskEdit)
protected
procedure ValidateError; override;
end;

TForm1 = class(TForm)
{ métodos y propiedades }
end;

implementation

procedure TMaskEdit.ValidateError;
begin
MessageBeep(0);
raise EDBEditError.Create('Formato incorrecto');
end;
end.

**No me funciona en esta, lo que pasa es que me marca error en "procedure ValidateError; override;"

roman 14-08-2004 18:26:50

¿Qué error te marca?

// Saludos

pablo_madrid 07-01-2010 13:11:08

hola, soy nuevo en el foro y esto es un poco antiguo pero me seria util conseguir que funcionase. A mi tambien me sale un error al poner el codigo de Roman y es el siguiente:

[Error] Unit1.pas(11): Unsatisfied forward or external declaration: 'TMaskEdit.ValidateError'
[Fatal Error] Project1.dpr(9): Could not compile used unit 'Unit1.pas'

A que puede ser devido? gracias.


La franja horaria es GMT +2. Ahora son las 16:40:30.

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