Форум: "Основная";
Текущий архив: 2005.07.18;
Скачать: [xml.tar.bz2];
ВнизКак быстро выводить 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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.038 c