Comunidad Delphiaccess

Por favor ingresa o regístrate.

Ingresar con nombre de usuario, contraseña y duración de la sesión
Búsqueda Avanzada  

Noticias y Eventos:


Te recomendamos que actualices tu huso horario a la hora que te corresponda, esto lo puedes hacer con un simple clic en la opción  (detectar automáticamente) del menú Configuración de Apariencia y Diseño de tu perfil.

Equipo de Administación




Autor Tema: Método para crear ventanas de Excepciones personalizadas  (Leído 710 veces)

0 Usuarios y 1 Visitante están viendo este tema.

« en: 05 de Diciembre de 2008, 06:42:18 »
En línea

enecumene

  • Administrador
  • *****
  • Calificaciones: +81/-1
  • Desconectado Desconectado
  • Sexo: Masculino
  • Mensajes: 2,977

  • Actividad
    39.4%
  • Gracias
  • -Dados: 61
  • -Recibidos: 40
  • DA Webmaster
Método para crear ventanas de Excepciones personalizadas
« en: 05 de Diciembre de 2008, 06:42:18 »
Creo este hilo para enseñarles cómo hacer una ventana personalizada para las capturas de excepciones, parecido a algo como esto (Lo puedes personalizar a tu gusto):





Paso 1

Vamos a crear un formulario que será la ventana de aviso como las imágenes anteriores, éste es el código de dicho formulario:

Nombre de la unidad (Unit): Aviso.
Nombre del Formulario (Form): FAviso.
Código: [Seleccionar]
unit Aviso;
 
interface
 
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, pngimage, ExtCtrls;
 
type
 TFAviso = class(TForm)
   Label1: TLabel;
   Image1: TImage;
   btDetalle: TButton;
   btCerrar: TButton;
   mError: TMemo;
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
   procedure btCerrarClick(Sender: TObject);
   procedure btDetalleClick(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;
 
var
 FAviso: TFAviso;
 
implementation
 
{$R *.dfm}
 
procedure TFAviso.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
 
procedure TFAviso.btCerrarClick(Sender: TObject);
begin
Close;
end;
 
procedure TFAviso.btDetalleClick(Sender: TObject);
begin
if btDetalle.Caption = 'Detalles >>' then
 begin
   FAviso.Height := 243;
   btCerrar.Top := 176;
   btDetalle.Top := 176;
   mError.Visible := True;
   btDetalle.Caption := '<< Detalles';
 end else begin
   FAviso.Height := 152;
   btCerrar.Top := 88;
   btDetalle.Top := 88;
   mError.Visible := False;
   btDetalle.Caption := 'Detalles >>';
 end;
end;
 
end.

Paso 2

En este paso vamos a crear un procedimiento en el Form principal de tu aplicativo, lo llamaremos Mostrar:

Código: [Seleccionar]
procedure Mostrar(cMensaje,cError: string);
begin
  FAviso := TFAviso.Create(Application);
  FAviso.Label1.Caption := cMensaje; {Label}
  FAviso.mError.Text := cError; {Memo}
  FAviso.ShowModal;
  Freeandnil(FAviso);
end;

cMensaje: Es el mensaje General del formulario asignado por ti.
cError: es el mensaje de error por defecto de la excepción.

Método de uso.

Ahora veremos cómo usar el procedimiento y el llamado de la ventana, para su perfecto funcionamiento debemos agregar en el uses de tu form principal la unidad Aviso que creamos anteriormente, colocaremos el siguiente código en un botón en el form principal:

Código: [Seleccionar]
procedure TForm1.Button1Click(Sender: TObject);
begin
//algo de código
try
  //código
except
  on E: Exception do
    if E.ClassNameIs('EDatabaseError') then
     begin
      Mostrar('Se produjo un error al intentar conectarse a la base de datos.', E.Message);
     Abort;
    end;
  end;
end;

Esa es una de las tantas formas de capturar una excepción, debe estar encerrado en un Try...Except para capturar esos errores, aquí una lista de excepciones genéricos de Delphi (también puedes capturar excepciones de componentes):

EAbort: Finaliza la secuencia de eventos sin mostrar el mensaje de error.

EAccessViolation: Comprueba errores de acceso a memoria inválidos.

EBitsError: Previene intentos para acceder a arrays de elementos booleanos.

EComponentError: Nos informa de un intento inválido de registar o renombar un componente.

EConvertError: Muestra un error al convertir objetos o cadenas de texto string.

EDatabaseError: Especifica un error de acceso a bases de datos.

EDBEditError: Error al introducir datos incompatibles con una máscara de texto.

EDivByZero: Errores de división por cero.

EExternalException: Significa que no reconoce el tipo de excepción (viene de fuera).

EIntOutError: Representa un error de entrada/salida a archivos.

EIntOverflow: Especifica que se ha provocado un desbordamiento de un tipo de dato.

EInvalidCast: Comprueba un error de conversión de tipos.

EInvalidGraphic: Indica un intento de trabajar con gráficos que tienen un formato desconocido.

EInvalidOperation: Ocurre cuando se ha intentado realizar una operación inválida sobre un componente.

EInvalidPointer: Se produce en operaciones con punteros inválidos.

EMenuError: Controla todos los errores relacionados con componentes de menú.

EOleCtrlError: Detecta problemas con controles ActiveX.

EOleError: Especifica errores de automatización de objetos OLE.

EPrinterError: Errores al imprimir.

EPropertyError: Ocurre cuando se intenta asignar un valor erroneo a una propiedad del componente.

ERangeError: Indica si se intenta asignar un número entero demasiado grande a una propiedad.

ERegistryExcepcion: Controla los errores en el resigtro.

EZeroDivide: Controla los errores de división para valores reales.


Espero lo disfruten ;)

