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