Перейти к содержанию
Fire Monkey от А до Я
  • 0

Как добавить в свой компонент TImage и дать возможность менять картинку?


brunnengi

Вопрос

Здравствуйте.

 

Решил не спамить в одну ветку, хоть и смежные, но все же разные вопросы.

  • В своей компоненте хочу использовать Image.
  • И что бы картинка у image менялась в зависимости от значения переменной.

Вроде такого (vcl):

if sType = 'sun' then image1.Picture.LoadFromFile('../sun.png');
if sType = 'moon' then image1.Picture.LoadFromFile('../moon.png'); 

Т.е. я так раньше делал. А как это сделать в своем компоненте, на FMX?

 

Подскажите пожалуйста.

Ссылка на комментарий

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

  • 0
  • Администраторы

Добрый день,

 

Если есть исходники FMX, то посмотрите на реализацию контрола FMX.StdCtrls.TImageControl, не стесняйтесь их изучать. Там как раз аналогичная ситуация, есть встроенный TImage, в который загружается пользовательское изображение.

 

Общие правила такие:

  1. Решаем, где будем хранить контейнер для изображения TImage: в стиле или создавать динамически при создании нашего контрола?
  2. Любое изображение нужно где-то хранить, вариант с загрузкой по пути не самый удачный на мой взгляд. Так как пути на разных платформах будут разными, да и возникает необходимость разворачивания файлов изображений вместе с пакетом (Deployment Manager - Включение своих файлов в приложение). Единственный плюс при этом - это экономия на памяти и ускорение запуска программы, за счет отложенной загрузки изображения. Это может стать решающей причиной для хранения изображения по пути к файлу со всеми вытекающими.
  3. Изображение храним в TBitmap, который создается динамически. Доступ к нему открывается в published секции для работы в DesignTime. В этом случае пользователь сможет загрузить свое изображение в дизайн тайме и при этом оно при сохранении формы автоматически сериализуется в ресурсы формы, а в последующем и восстановится.
  4. Осталось настроить загрузку изображения непосредственно в компонент отображения. В нашем случае в TImage. Если TImage создается динамически нашим контролом и не зависит от стиля, то смело грузим картинку из TBitmap в TImage.Bitmap. Если же контейнер загружается из стиля, то грузим картинку в перекрытом методе ApplyStyle, который вызывается, когда стиль загружен для контрола.
Ссылка на комментарий
  • 0

А есть ли возможность рисовать в run-time? Какой нибудь быстрый метод?

Допустим когда значение sType поменяется, и картинка в Image перерисовывалась сама.

Ниже ПринтСкрин из самой программы.

post-1-0-71340800-1395662669.png

  • Вот если sType = 'sun' то картинка должна быть как на первом item'е
  • а если sType = 'water' то как на втором.

Что бы это можно было в run-time менять.

Я могу цвет каждого пикселя получить.

Как потом их картинке присвоить в Image?

И такая идея вообще имеет смысл? Или это я уже бредом занимаюсь?

Ссылка на комментарий
  • 0
  • Администраторы

Чем дальше в лес, тем больше дров.

 

По этим вопросам, посмею предположить, что вы находитесь в самом начале изучения создания компонентов. Поэтому я вам советую вначале изучить, что к чему и как работают существующие компоненты. Материал я думаю есть в сети, но лучше исходников по-моему ничего не будет. Поэтому:

  1. Стоит взять самый простой компонент и разобраться как он работает.
  2. Посмотреть, как в нем реализованы основные функции, как осуществляется доступ к свойства в дизайн тайме и тд.
  3. Затем переходить на изучение исходного кода более сложных компонентов. Тех, которые реализуют ту функциональность, которая вам нужна.
  4. Затем по образу и подобию делаете свой компонент, шаг за шагом и проверяете.

Тогда многие ваши вопросы отпадут самостоятельно.

 

По вашим вопросам же, все можно сделать. Только не все нужно делать.

  1. Чтобы поменять в рантайме, нужно просто в момент смены свойства sType загружать в контейнер изображения другое изображение.
  2. Цвет пикселя можно получить. Но не нужно стрелять из пушки по воробьям.
Ссылка на комментарий
  • 0

Да, так и есть. Это моя первая практика. В принципе FMX и так позволял делать то что мне нужно не создавая компонентов, а просто накидывая элементы друг в друга, как я это сделал на принтскрине.

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

Постараюсь заполнить свои пробелы. И спасибо что уделили мне время. Вы очень помогли.

Ссылка на комментарий

Присоединяйтесь к обсуждению

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

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

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