Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 16-10-2003
NuncaMas NuncaMas is offline
Miembro
 
Registrado: oct 2003
Posts: 70
Poder: 21
NuncaMas Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 16-10-2003
Viet Viet is offline
Miembro
 
Registrado: jul 2003
Ubicación: Argentina - Mar del Plata
Posts: 252
Poder: 21
Viet Va por buen camino
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
__________________
Marín Ignacio Borthiry (Viet) - "El hombre arriesga su vida cada vez que elije y eso es lo que lo hace libre" ;)
Responder Con Cita
  #3  
Antiguo 16-10-2003
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
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.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #4  
Antiguo 16-10-2003
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
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.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #5  
Antiguo 16-10-2003
andres1569 andres1569 is offline
Miembro
 
Registrado: may 2003
Posts: 908
Poder: 21
andres1569 Va por buen camino
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
__________________
Guía de Estilo
Responder Con Cita
  #6  
Antiguo 16-10-2003
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
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
Responder Con Cita
  #7  
Antiguo 16-10-2003
Viet Viet is offline
Miembro
 
Registrado: jul 2003
Ubicación: Argentina - Mar del Plata
Posts: 252
Poder: 21
Viet Va por buen camino
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
__________________
Marín Ignacio Borthiry (Viet) - "El hombre arriesga su vida cada vez que elije y eso es lo que lo hace libre" ;)
Responder Con Cita
  #8  
Antiguo 16-10-2003
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
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.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #9  
Antiguo 17-10-2003
andres1569 andres1569 is offline
Miembro
 
Registrado: may 2003
Posts: 908
Poder: 21
andres1569 Va por buen camino
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
__________________
Guía de Estilo
Responder Con Cita
  #10  
Antiguo 14-08-2004
Avatar de AGAG4
AGAG4 AGAG4 is offline
Miembro
 
Registrado: ago 2004
Ubicación: Los Mochis, Sinaloa, México
Posts: 1.420
Poder: 21
AGAG4 Va por buen camino
Unhappy ????

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;"
Responder Con Cita
  #11  
Antiguo 14-08-2004
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
¿Qué error te marca?

// Saludos
Responder Con Cita
  #12  
Antiguo 07-01-2010
pablo_madrid pablo_madrid is offline
Registrado
 
Registrado: ene 2010
Posts: 1
Poder: 0
pablo_madrid Va por buen camino
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.
Responder Con Cita
Respuesta



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 07:13:55.


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