Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Recuperar/Mostrar Imagen de ClientDataSet (https://www.clubdelphi.com/foros/showthread.php?t=78788)

Beaker_ 17-05-2012 05:04:07

Recuperar/Mostrar Imagen de ClientDataSet
 
Hola, que tal, recurro a la ayuda de ustedes de nuevo ya que me encuentro ante un nuevo problema que no he podido resolver por más que he probado.
Estoy trabajando sobre un código que alguién más comenzó a hacer, por lo cual a veces me es díficil de entender jeje, pero esta es la cuestión.
El código lee y carga una serie de imágenes, las cuales las guarda en un componente ClienDataSet, de esta forma:

Declaración de tipos:
Código:

cImagen: TClientDataSet;
cImagenIdImagen: TIntegerField;
cImagenDescImagen: TStringField;
cImagenImagen: TBlobField;

Declaración para asignar imágenes al ClientDataSet
Código:

if openImage.Execute then begin
    cImagen.Append;
    cImagenIdImagen.Value := 1;
    cImagenDescImagen.Value := openImage.FileName;
    cImagenImagen.LoadFromFile(openImage.FileName);
    cImagen.Post;
  end;

Ahora tengo que leer el ClientDataSet y recuperar la imagen para desplegarla en un TImage, sin embargo, no encuentro como. Mi idea (seguramente tonta) era hacer lo siguiente (donde imagen es un componente TImage):

Código:

imagen.Picture := cImagenImagen;
Sin embargo, evidentemente me manda error de incompatibilidad de tipos, ya que imagen.Picture es TPicture y cImagenImagen es tipo TBlobField. De qué forma puedo recuperar la imagen del ClientDataSet y asignarla a un TImage?
También, y abusando de su tiempo y atención, me podrían explicar de que forma se relaciona el ClientDataSet cImagen con las variables cImagenIdImagen, cImagenDescImagen, cImagenImagen? Es decir, cómo si les asigno valores se añaden al ClientDataSet si no son componentes directos de este? (Es decir, no se asignan de esta forma, por ejemplo, cImagen.Imagen o cImagen.cImagenImagen)
Espero haberme explicado, y realmente agradezco su ayuda

newtron 17-05-2012 09:25:13

Hola.

No sé si me he enterado bien de lo que comentas pero puedes probar con esto.

Código Delphi [-]
Imagen.picture.graphic.loadfromStream(cImagenImagen);

De la segunda parte si que no me he enterado pero básicamente la historia es que la imagen la guardas en modo stream en el campo blob y posteriormente para recuperarla y asignarla al componente image tienes que usar la instrucción que te comento anteriormente.

Saludos

Beaker_ 17-05-2012 16:41:05

Que tal newtron, muchas gracias por tu ayuda, lamentablemente me manda error ya que LoadFromStream es de tipo TStream y cImagenImagen es de tipo TBlobField

[code]

[DCC Error] imagenes.pas(87): E2010 Incompatible types: 'TStream' and 'TBlobField'

[\CODE]

Que otra cosa pudiera yo hacer?

newtron 17-05-2012 17:10:16

A ver....

prueba creando un stream a partir del campo TBlobField de esta manera:

Código Delphi [-]
Stream :=CImagen.CreateBlobStream(CImagen.FieldByName('cImagenImagen') as TBlobField, bmRead);
Imagen.picture.graphic.loadfromStream(Stream);

No estoy yo muy familiarizado con el ClientDataset por lo que igual me estoy equivocando sintácticamente, pero la idea es esa.

Recuerda declarar la variable Stream como TStream.

Saludos

ElDioni 17-05-2012 17:13:10

Hola Beaker_,
revisa este hilo por si te sirve de ayuda.
http://www.clubdelphi.com/foros/show...highlight=blob

Saludos.

ElDioni 17-05-2012 17:14:56

También he visto este

http://www.clubdelphi.com/foros/show...highlight=blob

Seguro que si buscas un poco más por los foros encontrarás más ejemplos porque estos los he encontrado en la primera página buscando blob.

Saludos.

Beaker_ 17-05-2012 18:10:58

newtron, te comento que lo que me aconsejaste ya lo había yo hecho pero de forma más directa (es decir, sin crear el TStream y ese código cargarlo directo a la imagen), sin embargo me da el siguiente error:

Cita:

Project imagenes.exe raised exception class $C0000005 with message 'access violation at 0x0092ecaf: read of address 0x00000000'.
ElDioni, gracias por el tiempo y la ayuda. Tienes razón, debí haber buscado primero pero no se me ocurrió como. El caso es que uno de los enlaces que me pasaste me sirvió, que fue la segunda respuesta tuya (no puedo poner enlaces :/)


Sin embargo, no me sirvió del todo, ya que si bien me carga bien la imagen, pero sólo si es JPG, y en mi sistema debe de cargar de distintos tipos de imagen (tif, gif, png, bmp, etc..., realmente son demasiados los tipos) y me manda error al cargar aquella que no es JPG.
Ahora sí he buscado algo, pero no he encontrado nada parecido a mi problema

ElDioni 17-05-2012 18:43:44

Has probado con un obteto TImage de la siguiente forma.
Código Delphi [-]
Image1.Picture.Graphic.LoadFromStream();
No se si así te servirá, pero de todas formas ya te adelanto que seguramente con el gif no te valdrá porque hace falta componentes que delphi no lleva por defecto y que si no recuerdo mal son de pago.

Saludos.


La franja horaria es GMT +2. Ahora son las 08:26:29.

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