Главная страница
    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.47 MB
Время: 0.04 c
3-1118158793
Alex Romanskiy
2005-06-07 19:39
2005.07.18
Вставка в две таблицы с помощью IBDataSet.


6-1113119643
DimDim
2005-04-10 11:54
2005.07.18
Системный каталог на соседнем компьютере?


3-1117696945
ike
2005-06-02 11:22
2005.07.18
ADO - Access - Как получить значение сгенеренного ID - counter


4-1116747561
psa247
2005-05-22 11:39
2005.07.18
FAT | NTFS ?


3-1118187806
Dorian
2005-06-08 03:43
2005.07.18
Как программно перебирать значения в DBGrid?





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