Ver Mensaje Individual
  #4  
Antiguo 19-04-2009
Chandra_ Chandra_ is offline
Miembro
 
Registrado: may 2008
Posts: 50
Reputación: 17
Chandra_ Va por buen camino
Solucionado!

Al final lo he solucionado

Pego a continuación el código, por si a alguien le sirve. Hace falta un ImageList vacío y hay que asignar ese ImageList al componente(es) que queremos que tenga las imágenes. No olvidéis meter en uses CommCtrl y Consts, que si no, se quejará amargamente.

Código Delphi [-]
procedure TForm1.ConvertTo32BitImageList(ImageList: TImageList);
const
  Mask: array[Boolean] of Longint = (0, ILC_MASK);
var
  TempList: TImageList;
begin
  if Assigned(ImageList) then begin
    TempList := TImageList.Create(nil);
    try
      TempList.Assign(ImageList);
      with ImageList do begin
        Handle := ImageList_Create(Width, Height, ILC_COLOR32 or Mask[Masked],
                    0, AllocBy);
        if not HandleAllocated then
          raise EInvalidOperation.Create(SInvalidImageList);
      end;
      Imagelist.AddImages(TempList);
    finally
      FreeAndNil(TempList);
    end;
  end;
end;

...y así se usa (lo he metido en el evento OnClick de un Button, para probarlo, pero iría, por ejemplo, en el FormCreate):

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  Ico: TIcon;
begin
  Ico := TIcon.Create;
  try
     ConvertTo32BitImageList(ImageList1);
   Ico.LoadFromFile('icono.ico');
   ImageList1.AddIcon(Ico);
   Ico.LoadFromFile('otroicono.ico');
   ImageList1.AddIcon(Ico);
  finally
    Ico.Free;
  end;

Según he averiguado, es un viejo problema del ImageList y sólo se soluciona como he hecho más arriba: cargando en tiempo de ejecución las imágenes en el ImageList a trabés de un TIcon (porque los TIcon mantienen el canal alfa de las imágenes) y luego pasándoselas a nuestro ImageList, que está enlazado a los componentes.

Pues eso, que funciona perfectamente... pero hay un problemilla que estoy tratando de solucionar ahora mismo: no me funciona con imágenes mayores de 32x32, me da un error de tamaño incompatible. He trazado el programa y el error aparece cuando se trata de cargar la imagen de 48x48 en el TIcon. He tratado de cambiarle el Height y el Width tras crearlo, pero ni caso... También he estado investigando a ver si puedo especificar el tamaño del TIcon en el mismo constructor, pero no hay manera.

En fin, si alguien se anima a echarle un vistazo, se lo agradeceré

Última edición por Chandra_ fecha: 19-04-2009 a las 00:51:40.
Responder Con Cita