![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как быстро выводить 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)