Sign in Join
Wiki copytemporary

TImageList/ru

English · Français · Русский · 中文(中国)

TImageList является компонентом, представляющим собой список изображений, которые могут использоваться в других компонентах, таких как TToolBar или TActionList.

Пример использования с элементом ComboBox

Для использования TImageList, разместите объект TImageList на форме. В данном примере нам необходимо шесть изображений.

Все изображения должны быть одинакового размера. Если используется два разных размера изображений, то нужно использовать и два компонента TImageList.

Установите высоту и ширину изображений в Инспекторе объектов; в нашем случае 50 пикселов в ширину и 18 пикселов высоту.

Установите свойство Style в значение csOwnerDrawFixed.

Дважды щелкните по значку элемента TImageList для того, чтобы открыть редактор TImageList. Убедитесь, что при выборе значки отображаются корректно. Если они меньше, чем требуется, проверьте их размер в Инспекторе объектов (например, с помощью быстрой клавиши <F11>). При необходимости вы можете заново загрузить изображения.

Поместите элемент ComboBox на форму и присвойте ему имя cbSymbols в свойстве Name.

В событии FormCreate введите следующее:

pascal
 cbSymbols.Items.Clear;
 for I := 0 to 5 do
   cbSymbols.Items.Add('');
 cbSymbols.ItemIndex := 0;

В результате в элемент ComboBox будет добавлено 6 пустых строк и выбрана первая из них.

В событии OnDrawItem для элемента cbSymbols поместите следующий код:

pascal
procedure TMyForm.cbSymbolsDrawItem( 
  aControl: TWinControl;
  iIndex: Integer; 
  aRect: TRect; 
  aState: TOwnerDrawState );
var
  cnv: TCanvas;
begin
  if not (aControl is TComboBox) then exit;
  cnv := TComboBox( aControl ).Canvas;
  Imagelist1.Draw( cnv, aRect.Left+2, aRect.Top+2, iIndex );
end;

При необходимости скорректируйте центрирование изображения в элементе по центру (изменяя значение +2).

Пример использования с элементом SpeedButton

Добавьте изображения в элемент ImageList1 как в предыдущем примере и используйте их с помощью следующего кода:

pascal
   ImageList1.GetBitmap(iIndex,SpeedButton1.Glyph);

Элемент TImageList с поддержкой нескольких разрешений изображения в Lazarus версии 1.9 и выше

В Lazarus версии 1.9 компонент TImageList был переписан для того, чтобы поддерживать несколько разрешений одного изображения.

Каждый элемент управления из библиотеки LCL, поддерживающий работу с элементом ImageList, теперь содержит новое свойство [Images]Width, чтобы определить какая пользовательская ширина должна использоваться для разрешения 96 PPI (100% масштаб). Примеры: TToolBar.Images/ImageWidth, TListView.LargeImages/LargeImagesWidth.

Установите свойство Scaled в значение True и элемент ImageList автоматически подберет масштаб изображения в вашем приложении с поддержкой High-DPI.

Демонстрационные приложения

Здесь представлен исходный код 2-х демонстрационных приложений в директории с Lazarus:

Изменения, влияющие на обратную совместимость

Метод Add

Альтернатива с высоким разрешением для Lazarus 1.8 и старше: изменение размеров всех изображений в элементе TImageList

Это удобно при масштабировании в приложениях с поддержкой High DPI для получения значков с высоким разрешением при работе с такими элементами, как TActionList, TMainMenu и TToolBar. Примечание: данный способ может работать некорректно со всеми компонентами на всех платформах.

pascal
procedure ScaleImageList(ImgList: TImageList; NewWidth, NewHeight: Integer);
var
  TempImgList: TImageList;
  TempBmp1: TBitmap;
  TempBmp2: TBitmap;
  I: Integer;
begin
  TempImgList := TImageList.Create(nil);
  TempBmp1 := TBitmap.Create;
  TempBmp1.PixelFormat := pf32bit;
  TempBmp2 := TBitmap.Create;
  TempBmp2.PixelFormat := pf32bit;
  TempBmp2.SetSize(NewWidth, NewHeight);
  try
    TempImgList.Width := NewWidth;
    TempImgList.Height := NewHeight;

    for I := 0 to ImgList.Count - 1 do begin
      // Load image for given index to temporary bitmap
      ImgList.GetBitmap(I, TempBmp1);

      // Clear transparent image background
      TempBmp2.Canvas.Brush.Style := bsSolid;
      TempBmp2.Canvas.Brush.Color := TempBmp2.TransparentColor;
      TempBmp2.Canvas.FillRect(0, 0, TempBmp2.Width, TempBmp2.Height);

      // Stretch image to new size
      TempBmp2.Canvas.StretchDraw(Rect(0, 0, TempBmp2.Width, TempBmp2.Height), TempBmp1);
      TempImgList.Add(TempBmp2, nil);
    end;

    ImgList.Assign(TempImgList);
  finally
    TempImgList.Free;
    TempBmp1.Free;
    TempBmp2.Free;
  end;
end;

См. также


From the Free Pascal wiki, page "TImageList/ru", as it stood on 2020-03-01 after a change by GAN, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.

Revision 2, last changed by WikiArchive .

Talk about this page

Nobody has opened a bench for this page yet. Sign in to open one.