• 0
Вольдемар

Кнопка с картинкой

Вопрос

Подскажите плиз, как сделать картинку для TSpeedButton или TButton?

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


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

29 ответов на этот вопрос

  • 0

кидаешь на форму ImageList1, в неё загружаешь картинку, в TButton в images выбираешь ImageList1 и ставишь индекс картинки.

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


Ссылка на сообщение
Поделиться на других сайтах
  • 0
4 часа назад, valdemar сказал:

кидаешь на форму ImageList1, в неё загружаешь картинку, в TButton в images выбираешь ImageList1 и ставишь индекс картинки.

Странно ведет себя ImageList. Он заточен под размер 16 на 16 ?

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


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

valdemar и Вольдемар :))

совпадение?

 

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


Ссылка на сообщение
Поделиться на других сайтах
  • 0
10 часов назад, wamaco сказал:

valdemar и Вольдемар :))

совпадение?

 

Не думаю.

16 часов назад, Вольдемар сказал:

Странно ведет себя ImageList. Он заточен под размер 16 на 16 ?

Да, действительно, только 16х16. Тогда советую использовать ImageControl1 вместо кнопки, чтобы была полноразмерная картинка.

Вольдемар понравилось это

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


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

в ImageList размер может быть любой

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


Ссылка на сообщение
Поделиться на других сайтах
  • 0
55 минут назад, valdemar сказал:

Да, действительно, только 16х16. Тогда советую использовать ImageControl1 вместо кнопки, чтобы была полноразмерная картинка.

59f97b9a667cf_shoot(87).gif.0a67c9c99f1e6a622018e33ce7634efa.gif

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


Ссылка на сообщение
Поделиться на других сайтах
  • 0
2 часа назад, Rusland сказал:

в ImageList размер может быть любой

Там да, а на кнопке отображается 16х16 при любом размере загруженной картинки.

Ну или можно использовать стили, и забыть image - как пережиток VCL

Изменено пользователем valdemar
Вольдемар понравилось это

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


Ссылка на сообщение
Поделиться на других сайтах
  • 0
6 часов назад, valdemar сказал:

Там да, а на кнопке отображается 16х16 при любом размере загруженной картинки.

вот -вот

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


Ссылка на сообщение
Поделиться на других сайтах
  • 0
В 01.11.2017 в 15:50, Вольдемар сказал:

вот -вот

Вольдемар + valdemar 

Компонент TImageList - один из самых задокументированных компонентов FM, также имеется демонстрационное приложение входящее в поставку Delphi, кроме того есть две статьи на русском языке про TImageList и видео с примерами работы, не говоря уже об обсуждениях на этом сайте... к чему это я? А... вот вспомнил, это я к тому, что если вы не смогли найти подходящей информации по теме, то это хороший повод задуматься о своём месте в мироздании. Кажется, программирование это не ваше призвание. Возможно в качестве кондуктора, или дворника вы бы принесли гораздо больше пользы человечеству.

Спасибо за понимание.

Изменено пользователем RoschinSpb

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


Ссылка на сообщение
Поделиться на других сайтах
  • 0
2 часа назад, RoschinSpb сказал:

Вольдемар + valdemar 

Компонент TImageList - один из самых задокументированных компонентов FM, также имеется демонстрационное приложение входящее в поставку Delphi, кроме того есть две статьи на русском языке про TImageList и видео с примерами работы, не говоря уже об обсуждениях на этом сайте... к чему это я? А... вот вспомнил, это я к тому, что если вы не смогли найти подходящей информации по теме, то это хороший повод задуматься о своём месте в мироздании. Кажется, программирование это не ваше призвание. Возможно в качестве кондуктора, или дворника вы бы принесли гораздо больше пользы человечеству.

Спасибо за понимание.

Функционал TImageList конечно хорош, но совершенно невозможно становится работать, когда в TImageList в designtime загружено например 50 Мб изображений и больше. IDE просто начинает вставать, например просто выделение любого компонента на экране может длится 5 секунд (и это на весьма и весьма хорошем компе), в папке __history общий размер версий файла формы  начинает измеряться в гигабайтах.

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


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

неясно, в чем проблема-то

ImageList виноват, что вы запихали 50 мб в него ???

или что IDE сохраняет полные версии форм в history ?

ну так переработайте алгоритм

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


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

Так суть TImageList в том и состоит, что он является коллекцией изображений. И конфигурируем мы его как правило именно в design-time, не? А если его нельзя использовать для управления 50 Мб картинками, то возникает вопрос необходимости использования этого компонента в принципе. Отключить в IDE сохранение истории конечно можно, но зачем тогда люди старались, делали такую фишку? :) Мне иногда пригождается.

И да, я переделал работу с картинками - картинки хранятся в файлах, я их загружаю при старте приложения в TList<TImage> (вернее какие то изображения сразу, какие то при необходимости, какие то после использования в памяти уничтожаю). Работает быстро, проблемы тормозов при разработке нет.

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


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

основная фишка TImageList в том, что он умеет хранить в одном большом изображении набор иконок одного размера. И еще умеет выбирать Scale. Это удобно, когда делаешь дизайн программы

