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

Item.ItemData.Bitmap


Kitty

Вопрос

Подскажите, как правильно реализовать:
На хостинге хранятся картинки. Имена картинок можно задать произвольные, чтобы было удобно их перебирать в цикле.
Как правильно добавить картинки в ListBox с удаленного хостинга?
Надо использовать в цикле TIdHTTP скачивать картинку во временный файл и потом:
Item.ItemData.Bitmap.LoadFromFile('011.jpg')
?

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

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

  • 0

Добрый день!

Картинки правильно грузить в отдельном потоке в TBitmapSurface, так как последний, в отличии от TBitmap, корректно работает в потоках. Как скачаете, то можно сохранить в файл, для дальнейшего показа и отобразить на экране. Секция отображения на экране должна быть обязательно засинхронизирована с основным потоком. Общая схема такая.

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

вот посмотрите реализацию на TListView, TListBox будет лагать жутко.

Так что сразу используйте TListView, там есть процедура для асинхронного скачивания картинки

Ссылка на комментарий
  • 0
  • Модераторы
2 часа назад, Kitty сказал:

Спасибо. Проект с TListBox - придется все переделывать. Картинки маленькие и строк TListBox будет не больше 50 штук. Можно все же с TListBox?

Можно конечно, но какая будет производительность я незнаю. давно TListBox не использовал

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

Прежде чем приступить к полному заполнению листбокса пытаюсь вообще получить картинку в одном итеме. Что не правильно в этом коде? Я не вижу картинку в листбоксе:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  std::unique_ptr<TMemoryStream> WelcomeINI(new TMemoryStream());
  try
   {
	IdHTTP1->Get(L"http://welcome.um.la/myimg/11.png", WelcomeINI.get());
	WelcomeINI->Position = 0;
   }
   catch(...)
		{
		 WelcomeINI->LoadFromFile("72x72.png"); //картинка по дефолту
         WelcomeINI->Position = 0;
		}


	  ListBox1->BeginUpdate();
      TListBoxItem *ListBoxItem;
	  TListBoxGroupHeader *ListBoxGroupHeader;
	  ListBoxGroupHeader = new TListBoxGroupHeader(ListBox1);
	  ListBoxGroupHeader->Text = L"ONE";
	  ListBox1->AddObject(ListBoxGroupHeader);

	  ListBoxItem = new TListBoxItem(ListBox1);
	  ListBoxItem->StyleLookup = L"listboxitemdetaillabel";
      ListBoxItem->Height = 72; //высота картинки
	  ListBoxItem->Text = L"Test1";
	  ListBoxItem->ItemData->Bitmap->LoadFromStream(WelcomeINI.get());
	  ListBox1->AddObject(ListBoxItem);
	  ListBox1->EndUpdate();
}

 

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

А какой настройки не хватает, чтобы увидеть текст полностью в итеме?

ListBox1->BeginUpdate();
      TListBoxItem *ListBoxItem;
	  TListBoxGroupHeader *ListBoxGroupHeader;
	  ListBoxGroupHeader = new TListBoxGroupHeader(ListBox1);
	  ListBoxGroupHeader->Text = L"Заголовок";
	  ListBox1->AddObject(ListBoxGroupHeader);

	  ListBoxItem = new TListBoxItem(ListBox1);
	  ListBoxItem->StyleLookup = L"listboxitemleftdetail";
	  ListBoxItem->Height = 72; //высота картинки
      ListBoxItem->TextSettings->WordWrap = true;
	  ListBoxItem->Text = L"Магазина на втором этаже";
	  ListBoxItem->ItemData->Bitmap->LoadFromStream(WelcomeINI.get());
	  ListBox1->AddObject(ListBoxItem);
	  ListBox1->EndUpdate();

 

text.jpg

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

К сожалению не помогло. А стиль я никакой не меняла просто положила ListBox на форму. Тестирую в Windows.

