Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.04 c
5-1090775623
crizis
2004-07-25 21:13
2005.07.18
событие MouseMove


1-1119688041
syte_ser78
2005-06-25 12:27
2005.07.18
Label по центру


8-1111307719
seregka
2005-03-20 11:35
2005.07.18
Преобразование в ч/б


5-1090683370
Yaral
2004-07-24 19:36
2005.07.18
Наследование форм


3-1114412379
Суслик
2005-04-25 10:59
2005.07.18
ms sql enterpise manager





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский