Я хотел бы знать, почему существуют 2 различных способа очистки списка. Одним из них является вызов listview.clear
а другим - listview.items.clear
. На самом деле, это распространяется и на многие другие компоненты VCL. какой метод нужно использовать и почему?
В чем разница между <listview.Clear> и <listview>.items.clear в delphi 7?
Ответ 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
внутренне. Семантической разницы нет, независимо от того, какой из двух вы называете.
Я предпочитаю первую, потому что она короче и не показывает внутреннего представления, которое для меня сейчас не представляет интереса.