Перейти к содержанию
  • Регистрация
  • 0
rareMax

Есть ли в fmx класс TImageList?

Вопрос

Что то не могу найти в fmx класс TImageList - есть ли он вообще? Если его нет, дайте совет где хранить изображения(смайлы, штук 20). Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Рекомендуемые сообщения

  • 0

На данный момент (до версии RAD Studio XE5) FireMonkey не имеет компонент TImageList.

Однако, для хранения графических ресурсов отлично подходит TStyleBook. Общая идея сводится к добавлению именованных графических ресурсов в TStyleBook в контейнере TImage. Затем мы каждому TImage задаем имя через StyleName. И затем в нашем коде уже по строковому идентификатору достаем нужную картинку.

 

Рассмотрим теперь это на практике.

Создадим приложение, которое будет вытаскивать картинку по имени из TStyleBook и отображать его в контейнере TImage.

 

1. Создаем TStyleBook. Перетаскиваем его палитры компонентов (Tool Palette) в дизайнере на форму. Так же на форме я разметил кнопку и TImage для отображения выбранного изображения.

post-1-0-54560700-1388694754_thumb.jpg

 

2. Открываем дизайнер стилей и добавляем компонент TImage, путем перетаскивания TImage в корень Structure Panel (панель с деревом компонентов формы).

post-1-0-04195500-1388694739_thumb.jpg

 

3. В TImage загружаем картинку и называем картинку через TImage.StyleName. В моем случае изображение андроида и название  - 'android'. 

post-1-0-47577400-1388694758_thumb.jpg

post-1-0-55951300-1388694756_thumb.jpg

 

4. Обратите внимание, что RAD Studio XE5 поддерживает картинки разного dpi для четкой отображения на экранах с разными dpi и Экранным масштабом (Scale). На рисунке выше, я загрузил два разрешения картинки, для обычных экранов, и экранов с удвоенной плотностью пикселей. Это актуально для мобильных платформ и OSX с экранами ретина.

 

5. Пишем метод, который вытащить картинку по имени:

function TForm4.GetImage(const AImageName: string): TBitmap;
var
  StyleObject: TFmxObject;
  Image: TImage;
begin
  StyleObject := ImageBook.Style.FindStyleResource(AImageName);
  if (StyleObject <> nil) and (StyleObject is TImage) then
  begin
    Image := StyleObject as TImage;
    Result := Image.Bitmap;
  end
  else
    Result := nil;
end;

Каждый объект FireMonkey TFmxObject предоставляет способ для поиска среди дочерних объектов объект с указанными именем StyleLookup. Доступ к корню всех стилей в StyleBook  является свойство TStyleBook.Style. Далее ищем у корня стиль с нужным именем картинки. Если стиля нету, то метод вернет nil. Иначе проверяем, что стиль есть и он экземпляр контейнера TImage. Далее просто выбираем картинку через свойство Bitmap.

 

6. Вытаскиваем картинку и отображаем ее в TImage на форме.

procedure TForm4.Button1Click(Sender: TObject);
var
  Bitmap: TBitmap;
begin
  Bitmap := GetImage('android');
  if Bitmap <> nil then
    Image1.Bitmap.Assign(Bitmap);
end;

Вот в принципе и вся идея. Эту идею можно обобщить, сделав отдельный компонент с быстрой загрузкой картинок. Но это уже практика.

 