Saludos.




« última modificación: 19 de Septiembre de 2009, 08:20:55 por enecumene »

Normas del Foro | Blog | DA Móbil
Uso de las etiquetas del foro
¡No doy soporte vía PM, para eso está el foro!
¡Nunca está de más agradecer! :)

«Responder #1 en: 05 de Diciembre de 2008, 06:54:06 »
En línea

Caral

  • Administrador
  • *****
  • Calificaciones: +40/-4
  • Desconectado Desconectado
  • Sexo: Masculino
  • Mensajes: 1,452

  • Actividad
    12.4%
  • Gracias
  • -Dados: 15
  • -Recibidos: 23
Re: Método para crear ventanas de Excepciones personalizadas
« Respuesta #1 en: 05 de Diciembre de 2008, 06:54:06 »
Hola
Muy bueno amigo, ademas muy util, como todos los tutoriales que haces.
Gracias por el aporte.
Saludos

«Responder #2 en: 05 de Diciembre de 2008, 07:01:53 »
En línea

felipe

  • Administrador Adjunto
  • *****
  • Calificaciones: +21/-0
  • Desconectado Desconectado
  • Sexo: Masculino
  • Mensajes: 1,385

  • Actividad
    3.4%
  • Gracias
  • -Dados: 5
  • -Recibidos: 12
  • 100% producto colombiano
    • WWW
Re: Método para crear ventanas de Excepciones personalizadas
« Respuesta #2 en: 05 de Diciembre de 2008, 07:01:53 »
Muy bueno el tema Fernando, muchas gracias...
Que Dios te tenga en su gloria amigo lKinGl...

Web - Flickr

«Responder #3 en: 06 de Diciembre de 2008, 12:23:34 »
En línea

Delphius

  • Administrador Adjunto
  • *****
  • Calificaciones: +28/-0
  • Desconectado Desconectado
  • Sexo: Masculino
  • Mensajes: 1,106

  • Actividad
    10.6%
  • Gracias
  • -Dados: 22
  • -Recibidos: 13
Re: Método para crear ventanas de Excepciones personalizadas
« Respuesta #3 en: 06 de Diciembre de 2008, 12:23:34 »
Hola Fernando,
Me gusta mucho la idea del tema del mostrar/ocultar detalle.
Se puede ampliar incluso para que se pueda elegir la imagen, o incluso hasta elegir que botones deseamos que aparezca. Tampoco es para complicarlo demasiado, pero de poder se puede.

Lo que si considero conveniente es que en vez de establecer los textos de forma directa, sería mejor emplear propiedades. Algo así:

Código: [Seleccionar]
property Message: string read FMessage write SetMessage;
property Detail: string read FDetail write SetDetail;

También se podría, incluso, ver hasta que punto sería factible y bueno hacer que el memo se adapte al tamaño del texto. Yo no más digo...

