Вопрос по – В чем разница между и .items.clear в delphi 7?

14

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

Ваш Ответ

2   ответа
21

ListView.Clear это просто обертка вокругListView.Items.Clear сListItems.BeginUpdate/ListItems.EndUpdate, посмотрите на источник:

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

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

The BeginUpdate method suspends screen repainting until the EndUpdate method is called. Use BeginUpdate to speed processing and avoid flicker while items are added to or deleted from a collection.

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

EDIT: Я проверилTListView с10k Предметы (D7 / WinXP):

ListView.Items.Clear: ~5500 ms ListView.Clear: ~330 ms

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

@Smasher Сclear освободить каждый объект, он будет уведомлять каждое удаление в VCL, еслиBeginUpdate / EndUpdate используется. В этом разница между двумя и почемуClear намного быстрее чемItems.Clear, Всегда полезно вызывать методы VCL высокого уровня напрямую, а не переходить к внутреннему подключению, если вы точно не знаете, что делаете.
@ArnaudBouchez спасибо! хорошо знать.
@ArnaudBouchez, +1 за «высокоуровневые методы VCL». это было именно то выражение, которое я искал.
На самом деле, я не думаю, чтоBeginUpdate .. EndUpdate может помочь в случаеclear.
1

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

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

BeginUpdate/EndUpdate делает огромную проблему с производительностьюTListView.
Я не ожидаю проблем с производительностью. Один просто звонит другому сBeginUpdate .. EndUpdate не имеет значения в этом случае (imho).
-1 для того, чтобы сказать, что это простой метод удобства без каких-либо других отличий. Здесь явно есть разница.
нет проблем с производительностью? CyprUS

Похожие вопросы