PDA

Ver la Versión Completa : Asignar imágenes a ImageList en tiempo de ejecución


newtron
04-04-2012, 12:26:30
Hola a tod@s.

Estoy intentando rellenar un ListView con iconos de imágenes que vienen de un campo de una tabla.

Voy recorriendo la tabla e insertando en un ImageList las imágenes para posteriormente crear el icono en el ListView y asignarle esa imagen creada. Tengo 2 problemas con la asignación de las imágenes en el ImageList, el primero es que asigno la imagen pero no aparece en el icono del ListView y segundo que cuando la imagen proviene de un JPG en vez de un BMP me da error.

Este es el código que estoy usando:


procedure TNTFormInmuebles.InsertaDatos(Tipo: String);
var
N: SmallInt;
Stream: TStream;
ImagenBMP: TBitmap;
ImagenJPG: TjpegImage;
begin
DataModule1.EDBQuery1.SQL.Clear;
DataModule1.edbquery1.SQL.Add('SELECT * FROM DOCUMENTOS WHERE FINCA='+QuotedStr(NtEditCodigo.Damevalor)+' AND TIPO='+QuotedStr(Tipo));
DataModule1.EDBQuery1.ExecSQL;
DataModule1.EDBQuery1.First;
ListView1.Clear;
ImageList1.Clear;
N:=0;
while not DataModule1.EDBQuery1.Eof do begin
Stream := DataModule1.EDBQuery1.CreateBlobStream(DataModule1.EDBQuery1.FieldByName('IMAGEN') as TBlobField, bmRead);
ImagenBMP:= Tbitmap.create;
if DataModule1.EDBQuery1.FieldByName('TIPOI').AsString='B' then begin
ImagenBMP.LoadFromStream(Stream);
end else begin
ImagenJPG:=TjpegImage.create;
ImagenJPG.LoadFromStream(Stream);
ImagenBMP.Assign(ImagenJPG);
ImagenJPG.Free;
end;
if ImageList1.Add(imagenBMP,nil)<>0 then
showmessage('error');
ListView1.Items.Add;
ListView1.Items[ListView1.Items.Count-1].Caption := 'Imagen';
ListView1.Items[ListView1.Items.Count-1].ImageIndex := N;
ImagenBMP.Free;
DataModule1.EDBQuery1.Next;
Inc(N);
end;
end;


Como siempre agradecería un poquito de ayuda.

Gracias y un saludo

ecfisa
04-04-2012, 13:31:32
Hola newtron.

Probá de este modo:

{ Suponiendo que:
ListView1.SmallImages:= ImageList1;
ListView1.ViewStyle:= vsSmallIcon;
}
...
var
JPEGImage: TJPEGImage;
Bitmap: TBitmap;
begin
...
JPEGImage:= TJPEGImage.Create;
Bitmap:= TBitmap.Create;
try
JPEGImage.LoadFromStream(stream);
Bitmap.Height:= JPEGImage.Height;
Bitmap.Width:= JPEGImage.Width;
Bitmap.Assign(JPEGImage);
ImageList1.Add(Bitmap,nil);
ListView1.Items.Add;
ListView1.Items[ListView1.Items.Count-1].Caption := 'Imagen';
ListView1.Items[ListView1.Items.Count-1].ImageIndex := 0;
finally
Bitmap.Free;
JPEGImage.Free;
end;
...


Saludos. :)

newtron
04-04-2012, 17:25:29
Bueno, algo se va viendo ya. He modificado el código porque puedo tener almacenadas imágenes .BMP y .JPG y se ha quedado de la siguiente forma:


procedure TNTFormInmuebles.InsertaDatos(Tipo: String);
var
N: SmallInt;
Stream: TStream;
ImagenBMP: TBitmap;
ImagenJPG: TjpegImage;
begin
DataModule1.EDBQuery1.SQL.Clear;
DataModule1.edbquery1.SQL.Add('SELECT * FROM DOCUMENTOS WHERE FINCA='+QuotedStr(NtEditCodigo.Damevalor)+' AND TIPO='+QuotedStr(Tipo));
DataModule1.EDBQuery1.ExecSQL;
DataModule1.EDBQuery1.First;
ListView1.Clear;
ImageList1.Clear;
N:=0;
while not DataModule1.EDBQuery1.Eof do begin
ImagenBMP:= Tbitmap.create;
ImagenJPG:= TjpegImage.create;
if DataModule1.EDBQuery1.FieldByName('TIPOI').AsString='J' then begin
Stream := DataModule1.EDBQuery1.CreateBlobStream(DataModule1.EDBQuery1.FieldByName('IMAGEN') as TBlobField, bmRead);
ImagenJPG.LoadFromStream(stream);
ImagenBMP.Height:= ImagenJPG.Height;
ImagenBMP.Width:= ImagenJPG.Width;
ImagenBMP.Assign(ImagenJPG);
end;
if DataModule1.EDBQuery1.FieldByName('TIPOI').AsString='B' then begin
Stream := DataModule1.EDBQuery1.CreateBlobStream(DataModule1.EDBQuery1.FieldByName('IMAGEN') as TBlobField, bmRead);
ImagenBMP.LoadFromStream(stream);
end;
ImageList1.Add(ImagenBMP,nil);
ListView1.Items.Add;
ListView1.Items[ListView1.Items.Count-1].Caption := 'Imagen';
ListView1.Items[ListView1.Items.Count-1].ImageIndex := N;
ImagenBMP.Free;
ImagenJPG.Free;
DataModule1.EDBQuery1.Next;
Inc(N);
end;


