Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-04-2012
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.462
Poder: 21
newtron Va camino a la fama
Asignar imágenes a ImageList en tiempo de ejecución

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:

Código Delphi [-]
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
__________________
Be water my friend.
Responder Con Cita
  #2  
Antiguo 04-04-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola newtron.

Probá de este modo:
Código Delphi [-]
{ 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.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 04-04-2012
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.462
Poder: 21
newtron Va camino a la fama
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:

Código Delphi [-]
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.
__________________
Be water my friend.
Responder Con Cita
  #4  
Antiguo 04-04-2012
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.462
Poder: 21
newtron Va camino a la fama
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?.
__________________
Be water my friend.
Responder Con Cita
  #5  
Antiguo 04-04-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Código Delphi [-]
...
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.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 04-04-2012 a las 18:09:38.
Responder Con Cita
  #6  
Antiguo 04-04-2012
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.462
Poder: 21
newtron Va camino a la fama
Estupendo, como siempre gracias por tu amabilidad amigo ecfisa.

Saludos
__________________
Be water my friend.
Responder Con Cita
  #7  
Antiguo 04-04-2012
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.462
Poder: 21
newtron Va camino a la fama
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?
__________________
Be water my friend.
Responder Con Cita
  #8  
Antiguo 04-04-2012
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.462
Poder: 21
newtron Va camino a la fama
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.

Código Delphi [-]
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
__________________
Be water my friend.
Responder Con Cita
  #9  
Antiguo 04-04-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
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.

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

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 04-04-2012 a las 19:40:25.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Asignar a tbitbtn evento en tiempo de ejecucion richy08 OOP 9 09-08-2011 18:15:23
Asignar evento OnDrawColumnCell en tiempo de ejecución gluglu OOP 6 01-06-2007 13:14:58
Asignar propiedades de Ttable en tiempo de ejecución coleleon Tablas planas 3 30-11-2005 23:22:39
Asignar evento Oncalcfield en tiempo de ejecucion el_barto Conexión con bases de datos 5 06-09-2005 00:08:46
Asignar la ruta de tablas en tiempo de ejecucion tortelini Varios 2 19-03-2005 12:13:53


La franja horaria es GMT +2. Ahora son las 02:39:17.


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
Copyright 1996-2007 Club Delphi