//***
ListBoxItem->TextSettings->Trimming = TTextTrimming::None;
ListBoxItem->TextSettings->WordWrap = true;
ListBoxItem->Text = L"Магазин на втором этаже";

 

И еще почему не взирая на то, что высота всех картинок 72 и высота выставлена:

ListBoxItem->Height = 72;

тем не менее картинки отображаются 44х44, а не 72х72. :(

 

Изменено пользователем Kitty
Ссылка на комментарий
  • 0

Если Вы заполните Detail этого listboxitem, то увидите, почему обрезается текст: такие размеры и положение текста заданы в стиле 'listboxitemleftdetail'.
Размер картинки (ширина) тоже задана стилем. Чтобы обойти эти ограничения рекомендую создать свой стиль для listboxitem

Изменено пользователем enatechno
Ссылка на комментарий
  • 0

Обратите внимание, что если вы хотите поменять текстовые настройки, надо также установить свойство StyledSettings. Оно указывает какие текстовые настройки берутся из стиля, а какие из свойства. 

Ссылка на комментарий
  • 0
В 06.12.2016 в 20:34, Кривяков Виталий сказал:

Добрый день!

Картинки правильно грузить в отдельном потоке в TBitmapSurface, так как последний, в отличии от TBitmap, корректно работает в потоках. Как скачаете, то можно сохранить в файл, для дальнейшего показа и отобразить на экране. Секция отображения на экране должна быть обязательно засинхронизирована с основным потоком. Общая схема такая.

Кстати. Вчера был закрытый вэбинар про Токио. Так одним из нововведений будет поддержка TBitmap в потоках.

Ссылка на комментарий
  • 0
12 часов назад, RoschinSpb сказал:

Обратите внимание, что если вы хотите поменять текстовые настройки, надо также установить свойство StyledSettings. Оно указывает какие текстовые настройки берутся из стиля, а какие из свойства. 

Спасибо, вижу полный текст. Но выглядит очень криво. Много пустого места справа, а могло бы свободно поместиться одно-два слова.

ListBoxItem = new TListBoxItem(ListBox1);
	  ListBoxItem->StyleLookup = L"listboxitemleftdetail";
	  ListBoxItem->Height = 72; //image heigth
	  ListBoxItem->TextSettings->Trimming = TTextTrimming::None;
	  ListBoxItem->TextSettings->WordWrap = true;
	  ListBoxItem->Text = L"Магазин на втором этаже";
	  ListBoxItem->StyledSettings = ListBoxItem->StyledSettings >> TStyledSetting::Other;
      ListBoxItem->ItemData->Accessory = static_cast<TListBoxItemData::TAccessory>(1);
	  ListBoxItem->ItemData->Bitmap->LoadFromStream(WelcomeINI.get());
	  ListBox1->AddObject(ListBoxItem);

 

list.jpg

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

Повторюсь. Свободное место справа, которое Вы на рисунке отметили вопросами, в стиле listboxitemleftdetail отведено под Detail.
Создайте свой стиль или попробуйте стиль без Detail:
 

ListBoxItem->StyleLookup = L"listboxitemnodetail";

P.S. Другое дело, непонятно, почему  ..leftdetail в названии стиля, если Detail отображается справа. Но это вопрос к разработчикам) 

 

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

Ясно. В андроид стиле вроде как detail находиться внизу слева как и положено. Это наверное только для Windows detail стоит в странной позиции справа?

Стиль с detail мне нужен. Я там храню ссылки на сайт и делаю сам detail не видимым:

ListBoxItem->StylesData["detail.visible"] = TValue::From<bool>(false);

и при нажатии на кнопку переход по ссылке.

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

 

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

В стиле listboxitemnodetail можете хранить ссылки в Detail.

ListBoxItem->Detail = L"текст ссылки";

Они не будут отображаться.

Изменено пользователем enatechno
Ссылка на комментарий

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

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

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

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

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

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

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

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

  • Последние посетители   0 пользователей онлайн

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