El problema es que hay dos registros, uno con un .JPG y otro con un .BMP y en los dos iconos se ve una parte distinta del .BMP, del .JPG ni rastro.

newtron
04-04-2012, 17:32:45
Nada!! no he dicho nada!!, se ve que haciendo las pruebas se me han bailado las imágenes en la tabla y pensaba que no estaban bien. Ahora tengo el problema de que solo se ve una parte de la imagen. ¿Sabrías cómo se pone el strech de las imágenes a true?.

ecfisa
04-04-2012, 18:05:32
Hola.


...
var
....
R: TRect;
begin
....
ImagenJPG.LoadFromStream(stream);
ImagenBMP.Height:= ImagenJPG.Height;
ImagenBMP.Width:= ImagenJPG.Width;
ImagenBMP.Assign(ImagenJPG);
R.Left:= 0;
R.Top:= 0;
R.Right:= ImageList1.Width;
R.Bottom:= ImageList1.Height;
ImagenBMP.Canvas.StretchDraw(R, ImagenBMP);
....


Saludos. :)

newtron
04-04-2012, 18:36:21
Estupendo, como siempre gracias por tu amabilidad amigo ecfisa. :)

Saludos

newtron
04-04-2012, 18:50:21
Mi gozo en un pozo.

Estoy haciendo pruebas con distintas imágenes y muchas no me las saca bien. ¿Sabes si tienen que tener algún formato/tamaño/capacidad.. etc especial?

newtron
04-04-2012, 19:10:19
Ok, creo que ya lo tengo.

He hecho algunas modificaciones a tu código en función a un ejemplo que he pillado por internet y esto parece que funciona como quiero.


procedure TNTFormInmuebles.InsertaDatos(Tipo: String);
var
N: SmallInt;
Stream: TStream;
ImagenBMP: TBitmap;
ImagenJPG: TjpegImage;
StretchedBMP: TBitmap;
begin
DataModule1.EDBQuery1.SQL.Clear;
DataModule1.edbquery1.SQL.Add('SELECT * FROM DOCUMENTOS WHERE FINCA='+QuotedStr(NtEditCodigo.Damevalor)+' AND TIPO='+QuotedStr(Tipo));
DataModule1.EDBQuery1.ExecSQL;
DataModule1.EDBQuery1.First;
ListView1.Clear;
ImageList1.Clear;
N:=0;
while not DataModule1.EDBQuery1.Eof do begin
ImagenBMP:= Tbitmap.create;
ImagenJPG:= TjpegImage.create;
StretchedBMP := TBitmap.Create;
StretchedBMP.Width := ImageList1.Width;
StretchedBMP.Height := ImageList1.Height;
if DataModule1.EDBQuery1.FieldByName('TIPOI').AsString='J' then begin
Stream := DataModule1.EDBQuery1.CreateBlobStream(DataModule1.EDBQuery1.FieldByName('IMAGEN') as TBlobField, bmRead);
ImagenJPG.LoadFromStream(stream);
ImagenBMP.Height:= ImagenJPG.Height;
ImagenBMP.Width:= ImagenJPG.Width;
ImagenBMP.Assign(ImagenJPG);
end;
if DataModule1.EDBQuery1.FieldByName('TIPOI').AsString='B' then begin
Stream := DataModule1.EDBQuery1.CreateBlobStream(DataModule1.EDBQuery1.FieldByName('IMAGEN') as TBlobField, bmRead);
ImagenBMP.LoadFromStream(stream);
end;
StretchedBMP.Canvas.StretchDraw(Rect(0, 0, StretchedBMP.Width-1, StretchedBMP.Height-1), ImagenBMP);
ImageList1.Add(StretchedBMP,nil);
ListView1.Items.Add;
ListView1.Items[ListView1.Items.Count-1].Caption := 'Imagen';
ListView1.Items[ListView1.Items.Count-1].ImageIndex := N;
ImagenBMP.Free;
ImagenJPG.Free;
DataModule1.EDBQuery1.Next;
Inc(N);
end;


end;


Gracias de nuevo y un saludo

ecfisa
04-04-2012, 19:16:37
Estoy haciendo pruebas con distintas imágenes y muchas no me las saca bien

No me quiso mostrar una foto, pero como era de mi señora y siendo Delphi tán lógico y considerado.... no le dí mayor importancia. :D:D:D

Hablando en serio, si me pasó con una imágen, pero realmente no sé a que se debe. Seguramente sea por el formato :confused:
(Como dato adicional la muestra en un TImage, pero no funciona StretchDraw.)

Saludos. :)