Como cuadro de díalogo es muy bueno. Le veo muy buena utilidad. Ahora, hay casos en donde es poco viable este enfoque.
En ciertas ocasiones, se tiene un Log de Excepción singleton que captura todos los eventos, y por tanto no llega a capturarse la excepción en donde se desea darle control. ¿Porqué sucede esto? Porque el manejo de las excepciones va desde lo general hacia lo particular. El primero en enterarse de las excepciones, es TAplication, de allí se empieza a subir hasta llegar al método, y al objeto que pueda ser capaz de capturar la excepción.

Si centralizamos las excepciones, siguiendo el uso del "patrón" RCE (Registro Centralizado de los Errores), y deseamos usar el cuadro de díalogo, lo mejor es diseñar las clases de forma que se capturen las excepciones y se las propaguen hacia el objeto dependiente, añadiendo más detalles: en pocas ir convirtiendo las excepciones de modo que cada clase sea capaz de capturar las excepciones que pueda manejar a un nivel más comprensible. Esto último es lo que se conoce como "patrón" CE (Convertir Excepciones).

¿Porqué menciono esto?
Porque en definitiva, esos cripticos mensajes en inglés poco le dicen al usuario final. Si en vez de mostrarle esos mensajes raros, le podemos decir que se ha producido una excepción EAccesoDenegado con un Mensaje como "El usuario no tiene los permisos necesarios" es más entendible y útil.
En resumen:
Centralizar las excepciones, con el fin de llegar un log. En caso de no saber como interpretarlas o manejarlas, o en su defecto, se necesita propagarla hacia el objeto interezado, convertir la excepción a otra que sea entendible para el objeto interesado.

Espero no haber aburrido el tema.
Disculpen si fui demasiado técnico.

Saludos,
« última modificación: 06 de Diciembre de 2008, 12:45:57 por Delphius »
Siempre te recordaremos lKinGl

«Responder #4 en: 06 de Diciembre de 2008, 12:39:05 »
En línea

enecumene

  • Administrador
  • *****
  • Calificaciones: +81/-1
  • Desconectado Desconectado
  • Sexo: Masculino
  • Mensajes: 2,977

  • Actividad
    39.4%
  • Gracias
  • -Dados: 61
  • -Recibidos: 40
  • DA Webmaster
Re: Método para crear ventanas de Excepciones personalizadas
« Respuesta #4 en: 06 de Diciembre de 2008, 12:39:05 »
Gracias Delphius, nunca está más aportar ideas nuevas y consejos, siempre será bienvenido por estos lares ;).

Saludos.

Normas del Foro | Blog | DA Móbil
Uso de las etiquetas del foro
¡No doy soporte vía PM, para eso está el foro!
¡Nunca está de más agradecer! :)

«Responder #5 en: 19 de Septiembre de 2009, 03:48:05 »
En línea

Desart

  • Miembro Platino
  • *****
  • Calificaciones: +2/-0
  • Desconectado Desconectado
  • Sexo: Masculino
  • Mensajes: 47

  • Actividad
    2.6%
  • Gracias
  • -Dados: 0
  • -Recibidos: 0
Re:Método para crear ventanas de Excepciones personalizadas
« Respuesta #5 en: 19 de Septiembre de 2009, 03:48:05 »
ENECUME no te has planteado crear un componente con este procedimiento, seria de mucha utilidad.

«Responder #6 en: 19 de Septiembre de 2009, 08:22:25 »
En línea

enecumene

  • Administrador
  • *****
  • Calificaciones: +81/-1
  • Desconectado Desconectado
  • Sexo: Masculino
  • Mensajes: 2,977

  • Actividad
    39.4%
  • Gracias
  • -Dados: 61
  • -Recibidos: 40
  • DA Webmaster
Re: Re:Método para crear ventanas de Excepciones personalizadas
« Respuesta #6 en: 19 de Septiembre de 2009, 08:22:25 »
ENECUME no te has planteado crear un componente con este procedimiento, seria de mucha utilidad.

mmm, no lo había pensado de esa manera, tal vez lo haga :D, gracias desart (y).

Saludos.

Normas del Foro | Blog | DA Móbil
Uso de las etiquetas del foro
¡No doy soporte vía PM, para eso está el foro!
¡Nunca está de más agradecer! :)


 


Página generada en 0.46 segundos con 34 consultas.