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