• 0
Tarik02

Освобождение памяти TListViewItem

Вопросы

Нужно ли освобождать память после создания ячеек в TListViewItem. Вот код создания:

TListViewItem *Item = ListView1->Items->Add();
Item->Text = "123";

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


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

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

  • 0

при Add тебе возвращается указатель(!) на новый итем. 

смотри TListViewItems.AddItem(Index: Integer) в FMX.ListView

 

в TListViewItems.Delete(Index: Integer) вызывается FreeAndNil итема

 

а вот в TListViewItems.Clear просто чистится TList<TListViewItem>.

как известно TList это просто список указателей. так что сама память при ListView.Items.Clear как я понимаю не освободится.

как альтернатива:

 

while ListView.Items.Count > 0 do

ListView.Items.Delete(0); 

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


Ссылка на сообщение
Поделиться на другие сайты
  • 0
В 10.01.2015 в 13:12, ruslan сказал:

а вот в TListViewItems.Clear просто чистится TList<TListViewItem>. как известно TList это просто список указателей. так что сама память при ListView.Items.Clear как я понимаю не освободится.

Это неверно. Все TListViewItem корректно уничтожаются и освобождаются в Clear.

Чтобы это проверить, достаточно поставить точку останова на TListItem.Destroy;

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

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

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


Ссылка на сообщение
Поделиться на другие сайты
  • 0
В 23.09.2018 в 20:43, ENERGY сказал:

Это неверно. Все TListViewItem корректно уничтожаются и освобождаются в Clear.

Чтобы это проверить, достаточно поставить точку останова на TListItem.Destroy;

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

В Берлине и ниже метод Clear не чистил за собой и правильно будет чистить циклом как в примере выше

Это справедливо только когда данные в ЛВ перезаполняются

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


Ссылка на сообщение
Поделиться на другие сайты
  • 0
В 25.09.2018 в 07:27, Равиль Зарипов (ZuBy) сказал:

В Берлине и ниже метод Clear не чистил за собой и правильно будет чистить циклом как в примере выше

Это справедливо только когда данные в ЛВ перезаполняются

Именно в Берлине я и проверял - под Windows и iOS - деструктор вызывается. Под остальными ОС не проверял, но думаю там тоже все ок.

Что значит "перезаполняются"?

@Равиль Зарипов (ZuBy)

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

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


Ссылка на сообщение
Поделиться на другие сайты
  • 0
В 25.09.2018 в 12:52, ENERGY сказал:

Именно в Берлине я и проверял - под Windows и iOS - деструктор вызывается. Под остальными ОС не проверял, но думаю там тоже все ок.

Что значит "перезаполняются"?

@Равиль Зарипов (ZuBy)

Перезаполняется - Контент в ЛВ меняется

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


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

У меня как раз так - на каждый введеный символ TEdit, я делаю Clear и заполняю снова с другими результатами. И деструктор вызывается каждый раз. Возможно в Берлине до обновлений было по другому..

14 минут назад, Равиль Зарипов (ZuBy) сказал:

Перезаполняется - Контент в ЛВ меняется

 

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

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

    • От Виталий Иванов
      Вопрос к экспертам
      Возникла необходимость и хотел спросить можно ли как-то сделать TlistViewItem  прозрачным, а то получается что сам TlistView может быть прозрачным а его итем нет . Это как-то же делаться у TListBoxItem. 
      Заранее огромное спасибо.
    • От AndroidHalfNoob
      Что то не могу догнать: загрузил в ImageList 2 картинки, а вот в ListView не получается их засунуть.
      var  LItem: TListViewItem;

      если прописываю прямой путь к файлу на компе, то все работает
       


    • От Tarik02
      Я создаю TListViewItem и добавляю её в TListView, но как добавить картинку слева? Вот код создания ячейки:
      TListViewItem *Item = ListView1->Items->Add(); Item->Text = "123";
    • От Kitty
      Приложение создается для платформы Андроид.
      Из INI файла читается время и помещается в список. Рисунок прилагается. Для размещения этого времени справа в списке я использую стандартный пример, который идет в Samples студии:
      const System::UnicodeString sText = L"CA"; void __fastcall TForm1::ListView1UpdatingObjects(const TObject *Sender, const TListViewItem *AItem, bool &AHandled) { TListItemText * LCaption = reinterpret_cast<TListItemText*>((const_cast<TListViewItem*>(AItem))->Objects->FindObject(sText)); if (LCaption == NULL) { LCaption = new TListItemText((TListItem*)AItem); LCaption->Name = sText; LCaption->Align = TListItemAlign::Trailing; LCaption->VertAlign = TListItemAlign::Trailing; LCaption->PlaceOffset->X = 15; LCaption->PlaceOffset->Y = 12; LCaption->TextAlign = TTextAlign::Center; LCaption->Trimming = TTextTrimming::Character; LCaption->IsDetailText = True; LCaption->Width = 90; LCaption->Height = 45; } } //в другом месте программы цикл и в нем фрагмент заполнения: TListViewItem * item = ListView1->Items->Add(); //********************* //в (*It).first например значение: 08:00:00 item->Data[sText] = TValue::From<UnicodeString>((*It).first); Подскажите, пожалуйста, как вместо простого текста в этих местах размещать программно компонент TTimeEdit чтобы читать в него значения, и иметь возможность править эти значения времени прямо в ListView?
      Спасибо.

    • От ovk
      Прошу помощи,как вывести иконки в ListView которые хранятся в StyleBook ?
      у меня есть база,в ней хранятся ID иконок, которые нужно выводить,в StyleBook лежат иконки, может у кого есть подобный опыт?!
    • От Aptem
      Здравствуйте.
       
      Можно ли у TListViewItem при добавлении его в TListView установить свойство Accessory в None?
       
      По-умолчанию, можно установить только More, Checkmark или Detail.
       
      У компонента TListView реализован механизм Swipe-to-Delete и это очень удобно при работе со списками. Но вот дополнительный контрол справа совсем не нужен. У TListBox можно поставить None, но у него нет Swipe-to-Delete.
       
      Спасибо.
    • От antarey
      Аналогично теме интересует как обработать нажатие на картинке TListViewItem.Bitmap и поменять для конкретного итема
  • Последние посетители   0 пользователей онлайн

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