Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.07.18;
Скачать: CL | DM;

Вниз

Как быстро выводить ChildItems из TreeView в ListView   Найти похожие ветки 

 
AbrosimovA   (2005-07-01 14:11) [0]

К примеру, выбираю какой-нибудь из элементов(узлов) дерева TreeView, тут же в ListView добавляются (если Selected.HasChildren истинно) элементы, находящиеся чуть ниже его, но на одном уровне(Level) с ним.


SelNode:=TreeView.Selected;
if SelNode.HasChildren then
for i:=0 to SelNode.Count-1 do begin
 ListView.AddItem(SelNode.Item[i].Text,nil);
 ListView.Items.Item[i].ImageIndex:=SelNode.Item[i].ImageIndex
end;


Всё замечательно работает, пока Child"ов немного, а уж если их наберётся сотни-полторы, то программа виснет надолго.
В программе Iconics OPC DataSpy аналогичная операция происходит в мгновение ока даже при большом количестве элементов.
Как всё-таки реализовать быстрый вывод из TreeView в Listview?
Спасибо.


 
malamba   (2005-07-01 14:21) [1]

Перебор занимает долгое время.

Где-то ( под рукой нет сейчас кода) видел как проход по узлам организован по другому. Там нет  SelNode.Item[i], а есть метод Next и на каждом проходе SelNode меняется на следующий.

Я сам метод такой использую, вроде бы быстро как раз на таком числе записей ( что-то около 150-200)


 
Digitman ©   (2005-07-01 14:26) [2]

with ListView.Items do
begin
BeginUpdate;
try
  Clear;
  for ... to ... do begin
   lvitem := Add(..);
   ..
  end;
finally
  EndUpdate;
end;
end;


 
AbrosimovA   (2005-07-01 14:28) [3]


> malamba   (01.07.05 14:21) [1]


Я правильно вас понял, что
SelNode.Item[i] медленнее работает, чем Next?


 
AbrosimovA   (2005-07-01 14:31) [4]


> Digitman ©   (01.07.05 14:26) [2]


Насколько я знаю, BeginUpdate отключает обновление ListView,
но на скорость вывода существенно не влияет - это уже пробовалось.


 
Stakan ©   (2005-07-01 14:34) [5]

Что то вроде того?
procedure TForm1.Button1Click(Sender: TObject);
var
 TempNode: TTreeNode;
 LVItem: TListItem;
begin
 TempNode := TreeView1.Selected.getFirstChild;
 while TempNode <> nil do
 begin
   LVItem := ListView1.Items.Add;
   LVItem.Caption := TempNode.Text;
   TempNode := TempNode.getNextSibling;
 end;
end;


 
Digitman ©   (2005-07-01 14:35) [6]


> AbrosimovA   (01.07.05 14:31) [4]


на 100 ..150 элементах это может быть и незаметно, но на тысячах - десятках тысяч разница во времени будет на порядки !

т.е. кроме прочих узких мест в твоем алгоритме (см. [3]) неиспользование Begin/EndUpdate - это еще одно узкое место

и, коль уж ты завел речь об оптимизации, будь любезен для начала эффективно использовать with-оператор


 
AbrosimovA   (2005-07-01 14:43) [7]


> Digitman ©   (01.07.05 14:35) [6]


Насчёт оптимизации я ни словом не обмолвился.
А за пример - большое спасибо.


 
AbrosimovA   (2005-07-01 15:08) [8]

Благодаря примеру
> Stakan ©   (01.07.05 14:34) [5]
проблема решена. Спасибо всем откликнувшимся.


 
Digitman ©   (2005-07-01 15:17) [9]


> Насчёт оптимизации я ни словом не обмолвился


> Как всё-таки реализовать быстрый вывод


это и есть "оптимизация алгоритма" ..


 
malamba   (2005-07-01 17:58) [10]

Я затормозил и пришел к шапочному разбору.

Stakan, да оно.



Страницы: 1 вся ветка

Текущий архив: 2005.07.18;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.04 c
5-1089905607
ed30
2004-07-15 19:33
2005.07.18
Составной компонент со списком.


1-1119620507
AlexG
2005-06-24 17:41
2005.07.18
TOleContainer, Frame &amp; frame s copy


3-1118306473
sapsi
2005-06-09 12:41
2005.07.18
Фильтры в БД Аксесс


14-1119956998
Knight
2005-06-28 15:09
2005.07.18
Кто бесплатно отправлял факсы через инет?


14-1119904045
BigMac
2005-06-28 00:27
2005.07.18
Forex