PDA

Ver la Versión Completa : Recuperar/Mostrar Imagen de ClientDataSet


Beaker_
17-05-2012, 05:04:07
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:

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


Declaración para asignar imágenes al ClientDataSet

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):


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.


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:


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/showthread.php?t=77447&highlight=blob

Saludos.

ElDioni
17-05-2012, 17:14:56
También he visto este

http://www.clubdelphi.com/foros/showthread.php?t=78032&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:

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.

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.