TImageList/ru: what changed
Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.
Title: TImageList/ru
| Old | New | Line | |
|---|---|---|---|
| 1 | + | **TImageList**  является компонентом, представляющим собой список [[TImage/ru|изображений]], которые могут использоваться в других компонентах, таких как [[TToolBar/ru|TToolBar]] или [[TActionList/ru|TActionList]]. | |
| 2 | + | ||
| 3 | + | ## Пример использования с элементом ComboBox | |
| 4 | + | ||
| 5 | + | Для использования **TImageList**, разместите объект **TImageList** на форме. В данном примере нам необходимо шесть изображений. | |
| 6 | + | ||
| 7 | + | Все изображения должны быть одинакового размера. Если используется два разных размера изображений, то нужно использовать и два компонента **TImageList**. | |
| 8 | + | ||
| 9 | + | Установите высоту и ширину изображений в Инспекторе объектов; в нашем случае 50 пикселов в ширину и 18 пикселов высоту. | |
| 10 | + | ||
| 11 | + | Установите свойство *Style* в значение *csOwnerDrawFixed*. | |
| 12 | + | ||
| 13 | + | Дважды щелкните по значку элемента **TImageList** для того, чтобы открыть редактор **TImageList**. Убедитесь, что при выборе значки отображаются корректно. Если они меньше, чем требуется, проверьте их размер в Инспекторе объектов (например, с помощью быстрой клавиши \<F11\>). При необходимости вы можете заново загрузить изображения. | |
| 14 | + | ||
| 15 | + | <figure> | |
| 16 | + | <img src="ImageListEd.png" title="ImageListEd.png" /> | |
| 17 | + | <figcaption>ImageListEd.png</figcaption> | |
| 18 | + | </figure> | |
| 19 | + | ||
| 20 | + | Поместите элемент [[TComboBox/ru|ComboBox]] на форму и присвойте ему имя **cbSymbols** в свойстве *Name*. | |
| 21 | + | ||
| 22 | + | В событии *FormCreate* введите следующее: | |
| 23 | + | ||
| 24 | + | ``` pascal | |
| 25 | + | cbSymbols.Items.Clear; | |
| 26 | + | for I := 0 to 5 do | |
| 27 | + | cbSymbols.Items.Add(''); | |
| 28 | + | cbSymbols.ItemIndex := 0; | |
| 29 | + | ``` | |
| 30 | + | ||
| 31 | + | В результате в элемент ComboBox будет добавлено 6 пустых строк и выбрана первая из них. | |
| 32 | + | ||
| 33 | + | В событии *OnDrawItem* для элемента **cbSymbols** поместите следующий код: | |
| 34 | + | ||
| 35 | + | ``` pascal | |
| 36 | + | procedure TMyForm.cbSymbolsDrawItem( | |
| 37 | + | aControl: TWinControl; | |
| 38 | + | iIndex: Integer; | |
| 39 | + | aRect: TRect; | |
| 40 | + | aState: TOwnerDrawState ); | |
| 41 | + | var | |
| 42 | + | cnv: TCanvas; | |
| 43 | + | begin | |
| 44 | + | if not (aControl is TComboBox) then exit; | |
| 45 | + | cnv := TComboBox( aControl ).Canvas; | |
| 46 | + | Imagelist1.Draw( cnv, aRect.Left+2, aRect.Top+2, iIndex ); | |
| 47 | + | end; | |
| 48 | + | ``` | |
| 49 | + | ||
| 50 | + | При необходимости скорректируйте центрирование изображения в элементе по центру (изменяя значение +2). | |
| 51 | + | ||
| 52 | + | <figure> | |
| 53 | + | <img src="combo.png" title="combo.png" /> | |
| 54 | + | <figcaption>combo.png</figcaption> | |
| 55 | + | </figure> | |
| 56 | + | ||
| 57 | + | ## Пример использования с элементом SpeedButton | |
| 58 | + | ||
| 59 | + | Добавьте изображения в элемент **ImageList1** как в предыдущем примере и используйте их с помощью следующего кода: | |
| 60 | + | ||
| 61 | + | ``` pascal | |
| 62 | + | ImageList1.GetBitmap(iIndex,SpeedButton1.Glyph); | |
| 63 | + | ``` | |
| 64 | + | ||
| 65 | + | ## Элемент TImageList с поддержкой нескольких разрешений изображения в Lazarus версии 1.9 и выше | |
| 66 | + | ||
| 67 | + | В Lazarus версии 1.9 компонент **TImageList** был переписан для того, чтобы поддерживать несколько разрешений одного изображения. | |
| 68 | + | ||
| 69 | + | <figure> | |
| 70 | + | <img src="ImageListEd-1.9.png" title="ImageListEd-1.9.png" /> | |
| 71 | + | <figcaption>ImageListEd-1.9.png</figcaption> | |
| 72 | + | </figure> | |
| 73 | + | ||
| 74 | + | Каждый элемент управления из библиотеки [[LCL/ru|LCL]], поддерживающий работу с элементом **ImageList**, теперь содержит новое свойство *\[Images\]Width*, чтобы определить какая пользовательская ширина должна использоваться для разрешения 96 PPI (100% масштаб). Примеры: TToolBar.Images/ImageWidth, TListView.LargeImages/LargeImagesWidth. | |
| 75 | + | ||
| 76 | + | Установите свойство *Scaled* в значение [[True/ru|True]] и элемент **ImageList** автоматически подберет масштаб изображения в вашем приложении с поддержкой High-DPI. | |
| 77 | + | ||
| 78 | + | ### Демонстрационные приложения | |
| 79 | + | ||
| 80 | + | Здесь представлен исходный код 2-х демонстрационных приложений в директории с Lazarus: | |
| 81 | + | ||
| 82 | + | - examples/imagelist_highdpi_designtime | |
| 83 | + | - examples/imagelist_highdpi_runtime | |
| 84 | + | ||
| 85 | + | ### Изменения, влияющие на обратную совместимость | |
| 86 | + | ||
| 87 | + | #### Метод Add | |
| 88 | + | ||
| 89 | + | - Старое поведение: изображение было нарезано, если оно большое, или расширено, если оно слишком маленькое. | |
| 90 | + | - Новое поведение: изображение в элементе ImageList масштабируется под все разрешения. | |
| 91 | + | - Причина: теперь поддерживает несколько разрешений. | |
| 92 | + | - Устранение: используйте AddSliced (если изображение состоит из нескольких добавляемых значков) или AddSlice (если нужно добавить одно изображение из пользовательского прямоугольника, также поддерживается прямоугольная область вне изображения). | |
| 93 | + | ||
| 94 | + | ## Альтернатива с высоким разрешением для Lazarus 1.8 и старше: изменение размеров всех изображений в элементе TImageList | |
| 95 | + | ||
| 96 | + | Это удобно при масштабировании в приложениях с поддержкой [[High DPI]] для получения значков с высоким разрешением при работе с такими элементами, как [[TActionList/ru|TActionList]], [[TMainMenu/ru|TMainMenu]] и [[TToolBar/ru|TToolBar]]. Примечание: данный способ может работать некорректно со всеми компонентами на всех платформах. | |
| 97 | + | ||
| 98 | + | ``` pascal | |
| 99 | + | procedure ScaleImageList(ImgList: TImageList; NewWidth, NewHeight: Integer); | |
| 100 | + | var | |
| 101 | + | TempImgList: TImageList; | |
| 102 | + | TempBmp1: TBitmap; | |
| 103 | + | TempBmp2: TBitmap; | |
| 104 | + | I: Integer; | |
| 105 | + | begin | |
| 106 | + | TempImgList := TImageList.Create(nil); | |
| 107 | + | TempBmp1 := TBitmap.Create; | |
| 108 | + | TempBmp1.PixelFormat := pf32bit; | |
| 109 | + | TempBmp2 := TBitmap.Create; | |
| 110 | + | TempBmp2.PixelFormat := pf32bit; | |
| 111 | + | TempBmp2.SetSize(NewWidth, NewHeight); | |
| 112 | + | try | |
| 113 | + | TempImgList.Width := NewWidth; | |
| 114 | + | TempImgList.Height := NewHeight; | |
| 115 | + | ||
| 116 | + | for I := 0 to ImgList.Count - 1 do begin | |
| 117 | + | // Load image for given index to temporary bitmap | |
| 118 | + | ImgList.GetBitmap(I, TempBmp1); | |
| 119 | + | ||
| 120 | + | // Clear transparent image background | |
| 121 | + | TempBmp2.Canvas.Brush.Style := bsSolid; | |
| 122 | + | TempBmp2.Canvas.Brush.Color := TempBmp2.TransparentColor; | |
| 123 | + | TempBmp2.Canvas.FillRect(0, 0, TempBmp2.Width, TempBmp2.Height); | |
| 124 | + | ||
| 125 | + | // Stretch image to new size | |
| 126 | + | TempBmp2.Canvas.StretchDraw(Rect(0, 0, TempBmp2.Width, TempBmp2.Height), TempBmp1); | |
| 127 | + | TempImgList.Add(TempBmp2, nil); | |
| 128 | + | end; | |
| 129 | + | ||
| 130 | + | ImgList.Assign(TempImgList); | |
| 131 | + | finally | |
| 132 | + | TempImgList.Free; | |
| 133 | + | TempBmp1.Free; | |
| 134 | + | TempBmp2.Free; | |
| 135 | + | end; | |
| 136 | + | end; | |
| 137 | + | ``` | |
| 138 | + | ||
| 139 | + | ## См. также | |
| 140 | + | ||
| 141 | + | - [[doc:lcl//controls/timagelist.html|Документация по TImageList]] | |
| 142 | + | - [[TImage/ru|TImage]] | |
| 143 | + | ||
| 144 | + | --- | |
| 145 | + | *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](/wiki-contact).* |
