Гость
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Иконка компонента в 11 - розовый / серый прямоугольник / 10 сообщений из 10, страница 1 из 1
05.02.2022, 18:58
    #40131922
bzums
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иконка компонента в 11 - розовый / серый прямоугольник
Есть очень старая (но тем не менее палезная библиотека).
С исходниками.
Проект умер.

В 11 версии иконки не отображаются совсем (иногда розовый прямоугольник).
Решил подправить.
Не получается.
Дошел до того, что скопировал с библиотеки родной (FireDac) иконку. Один хер.

Русырсы bpl даже напрямую правил - тоже ноль эффекта.

Чего оНа хочет эта 11?
...
Рейтинг: 0 / 0
05.02.2022, 19:21
    #40131925
bzums
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иконка компонента в 11 - розовый / серый прямоугольник
иконка в формате res
забыл уточнить
...
Рейтинг: 0 / 0
05.02.2022, 19:39
    #40131929
GunSmoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иконка компонента в 11 - розовый / серый прямоугольник
...
Рейтинг: 0 / 0
05.02.2022, 19:41
    #40131930
GunSmoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иконка компонента в 11 - розовый / серый прямоугольник
P.S. Если иконки нет совсем - библиотека манипулирует ImageList вручную (ImageList.Add) вместо вызова API (.AddMasked / .AddActionMenu).
...
Рейтинг: 0 / 0
05.02.2022, 20:07
    #40131935
bzums
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иконка компонента в 11 - розовый / серый прямоугольник
О чем говорится по ссылке?

А у меня же есть иконка, как вроде.
...
Рейтинг: 0 / 0
06.02.2022, 14:52
    #40132035
bzums
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иконка компонента в 11 - розовый / серый прямоугольник
теперь у меня ситуация немного иная - иконка нормальная.
но показывается она пустышкой, пока я на нее не нажму.
при добавлении на фому отрисовывается.
после перезапуска среды - тоже самое.

спасибо.
...
Рейтинг: 0 / 0
06.02.2022, 16:08
    #40132062
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иконка компонента в 11 - розовый / серый прямоугольник
bzums
теперь у меня ситуация немного иная - иконка нормальная.
но показывается она пустышкой, пока я на нее не нажму.

Ошибка в 17 строке
...
Рейтинг: 0 / 0
06.02.2022, 18:48
    #40132085
bzums
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иконка компонента в 11 - розовый / серый прямоугольник
Если кому еще интересно, проблема наблюдается только на Windows 11 IoT
...
Рейтинг: 0 / 0
06.02.2022, 19:37
    #40132089
GunSmoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иконка компонента в 11 - розовый / серый прямоугольник
bzums
О чем говорится по ссылке?


RSP-36484 Regression INTAServices.AddMasked is bugged

You can quickly test this by installing JCL (JEDI code library). GetIt version should work too.

Alternatively, you can call INTAServices.AddMasked to add masked bitmap to a list. Create IDE's menu item with returned index. The effect is the same for the INTAServices.AddActionMenu.

The INTAServices.AddMasked method no longer works.

Previous Delphi versions use TImageList as INTAServices.ImageList. Those versions do not have any issues, the icons are drawn correctly: the transparent/mask color is respected.

However, 11 Alexandria replaces INTAServices.ImageList with TVirtualImageList. Old code will no longer work correctly: the transparent/mask color is ignored; or it is not ignored, but the list itself draws incorrectly.

See attached screenshots.

A possible workaround is to add a (wrong) item first, and then manipulate the underlying TVirtualImageList directly to replace (wrong) image with a correct one:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
var
  Services: INTAServices;
  ItemBmp: TBitmap;
  BkColor: TColor;
  ID: String;
  
  ItemIndex: Integer;
  Item: TImageCollectionItem;
  Source: TImageCollectionSourceItem;
  Icon: TIcon;
  Stream: TMemoryStream;
 
// ...
 
MenuItem.ImageIndex := Services.AddMasked(ItemBmp, BkColor, ID);
 
if (MenuItem.ImageIndex >= 0) and
   (Services.ImageList is TVirtualImageList) and
   (TVirtualImageList(Services.ImageList).ImageCollection is TImageCollection) then
begin
  ItemIndex := TVirtualImageList(Services.ImageList).Images[MenuItem.ImageIndex].CollectionIndex;
  Item := TImageCollection(TVirtualImageList(Services.ImageList).ImageCollection).Images[ItemIndex];
 
  if Item.SourceImages.Count = 1 then
    Source := Item.SourceImages[0]
  else
  begin
    Item.SourceImages.Clear;
    Source := Item.SourceImages.Add;
  end;
 
  Icon := ConvertBitmapToIcon(ItemBmp, BkColor);
  try
    Stream := TMemoryStream.Create;
    try
      Icon.SaveToStream(Stream);
      Stream.Position := 0;
      Source.Image.LoadFromStream(Stream);
    finally
      FreeAndNil(Stream);
    end;
  finally
    FreeAndNil(Icon);
  end;
 
  TVirtualImageList(Services.ImageList).UpdateImageList;
end;



The ConvertBitmapToIcon function is (it could be better!):
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
function ConvertBitmapToIcon(const ABitmap: TBitmap; const ATransparentColor: TColor): TIcon;
var
  II: TIconInfo;
  Mask: TBitmap;
  X, Y: Integer;
begin
  Result := TIcon.Create;
  try
    Mask := TBitmap.Create(ABitmap.Width, ABitmap.Height);
    try
      Mask.Canvas.Brush.Color := clBlack;
      Mask.Canvas.FillRect(Rect(0, 0, Mask.Width, Mask.Height));
      for Y := 0 to Mask.Height - 1 do
        for X := 0 to Mask.Width - 1 do
          if ABitmap.Canvas.Pixels[X, Y] = ATransparentColor then
            Mask.Canvas.Pixels[X, Y] := clWhite;
 
      FillChar(II, SizeOf(II), 0);
      II.fIcon := True;
      II.hbmMask := Mask.Handle;
      II.hbmColor := ABitmap.Handle;
      Result.Handle := CreateIconIndirect(II);
    finally
      FreeAndNil(Mask);
    end;
  except
    FreeAndNil(Result);
    raise;
  end;
end;
...
Рейтинг: 0 / 0
06.02.2022, 19:39
    #40132090
GunSmoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иконка компонента в 11 - розовый / серый прямоугольник
Розовые прямоугольники получаются, если код манирулирует ImageList напрямую.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Иконка компонента в 11 - розовый / серый прямоугольник / 10 сообщений из 10, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]