Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.01.26;
Скачать: CL | DM;

Вниз

Ошибка очистки TreeView   Найти похожие ветки 

 
iosafat ©   (2004-01-15 10:34) [0]

Здравствуйте! Такая проблема (ожидал чего угодно но только не этого). Не могу мгновенно очистить дерево (TreeView). Когда вызываю процедуру TreeView.Items.Clear, то вместо мгновенной очистки вижу, как удаляется каждый узел, начиная с верхнего. И такой процесс длится более минуты (в дереве более сотни узлов). Ясное дело, что здесь что-то не то. Помогите, кто может!


 
MBo ©   (2004-01-15 10:36) [1]

items.beginupdate


 
NAlexey ©   (2004-01-15 10:37) [2]

Удаляй и создавай экранный элемент. Используй BeginUpdate EndUpdate.


 
Skier ©   (2004-01-15 10:45) [3]

Вроде уже всё есть. :)

procedure TTreeNodes.Clear;
var
LHandleAllocated: Boolean;
begin
LHandleAllocated := Owner.HandleAllocated;
if LHandleAllocated then
BeginUpdate;
try
ClearCache;
if Owner.HandleAllocated then
TreeView_DeleteAllItems(Owner.Handle);
finally
if LHandleAllocated then
EndUpdate;
end;
end;


 
YuRock ©   (2004-01-15 10:55) [4]

Попробуйте вот что:

SendMessage(TreeView.Handle, WM_SETREDRAW, 0, 0);
TreeView.Items.Clear;
SendMessage(TreeView.Handle, WM_SETREDRAW, 1, 0);
InvalidateRect(TreeView.Handle, nil, True);


 
Sandman25 ©   (2004-01-15 10:58) [5]

Еще можно попробовать LockWindowUpdate(TreeView.Handle)


 
NAlexey ©   (2004-01-15 11:19) [6]

>Skier ©
Парадокс. Пускай попробует и скажет, есть или нет?


 
iosafat ©   (2004-01-15 11:22) [7]

Спасибо за внимание к моей проблеме, но к сожалению все предложенные варианты ее решения не работают.

Не все так просто! Хочу пояснить, что очистка дерева мне нужна для того, чтобы загрузить в него из текстового файла другое ранее (динамически) сформированное дерево. Мой TreeView синхронизирован с выпадающими списками ComboBox. То есть то, что я выбираю в TreeView, дублируется в выпадающих списках и наоборот. Так вот, выполняя items.beginupdate и др., очистка то происходит, но в выпадающих списках я вижу, как перебираются их пункты с первого и до последнего. Это означает, что и items.beginupdate не очищает TreeView мгновенно. То есть проблема остается. Я не могу понять, почему во время очистки сохраняется связь (синхронизация) с выпадающими списками. Ведь сама процедура очистки TreeView.Items.Clear располагается в коде программы перед процедурой синхронизации TreeView с выпадающими списками. То есть по логике сперва дерево должно полностью очищаться (как Memo или как ListBox), затем в него загружается из текстового файла уже заранее сформированное дерево (TreeView.LoadFromFile), затем происходит автоматический выбор нужного узла дерева, и только затем синхронизация с выпадающими списками. Но в реале синхронизация происходит и во время очистки дерева. Как устранить этот бредовый, надо сказать совсем неожиданный, эффект?


 
Skier ©   (2004-01-15 11:25) [8]


> Мой TreeView синхронизирован с выпадающими списками ComboBox

То есть как ?
Не "завязано" ли TreeView (потомок) на работу с базой данных ?


 
iosafat ©   (2004-01-15 11:53) [9]

>Не "завязано" ли TreeView (потомок) на работу с базой данных ?

В принципе "завязано". Скорее "завязаны" выпадающие списки. Но так как TreeView в свою очередь связан с выпадающими списками, то он также оказывается "завязанным".

При выборе пунктов в выпадающих списках происходит загрузка данных из файла в память. Затем в памяти осуществляется поиск нужной информации и вывод ее в RichEdit. Так как TreeView синхронизирован с выпадающими списками (узлы в TreeView - это пункты выпадающих списков), то при выборе его узлов происходит то же самое, то есть загрузка данных из файла в память и т.д...

Вот фрагмент кода синхронизации:

if DrevovidnoePredstavlenieModuleyKnig.Selected.HasChildren then
begin
VypadayuschiySpisokMaterialovModuleyKnig.ItemIndex :=
VypadayuschiySpisokMaterialovModuleyKnig.Items.IndexOf
(DrevovidnoePredstavlenieModuleyKnig.Selected.Text);
VypadayuschiySpisokMaterialovModuleyKnigChange(GlavnoeOknoProgrammy);
end else...


 
Ломброзо ©   (2004-01-15 12:03) [10]

>Skier © (15.01.04 10:45)
Так делать не рекомендуется, если на узел повешен указатель, OnDeletion не возникает -> утечка памяти.

>iosafat © (15.01.04 11:53) [9]
Предаврительно обнилить все обработчики событий


 
Семен Сорокин ©   (2004-01-15 12:04) [11]

>DrevovidnoePredstavlenieModuleyKnig
Супер
может на время очистки делать TreeView.OnChange := nil; (или на что у тебя там заполняется комбо)


 
NAlexey ©   (2004-01-15 12:07) [12]

if DrevovidnoePredstavlenieModuleyKnig.Selected.HasChildren then

VotEtoNifigaSebeNazvania_AMyTutSoSvoimiSovetami.


 
MV   (2004-01-15 12:23) [13]

Да! Очень Большое Дерево TTreeView тормозит при создании/удалении узлов.
Перешел на семейство TVirtualTreeView - и все проблемы пропали!

Там для скорости доже свой менеджер памяти при создании/удалении узлов имеется.

Оч-чень рекомендую!


 
iosafat ©   (2004-01-15 12:27) [14]

Ну а как обратно "включить" обработчики событий после присвоения им nil?


 
Семен Сорокин ©   (2004-01-15 12:29) [15]

TreeView.OnChange := nil;
try
....
finally
TreeView.OnChange := TreeViewChange
end;



Страницы: 1 вся ветка

Текущий архив: 2004.01.26;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.011 c
14-83262
passlight
2004-01-05 11:30
2004.01.26
Трудолюбие — это опасный миф


1-83136
LinOS
2004-01-15 08:14
2004.01.26
LogonForm - как вызвать.


14-83252
Хомячок
2004-01-05 13:38
2004.01.26
Характеристика общего и специального программного обеспечения ПК


3-83114
Michail Dalakov
2003-12-28 16:40
2004.01.26
MSSQL и деревья


1-83196
Andersen
2004-01-14 16:17
2004.01.26
Как сделать так, чтобы второе окно не появлялось