Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Problemas de Exception Class (https://www.clubdelphi.com/foros/showthread.php?t=86691)

edwin.simon 17-09-2014 16:30:49

Problemas de Exception Class
 
Buen día, como están?

Estoy trabajando en un proyecto para carnet-izar a una cantidad N de personas, no estoy guardando la foto en la base de datos solo guardo la ruda de dicha foto, problema esta cuando consulto o trato de imprimir un registro que no tiene foto, presenta la siguiente Exception.
project pry_sistemacarnet.exe raised exception class einvalidGraphic with Unknown picture file extension (.) process stopped use step o run to continuer


Código:

//Buscar Registro
procedure TFrm_ImprimirCarnet.BuscarRegistroClick(Sender: TObject);
begin
      if Tbl_Carnet.Locate('Codigo_carnet',Edit1.Text,[])then
        Image1.Picture.LoadFromFile(Tbl_Carnet.FieldByName('Foto').AsString);
end;


Código:

// Mostrar foto en un Reporte
procedure TFrm_ImprimirCarnet.ppImage1Print(Sender: TObject);
begin
      ppImage1.Picture.LoadFromFile(Tbl_Carnet.FieldByName('Foto').AsString);
end;


radenf 17-09-2014 17:06:35

Hola edwin.simon

Prueba con este código que evalúa si el campo Foto está vacío o no.

Código Delphi [-]
if Tbl_Carnet.Locate('Codigo_carnet',Edit1.Text,[])then
if Tbl_Carnet.FieldByName('Foto').IsNull then
Dialogs.MessageDlg('¡ No existe foto de esta persona !', mtWarning, [mbOk], 0);
else
Image1.Picture.LoadFromFile(Tbl_Carnet.FieldByName('Foto').AsString);

Es más preciso utilizar un Query que un Locate.

Código Delphi [-]
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Text:= 'Select Codigo_carnet, Foto from Tbl_Carnet where Codigo_carnet like '+QuotedStr(Edit1.Text+'%') ;
Query1.Open;
if Query1.RecordCount >0 then
Image1.Picture.LoadFromFile(Query1.FieldByName('Foto').AsString)
else
Dialogs.MessageDlg('¡ No existe foto de esta persona !', mtWarning, [mbOk], 0);
end;

Lo hice de memoria, pero la idea va por ahí.
Saludos

roman 17-09-2014 17:18:32

Por el mensaje de error que recibes da la impresión de que la ruta que guardas en la base de datos no contiene la extensión. ¿Ya verificste eso?

// Saludos

edwin.simon 17-09-2014 18:05:16

Gracias radenf y roman, con la primera rutina por lo meno elimino al Exception ya que me muestra un mensaje si tiene o no tiene foto y con la segunda tengo que especificar todos los campos de tabla, de igual puedo usarla.

roman ese es el problema que tengo cuando el registro no tiene foto lo que quiero es poder imprimirlo tengo o no foto.

roman 17-09-2014 18:28:02

Cita:

Empezado por edwin.simon (Mensaje 481655)
roman ese es el problema que tengo cuando el registro no tiene foto lo que quiero es poder imprimirlo tengo o no foto.

Cierto, no había leído correctamente la pregunta.

En casos similares yo he optado por usar una imagen por defecto para quienes no tienene foto, por ejempo, una silueta. Cuando se guarda un registro sin foto, en el campo pongo la ruta de esa imagen. De esta manera evito comprobar en cada caso si hay o no foto.

// Saludos

edwin.simon 17-09-2014 19:18:56

el problema es que tengo mas de 4000 registro porque estoy haciendo un cambio ya que cuando guardo la foto en la base de datos esta se torna super lenta.

mil gracias seguiré investigando roman.

radenf 17-09-2014 19:27:15

Me alegra que te funcionara.
Lo que señala roman también es una buena alternativa.
Puedes cambiar Dialogs.MessageDlg('¡ No existe foto de esta persona !', mtWarning, [mbOk], 0); por Exit y no mostrará el mensaje.

Salu2

edwin.simon 17-09-2014 19:39:56

Disculpa radenf no comprendo la parte de cambiar, ........!
Cita:

Puedes cambiar Dialogs.MessageDlg('¡ No existe foto de esta persona !', mtWarning, [mbOk], 0); por Exit y no mostrará el mensaje.

radenf 17-09-2014 21:24:11

Si sustituyes la frase:

Código Delphi [-]
Dialogs.MessageDlg('¡ No existe foto de esta persona !', mtWarning, [mbOk], 0);

por

Código Delphi [-]
Exit

El mensaje no aparecerá y no te dará la excepción por la que preguntaste, si es que así lo deseas.
Es sólo una opción, ya que a muchos no le gusta que aparezcan mensajes que requieren la intervención del usuario.

Saludos

roman 17-09-2014 21:55:44

Cita:

Empezado por edwin.simon (Mensaje 481662)
el problema es que tengo mas de 4000 registro porque estoy haciendo un cambio ya que cuando guardo la foto en la base de datos esta se torna super lenta.

No digo que guardes las fotos en la base. Lo que digo es que en el mismo directorio donde guardes las fotos, guardes un jpg con la imagen por defecto. Esta imagen puede llamarse, por ejemplo, "silueta.jpg".

Entonces, cuando des de alta un registro y no dispongas de foto para es registro, en el campo foto almacenes "c:\ruta\a\las\fotos\silueta.jpg".

Así, cuando leas los registros, dejas el código tal como lo tenías al principio. Si el registro no tiene foto, lo que cargará será silueta.jpg y no te marcará el error.

// Saludos

edwin.simon 19-09-2014 14:12:05

Me siento muy agradecido por toda la ayuda brindada, gracias radenf y roman, no tengo problema con el mensaje que presenta ya que me indica lo que esta pasando y con relación a colocar la imagen para los registro que no tiene foto tampoco es un problemas, el caso es que estamos hablando de mas de 4 mil registro que no tienen fotos momentaniamente.

la historia de esto es que tengo un sistema funcionando con mas de 4 mil registro y cada uno tiene su foto, el problema de esto es que la base de datos esta super lenta y tengo que usarlo en una maquina local ya que cuando lo pongo en red tarda mucho para subir y consume mucho recurso, si existiera la forma de mejor el movimiento fuera un éxito, estoy usando access 2007.

rebotea 23-09-2014 20:35:37

Tenta cambiar tu base dados mejor desempenho = SQLITE


La franja horaria es GMT +2. Ahora son las 09:09:20.

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