Главная страница
    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.46 MB
Время: 0.037 c
6-1113373266
Slym
2005-04-13 10:21
2005.07.18
Формат GZip где я не прав?


1-1120383780
Ilg
2005-07-03 13:43
2005.07.18
Вкладки PageControl


1-1120317333
Brack
2005-07-02 19:15
2005.07.18
Как програмно вывести N обьектов


1-1120146335
Belkova
2005-06-30 19:45
2005.07.18
Разрешение экрана


1-1119895324
Demonix
2005-06-27 22:02
2005.07.18
Обработка одного файла, создание другого на его основе.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский