Przypisanie obrazów do ListView działa tylko w "Desing Time"

0

Witam

Kiedy ładuję obrazy z dysku poprzez edytor w trybie Desing Time i przypisuję do (przykładowo) VirtualTreeView.Images - wszystko jest w porządku, obrazy są wyświetlane.

user image

Natomiast, gdy ładuję obrazy do TPngImageList (dotyczy także TImageList) w trybie Run Time:

resourcestring
  img_abc = 'img_abc.png';
  img_fgh = 'img_fgh.png';
  img_xyz = 'img_xyz.png';
const
 ImgType: array[0..2] of string = (img_abc, img_fgh, img_xyz);
var
 i: Byte;
 Png: TPngObject;
 Lokalizacja: string;
begin
 Lokalizacja := ExtractFilePath(Application.ExeName) + 'Images\';

 PngImageList.Clear;
 Png := TPngObject.Create;
 for i := Low(ImgType) to High(ImgType) do
   if FileExists(Lokalizacja + ImgType[i]) then
     begin
      Png.LoadFromFile(Lokalizacja + ImgType[i]);
      PngImageList.InsertPng(i, Png, clNone);
     end;
 Png.Free;
end;

A następnie przypisaniu:

VirtualTreeView.Images := PngImageList;

obrazy nie wyświetlają się. Sprawdziłem, obrazy fizycznie są załadowane do TPngImageList.
Problemem jest tutaj wczytanie tej listy obrazów do takich komponentów jak TListView, TVirtualTreeView.

Identyczny problem ktoś zgłosił 5 lat temu:
http://www.delphigroups.info/2/9/261476.html

Co można z tym zrobić ?

0

Jeśli ładuję przez TBitmap obrazy do TImageList, to przykładowo w TImage jeden z obrazów z TImageList jest wyświetlany poprawnie z transparentem.

resourcestring
 img_abc = 'check.bmp';
 img_fgh = 'check.bmp';
 img_xyz = 'check.bmp';
const
 ImgType: array[0..2] of string = (img_abc, img_fgh, img_xyz);
var
 i: Byte;
 Bmp: TBitmap;
 Lokalizacja: string;
begin
 Lokalizacja := ExtractFilePath(Application.ExeName) + 'Images\';
 
 ImageList.Clear;
 Bmp := TBitmap.Create;
 for i := Low(ImgType) to High(ImgType) do
   if FileExists(Lokalizacja + ImgType[i]) then
     begin
      Bmp.LoadFromFile(Lokalizacja + ImgType[i]);
      ImageList.AddMasked(Bmp, clBlack);
     end;
 Bmp.Free;

 //Przykładowe pobranie
 ImageList.GetBitmap(0, Image.Picture.Bitmap);
end; 

Natomiast przy ładowaniu do TPngImageList i przykładowym załadowaniu do TImage, obraz także jest wyświetlany ale ma czarną obwódkę (utrata transparentu)

resourcestring
  img_abc = 'check.png';
  img_fgh = 'check.png';
  img_xyz = 'check.png';
const
 ImgType: array[0..2] of string = (img_abc, img_fgh, img_xyz);
var
 i: Byte;
 Png: TPngObject;
 Lokalizacja: string;
begin
 Lokalizacja := ExtractFilePath(Application.ExeName) + 'Images\';
 
 PngImageList.Clear;
 Png := TPngObject.Create;
 for i := Low(ImgType) to High(ImgType) do
   if FileExists(Lokalizacja + ImgType[i]) then
     begin
      Png.LoadFromFile(Lokalizacja + ImgType[i]);
      PngImageList.InsertPng(i, Png, clNone); //próbowałem też clBlack, clWindow
     end;
 Png.Free;

 //Przykładowe pobranie
 PngImageList.GetIcon(0, Image.Picture.Icon, dsTransparent, itImage); //próbowałem też itMask
 //lub
 //Image.Picture.Assign(PngImageList.PngImages.Items[0]);  //------------ w ten sposób nie pobiera wcale obrazu
end;

Ten sposób z konwersją niby działa, ale obraz jest zniekształcany przy konwersji (miejsca transparentne są uszkadzane)

resourcestring
  img_abc = 'check.png';
  img_fgh = 'check.png';
  img_xyz = 'check.png';
const
 ImgType: array[0..2] of string = (img_abc, img_fgh, img_xyz);
var
 i: Byte;
 Png: TPngObject;
 Bmp: TBitmap;
 Lokalizacja: string;
begin
 Lokalizacja := ExtractFilePath(Application.ExeName) + 'Images\';

 PngImageList.Clear;
 Png := TPngObject.Create;
 Bmp := TBitmap.Create;
 for i := Low(ImgType) to High(ImgType) do
   if FileExists(Lokalizacja + ImgType[i]) then
     begin
      Png.LoadFromFile(Lokalizacja + ImgType[i]);
      Bmp.Assign(Png);
      PngImageList.InsertMasked(i, Bmp, clBlack);
      //PngImageList.AddMasked(Bmp, clBlack);  // takie samo działanie
     end;
 Png.Free;
 Bmp.Free;

 //Przykładowe pobranie
 PngImageList.GetBitmap(0, Image.Picture.Bitmap);
end;

Wygląda więc na to, że coś jest nie tak z samym TPngImageList ?

0

Niestety metoda Draw także nie rysuje poprawnie. Obraz traci swój wygląd:

PngImageList.Draw(Image.Canvas, 0, 0, 0);//, dsTransparent, itImage);

user image

  1. Załadowanie obrazu PNG, konwersja do BMP i wczytanie: PngImageList.AddMasked(i, Bmp, clBlack);
  2. Załadowanie obrazu BMP i wczytanie: ImageList.AddMasked(Bmp, clBlack);
  3. Załadowanie obrazu PNG i wczytanie: PngImageList.InsertPng(i, Png, clNone);

//Prawdopodobne rozwiązanie (tylko Delphi XE)
http://stackoverflow.com/questions/4221597/add-a-png-image-to-a-imagelist-in-runtime-using-delphi-xe

1 użytkowników online, w tym zalogowanych: 0, gości: 1