Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-83202
Луарвик
2004-01-14 13:50
2004.01.26
Копирование файлов из буфера обмена


1-83158
pserg
2004-01-14 23:58
2004.01.26
Поиск фрагмента текста в файлах MSWord


14-83276
Думкин
2004-01-05 06:30
2004.01.26
С днем рождения! 5 января.


14-83243
kostyan
2004-01-06 08:03
2004.01.26
Реестр


1-83143
Пубертанец
2004-01-15 12:20
2004.01.26
bpl вместо dll





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