Пример можно скачать тут: ImageBook.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Гость
Эта тема закрыта для публикации ответов.

  • Похожий контент

    • От x11
      Не могу понять, что случилось в проекте с TDataModule.
      Проект мультиплатформенный. В прошлый раз сохранил, закрыл, ничего необычного. Сегодня открываю, а мне ошибку Delphi Berlin показывает.
       
      И действительно, у TImageList отсутствует свойство source. Открываю, а он выглядит по-другому, как будто из VCL.
      Закрываю проект, создаю мультиплатформенную форму, кладу TImageList на форму и о чудо - совершенно другой TImageList и свойство Source есть.
      Что случилось с моим TDataModule? Как среде дать понять, что это мультиплатформенный проект?

    • От x11
      Не знаю, куда правильно задать вопрос. Решил здесь.
      Обычная стандартная связка TImageList + TActionList+TSpeedButton.
      в TImageList загрузил картинку 32*32.
      Всё связал и она появилась у кнопки на панели.
      Обратил внимание, что картинка 32*32 маловата и я решил загрузить картинку 48*48.
      Удалил из TImageList картинку и загрузил новую. Но размер картинки на кнопке остался 32*32.
      А потом ещё и исчезла картинка из TActionList.
       
      В TImageList только одна картинка.
      Delphi Berlin.


    • От DrMzi
      Доброго времени суток!
      Собираю тестовый проект под Win, иконки вижу.
      C:\Users\Public\Documents\Embarcadero\Studio\19.0\Samples\Object Pascal\Multi-Device Samples\User Interface\ListView\ListViewImageIndex
      Собираю тестовый проект под Android, иконок нет.
      Что я делаю не так ?

      Поправка. Такое поведение у apk на xiaomi mi5, запустил на Philips Xenium - иконки есть. 
       
    • От geotub
      Уважаемые знатоки! Здравствуйте!
      с FMX дружу плохо! Задача тривиальная прошу помощи!
      есть соединение с MYSQL через Bind Visual привязан к StringGrid, данные отображаются идеально все хорошо!
      Задача слеждующая:
      - есть колонка "status" со значениями от 0 до 10 
      - есть imageList с картинками в таком же диапазоне 
      Необходимо в StringGgrid вместо значений выводить картинку из imageList равную значению (значение 3 = номер imageList = 3 и тд) 
      Пробовал все Варианты ничего не выходит! Пожалуйста помогите!
    • От ENERGY
      Upd:
      Пожалуйста проголосуйте. Думаю это всех касается, т.к. проблема связана и с TImageList и с TImage. 
      https://quality.embarcadero.com/browse/RSP-18210
       
       
      Сейчас столкнулся с большой проблемой перед самым релизом для заказчика..
      17 картинок, разного размера. Сейчас в TImageList  сетка рисуется постоянно при обновлении Source каждой картинки. C каждым разом становится сетка четче.  Если раньше я просто обновлял на новые картинки, и таким образом решал проблему, то сейчас после обновления source картинок сетка остается на многих картинках, причем я даже не закрываю TImageList . Только начинаю замещать одни картинки, на других появляется сетка..
      И вот что теперь делать незнаю..
       
      Да кстати картинки портятся и в TImage со временем в Design Time.
      Сетка означает что картинку много раз масштабируют. Но почему не сохраняют оригинал, это мне не понятно..
      Что тут можно придумать?
       
      Delphi Berlin Update 2
    • От Володимир Антонашко
      Здраствуйте.
      В программе я заполняю Tgrid изображениями из Imagelist по имени фото который есть в ячейке . Код :
      if column.index = 8 then //Загрузка картинок. if not value.IsEmpty then begin column.BeginUpdate; i:=StrToInt(maingr.Cells[column.Index,row]); imageindex:=main_form.ImageList1.Source.IndexOf(IntToStr(i)); column.Canvas.Clear(RowColor.Color); main_form.ImageList1.draw(column.Canvas,bounds,imageindex,100); column.EndUpdate; end; Если я уберу очистку канвы то изображения накладуються. А так как есть следующий раз при вызове DrawColumnCell изображение остается только в последней записи.
      Но такой код в  процедуре SelectCell нормально отображает изображение. На каждый вызов. Даже если изображение в ячейке нету.
      if acol = 8 then begin i:=maingr.Cells[Acol,Arow]; imageindex:=main_form.ImageList1.Source.IndexOf(i); imageviewer1.Bitmap.Clear(TAlphaColors.Null); imageviewer1.Bitmap:=main_form.ImageList1.Bitmap(size,imageindex); end; И по поводу памяти. Как я понял, после того как я присвою изображение ячейке, оно загружается в память. Также когда отображается в ImageViewer.
      Но после удаления строки с изображениям, память остается занята для уже использованных изображений.  То есть при повторном показе память больше не занимается и используется изображение которое было ранее загружено. Думаю это нормальное поведение. Так увеличивается скорость работы программы. Но я собираюсь показывать до 50 фотографий одновременно (средний размер 1мб) из 5-10 тисяч. И мне нужно чтоб после использования изображений память очищалась, иначе программа будет кушать под 10гб оперативной памяти.
    • От Rusland
      Delphi Tokyo
      ListView->ItemAppearance->ItemAppearance=DynamicAppearance
      Есть ImageList c 3 картинками.
      Добавляю item-ы в ListView:
      procedure TForm1.Button1Click(Sender: TObject); var i:integer; Lvi: TListViewItem; begin LsvObjects.BeginUpdate; LsvObjects.Items.Clear; try for i:=0 to 100 do begin Lvi := LsvObjects.Items.Add; Lvi.Tag := i; Lvi.Data['ObjectText'] := 'ObjectText '+i.ToString; Lvi.Data['StateText'] := 'StateText '+i.ToString; Lvi.Data['ConnectText'] := 'ConnectText '+i.ToString; end; finally LsvObjects.EndUpdate; end; end; в UpdateObjects рандомно выбираю картинку:
      procedure TForm1.LsvObjectsUpdateObjects(const Sender: TObject; const AItem: TListViewItem); var ... oConnectImage: TListItemImage; r: integer; begin r:=Random(ImageList1.Count); oConnectImage:=aItem.Objects.FindDrawable('ConnectImage') as TListItemImage; if (oConnectImage<>nil) then oConnectImage.ImageIndex:=r; ... end; В Windows все нормально. А вот что я вижу на планшетах:
      На Dexp:   
      На Lenovo:
       
      Картинки могут появиться, а могут и нет. Как исправить ситуацию? Вот сам проект.
      Про Berlin добавлю вопрос позже.
    • От ENERGY
      Меня это проблема преследует со времен VCL...
      Подскажите как же ее решить...
      FMX TListView - ItemAppearanceName = ImageListItem.   Лежит fmx TimageList, в настройках указано 16x16 и прорачный цвет clNone, добавил одну иконку 16x16 с прозрачностью. Если запустить под Windows 10  все ок. Если запустить под Android то при выделении (selected) вместо прозрачности белый цвет. В результате иконка некрасиво обрамлена в белом квадрате.. Иконку делал в Axiallis IconWorkShop, сохранил как ico,  Пробовал заливать белым вместо прозрачного, и затем ставить в TimageList белый как прозрачный - тоже самое...
      Что же делать...
    • От Сергей Сергеев
      Привет всем!
      Поймал такой глюк - пока только на одном устройстве - Samsung gt i9505 andr 4.2.2 - ядро 3.4.0, на десятке других не замечено.
      Delphi Seattle 6.1 b 7601 - win 7 - 64  Android SDK 25.2.2.-32 bit
      Создал форму, на нее кнопку , ImageList - загрузил одну иконку 32*32 
      из 10 запусков - один с картинкой на кнопке , 9 - без.. причем она вроде есть.. но как марево из точек..
      тоже самое с Glyph ( добавил), а в TImage ( добавил) - где изображение загружено напрямую в битмап - все ок.
      Что делать - как обойти?Спасибо всем заранее..
       
    • От RoschinSpb
      Статья: http://community.embarcadero.com/blogs/entry/timagelist101ru-1 Автор: Сергей Рощин Обзор новых возможностей, которые появились в компоненте и редакторе TImageList для Delphi R101 (2016 год, Version 24)
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...