Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Оптимизация TListview


Автор: Ak47black 19.4.2007, 14:45
Как оптимизировать добавление и смену данных показываемых в TListView что-бы небыло мигания.  smile 
У меня следуший код
Код

procedure TUserFrame.FillOperations;
var
  i: Integer;
begin
  OperationsList.Clear;
  for i:=0 to Length(TransferModele.TransferingOperations)-1 do
  begin
    with OperationsList.Items.Add do
    begin
      Caption:= TransferModele.TransferingOperations[i].Name;
      SubItems.Add(IntToStr(TransferModele.TransferingOperations[i].Size));
      SubItems.Add(TransferModele.TransferingOperations[i].Source);
      SubItems.Add(TransferModele.TransferingOperations[i].Destination);
      SubItems.Add(TransferModele.TransferingOperations[i].Status);
      SubItems.Add(TransferModele.TransferingOperations[i].AverangeSpeed);
      SubItems.Add(TransferModele.TransferingOperations[i].CurrentSpeed);
      SubItems.Add(TransferModele.TransferingOperations[i].Elapsed);
      SubItems.Add(TransferModele.TransferingOperations[i].Left);
      if TransferModele.TransferingOperations[i].TransferingTape = tfDownload then
        ImageIndex:=0 else ImageIndex:=1;
    end;
  end;
end;

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

OnDataHint 
OnDataFind 
OnDataStateChange

Только как с ними работать я особо большой инфы ненаходил.

Автор: Sunvas 19.4.2007, 14:56
А поставить doublebuffered формы в true пробовал?

Автор: Rennigth 19.4.2007, 14:56
Ak47black, 
А 
Код
  
  ListView.Items.BeginUpdate
  ListView.Items.EndUpdate


Пробовал?

Автор: Ak47black 19.4.2007, 15:00
Цитата

А поставить doublebuffered формы в true пробовал? 

Цитата

Код

  ListView.Items.BeginUpdate
  ListView.Items.EndUpdate


Пробовал оба но не помогают.

Добавлено через 1 минуту и 8 секунд
У меня элементов может быть очень много например 50000 так что тут надо 
с 
Цитата

OnDataHint 
OnDataFind 
OnDataStateChange

Както связать.

Автор: Rennigth 19.4.2007, 15:07
Ak47black, Тебе данные надо хранить отдельно, а показывать только нужные.

Автор: Yanis 19.4.2007, 15:10
Может быть Virtual Tree View?!

Автор: Ak47black 19.4.2007, 15:14
Yanis, да я чтото там похожее вижу в Virtual List view примере только как тут переделать то.
Цитата

Ak47black, Тебе данные надо хранить отдельно, а показывать только нужные.

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

Автор: MetalFan 19.4.2007, 15:56
Код

LockWindowUpdate( lvw.Handle );
........
LockWindowUpdate( 0 );


Автор: Rennigth 19.4.2007, 16:02
MetalFan,  Это конечно поможет, но этож глобальный Lock, на лючном опыте знаю что его снимает тот-же winamp. Лутше уж юзать 
примерно такую штуку:
Код

procedure BeginWindowUpdate(hWnd: DWORD);
begin
  SendMessage(hWnd, WM_SETREDRAW, 0, 0);
end;

procedure EndWindowUpdate(hWnd: DWORD);
begin
  SendMessage(hWnd, WM_SETREDRAW, 1, 0);
  RedrawWindow(hWnd, nil, 0, RDW_FRAME + RDW_INVALIDATE + 
    RDW_ALLCHILDREN + RDW_NOINTERNALPAINT);
end;

Автор: Ak47black 19.4.2007, 16:12
А что 
Цитата

OnDataHint 
OnDataFind 
OnDataStateChange

Такие события некто неюзал?
Или я чтото туплю?

Автор: Beltar 20.4.2007, 07:40
50000 узлов слишком много. Windows Explorer тормомозит при 1000 файлов в папке. Заполнение ListView 4609 узлами (отображение содержимого ветки TreeView) у меня заняло 2-3 секунды на Celeron 950.

Цитата

OnDataHint


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

Автор: dumb 20.4.2007, 11:47
Цитата(Beltar @  20.4.2007,  07:40 Найти цитируемый пост)
Я не юзал, но ставлю рубль, что это событие всплытия подсказки. Причем оно здесь?? 

гони рубель! smile

[quote:F1]
Use OnDataHint to update a range of items before the OnData event occurs. This method of updating items is more efficient than individually updating items in the OnData event handler. The range of items specified in the OnDataHint does not always match the range of items for which the OnData event handler is called; therefore, you must be prepared to update individual items in the OnData event handler as well.
[/quote]

[quote=Beltar, 20.4.2007,  07:40, post1105725]50000 узлов слишком много. Windows Explorer тормомозит при 1000 файлов в папке. Заполнение ListView 4609 узлами (отображение содержимого ветки TreeView) у меня заняло 2-3 секунды на Celeron 950.[/quote]
вот именно поэтому и используются OnData*. в случае работы с OnData* 50000 - это "тьпу". а в Explorer'е тормоза связаны с другим моментом - он вытаскивает инфу(ищет связанную иконку, напр.) из каждого файла, потому и тормозит.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)