В чем разница между <listview.Clear> и <listview>.items.clear в delphi 7?

Я хотел бы знать, почему существуют 2 различных способа очистки списка. Одним из них является вызов listview.clear а другим - listview.items.clear. На самом деле, это распространяется и на многие другие компоненты VCL. какой метод нужно использовать и почему?

Ответы

Ответ 1

ListView.Clear является всего лишь оберткой вокруг ListView.Items.Clear с ListItems.BeginUpdate/ListItems.EndUpdate. посмотрите на источник:

procedure TCustomListView.Clear;
begin
  FListItems.BeginUpdate;
  try
    FListItems.Clear;
  finally
    FListItems.EndUpdate;
  end;
end;

Из документов:

Метод BeginUpdate приостанавливает перерисовку экрана до тех пор, пока EndUpdate метод. Используйте BeginUpdate для ускорения обработки и избегайте мерцание, когда элементы добавляются или удаляются из коллекции.

Лучшей практикой является использование BeginUpdate/EndUpdate для скорости и избежания мерцания.
Но основная причина использования ListView.Clear заключается в том, что использование "высокоуровневых VCL-методов" (также комментируемое @Arnaud) всегда является хорошей идеей, и реализация может измениться (BTW, метод был введен в D7).


EDIT: Я тестировал TListView с 10k Элементами (D7/WinXP):

  • ListView.Items.Clear: ~ 5500 мс
  • ListView.Clear: ~ 330 мс

Заключение: ListView.Clear примерно в 16 раз быстрее, чем ListView.Items.Clear, когда BeginUpdate/EndUpdate не используется!

Ответ 2

ListView.Clear - метод удобства, который вызывает ListView.Items.Clear внутренне. Семантической разницы нет, независимо от того, какой из двух вы называете.

Я предпочитаю первую, потому что она короче и не показывает внутреннего представления, которое для меня сейчас не представляет интереса.