Все остальное вы предположили самостоятельно

поэтому подбирайте алгоритм и инструменты в соответствии с задачей

по мне так для вашей задачи больше подходит TObjectList<TBitmap>

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


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

Да, я сначала использовал именно TObjectList<TBitmap>, но столкнулся с тем, что на андроиде у TBitmap не было выделенного дескриптора, а если использовать bitmap у TImage, то всё ок. Честно скажу, что гуглил мало, возможно что то не допонял / не доделал. 

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


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

что-то не понял про дескриптор. речь про WinApi ?

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


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

нет, речь про андроид

суть в том, что когда я делал

var
  LBitmap: TBitmap;
begin
  LBitmap := TBitmap.Create;
  try
    LBitmap.LoadFromFile(LSomeFileName);  // здесь ок, загрузка успешна
    // начинаем что нибудь делать с этим битмапом в андроиде, получаем экспешн
  finally
    LBitmap.DisposeOf;
  end;
end;

 

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


Ссылка на сообщение
Поделиться на других сайтах
  • 0
5 часов назад, Tumaso сказал:

А если его нельзя использовать для управления 50 Мб картинками, то возникает вопрос...

Любопытно было бы взглянуть на приложение которое работает на телефоне и грузит 50Мб картинок в кнопки во время старта.

Andrey Efimov и krapotkin понравилось это

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


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

я использовал подобный код. все было совершенно нормально. только вместо DisposeOf обычное Free. 

нужно только помнить, что битмап до Токио -не работает в потоках

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


Ссылка на сообщение
Поделиться на других сайтах
  • 0
1 час назад, RoschinSpb сказал:

Любопытно было бы взглянуть на приложение которое работает на телефоне и грузит 50Мб картинок в кнопки во время старта.

Узко мыслите, коллега. Картинки используются не только на кнопках, а еще как фоновые картинки на фреймах, локализация изображений для разных стран (все помнят про разный символ земного шара в разных странах?) и т.д, вариантов применения статических изображений в приложении миллиард. А 50 Мб не предел, у дизайнеров UI в моей компании очень много идей.

По идее TImageList и должен брать на себя всю черновую работу по работе с изображениями, чтобы не приходилось использовать свои TList<TImage>, не правда ли?

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


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

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

в TImageList тоже можно загружать картинки динамически

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


Ссылка на сообщение
Поделиться на других сайтах
  • 0
13 часа назад, Tumaso сказал:

По идее TImageList и должен брать на себя всю черновую работу по работе с изображениями, чтобы не приходилось использовать свои TList<TImage>, не правда ли?

Всю работу, так он выполняет, или рисовать тоже должен не хуже фотошопа? Как я понял у вас проблема, IDE долго работает с 50Мб формой? Так это наверно вопрос к IDE, диску, SVN... и да TImageList не предназначен для хранения архива фотографий. Он предназначен для хранения пиктограмм для интерфейсных элементов. Были мысли по расширению возможностей и подзагрузки изображений в RunTime из разных источников (файлы, ресурсы, интернет), но не судьба уже видимо.

Ну, как я понимаю скриншотика мобильного приложения с 50Мб картинок мы не дождемся. Я даже подозреваю почему.

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


Ссылка на сообщение
Поделиться на других сайтах
  • 0
3 часа назад, RoschinSpb сказал:

Были мысли по расширению возможностей и подзагрузки изображений в RunTime из разных источников (файлы, ресурсы, интернет), но не судьба уже видимо

Почему не судьба?

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


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

Потому, что ваш покорный слуга уже больше года в IDERA не работает как и большинство разработчиков. 

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


Ссылка на сообщение
Поделиться на других сайтах
  • 0
31 минуту назад, RoschinSpb сказал:

Ну, как я понимаю скриншотика мобильного приложения с 50Мб картинок мы не дождемся. Я даже подозреваю почему.

Намекаете, что приложения не существует? Существует :D 

00.png

01.png

Alex7wrt понравилось это

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


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

Да, мило. Как уже было сказано можно подгружать фотографии и в TImageList в RunTime, примеров тут есть.

begin
  Button1.Images := ImageList1;
  Button1.ImageIndex := ImageList1.AddOrSet('Add', [1, 1.5, 2],
    ['D:\Мои веселые картинки\Icons\add16.png',
     'D:\Мои веселые картинки\Icons\add24.png',
     'D:\Мои веселые картинки\Icons\add32.png']);
end;

Тогда в отличие от TList будет автоматически разруливаться ситуация с большим количеством одновременно созданных TBitmap.
TBitmap это довольно ресурсоёмкий объект (отсюда и возможные ошибки с дескрипторами) их количество ограничено, особенно на телефонах, TImageList хранит данные хоть и в памяти но просто в виде двоичных данных (в формате PNG), при этом системные объекты создаются и уничтожатся по мере использования, максимальное их количество можно задать свойством CacheSize (должно быть не меньше чем максимальное количество одновременно видимых картинок на экране).

Anatoliy понравилось это

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


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

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу