Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как быстро выводить ChildItems из TreeView в ListView [D6, NT4, Win2k, WinXP]


AbrosimovA ©   (2005-07-01 14:11:00) 

К примеру, выбираю какой-нибудь из элементов(узлов) дерева 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 17:58:00) [1]

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

Stakan, да оно.


Digitman   (2005-07-01 15:17:00) [2]


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


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


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


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

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


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


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


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


Digitman   (2005-07-01 14:35:00) [5]


> AbrosimovA   (01.07.05 14:31) [4]


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

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

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


Stakan   (2005-07-01 14:34:00) [6]

Что то вроде того?
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;


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


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


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


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


> malamba   (01.07.05 14:21) [1]


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


Digitman   (2005-07-01 14:26:00) [9]

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


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

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

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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо