Форум: "Начинающим";
Текущий архив: 2007.10.21;
Скачать: [xml.tar.bz2];
ВнизКак заблокировать TreeView? Найти похожие ветки
← →
Kolan © (2007-09-27 11:38) [0]Здравствуйте,
При добавлении Items TreeView сразу их отображает… Хотелось бы сделать следующее:
Заблокировать TreeView
Добавить элементы
Разблокировать TreeView — после этого все элементы появились сразу.
← →
Сергей М. © (2007-09-27 11:41) [1]см. TTreeNodes.Begin/EndUpdate
← →
Ega23 © (2007-09-27 11:41) [2]
TreeView.Items.BeginUpdate;
try
......
finally
TreeView.Items.EndUpdate;
end;
← →
Kolan © (2007-09-27 12:09) [3]> TreeView.Items.BeginUpdate;
Угу.
А я сразу сюда спрошу, чтобы не плодить темы…
У меня есть дерево:2
2.2
1
1.1
1.2
И я его хочу отсортировать. Так вот OnCompare срабатывает только для (1.1 и 1.2). Почему оно не срабатывет дял 1 и 2?
В итоге должно быть так:1
1.1
1.2
2
2.2
← →
Kolan © (2007-09-27 12:11) [4]
> TreeView.Items.BeginUpdate;
> try
> …
> finally
> TreeView.Items.EndUpdate;
> end;
Ооо, вот наконец не моргает :)
← →
Сергей М. © (2007-09-27 12:17) [5]
> OnCompare срабатывает только для (1.1 и 1.2)
С чего ты это взял ?
← →
Kolan © (2007-09-27 12:18) [6]> С чего ты это взял ?
Ну отладчиком смотрю.
← →
Kolan © (2007-09-27 12:19) [7]SortTyp = stBoth
← →
Сергей М. © (2007-09-27 12:25) [8]
> отладчиком смотрю
Т.е. это событие у тебя возникает всего один раз ?
Чудеса в решете)
> SortTyp = stBoth
А св-во Data узлов твоего дерева ты назначил, прежде чем сортировать ?
← →
Kolan © (2007-09-27 12:26) [9]Для дерева:
1
2
3
Срабатывает 4 раза.
Может вот в чем дело:
у дерева:
1
1.1
1.2
2
2.2
Только вложеные ноды имеют Data <> nil
В у
1
2
3
Data назначена у всех…
Пробовал ставить тип сортировки stText, но тогда событие вообще не случается…
← →
Kolan © (2007-09-27 12:26) [10]
> А св-во Data узлов твоего дерева ты назначил, прежде чем
> сортировать ?
У головных нет, и не могу назначит… Оно в другом месте нужно nil…
← →
Сергей М. © (2007-09-27 12:28) [11]Показывай, что у тебя творится в обработчике OnCompare ..
← →
Kolan © (2007-09-27 12:29) [12]> [11] Сергей М. © (27.09.07 12:28)
> Показывай, что у тебя творится в обработчике OnCompare …
Дело не в том что творится, дело в том что он не стреляет для нодов БЕЗ Data, видимо…procedure TDateTimeViewer.CompareTreeItems(Sender: TObject; Node1,
Node2: TTreeNode; Data: Integer; var Compare: Integer);
var
Node1Date, Node2Date: TDateTime;
begin
inherited;
{Если данные = nil, значит это head нод.}
if (not Assigned(Node1.Data) and (not Assigned(Node2.Data))) then
begin
if TryStrToDate(Node1.Text, Node1Date)
and TryStrToDate(Node2.Text, Node2Date)
then
begin
Compare := CompareDate(Node1Date, Node1Date);
end
else
if Node1.Text = rsToday then
Compare := 1;
if (Node2.Text = rsYesterday) and (Node1.Text <> rsToday) then
Compare := —1;
end;
end;
← →
Сергей М. © (2007-09-27 12:38) [13]
> {Если данные = nil, значит это head нод.}
У корневых узлов Parent = nil, зачем для этого анализировать пользовательские данные ?
К тому же с какого перепугу будут сравниваться узлы, принадлежащие разным родителям ?
Достаточной будет проверка:if not Assigned(Node1.Parent) then begin
.. твоя логика сравнения двух дочерних узлов одного и того же родителя ...
end;
> if Node1.Text = rsToday then
> Compare := 1;
> if (Node2.Text = rsYesterday) and (Node1.Text <> rsToday)
> then
> Compare := —1;
Вот это поясни...
← →
Kolan © (2007-09-27 13:13) [14]> К тому же с какого перепугу будут сравниваться узлы, принадлежащие разным родителям
Ну а как из:
2
2.2
1
1.1
1.2
сделать:1
1.1
1.2
2
2.2
Как-то же их(верхние узлы) можно сравнить…
> Вот это поясни…
Да это все не важно… Там в названиях даты. Кроме того я проверяю даты и пишу «Сегодня», «Вчера» если надо.
Получится должно:
Сегодня
1
2
Вчера
1
2
3
01.09.2007
1
← →
Kolan © (2007-09-27 13:16) [15]> … твоя логика сравнения двух дочерних узлов одного и того
> же родителя …
Дочерние меня не интересуют(они и так отсортированы) мне надо отсортировать верхние…
← →
Сергей М. © (2007-09-27 13:40) [16]
> Как-то же их(верхние узлы) можно сравнить
Параметрами Item1, Item2 в обработчик OnCompare всегда передаются узлы одного и того же узла-родителя, поэтому для проверки, что в тек.момент сравниваются два каких-то корневых узла, достаточно проверить истинность условияnot Assigned(Node1.Parent)
> Дочерние меня не интересуют
Тогда правильным будет сделать так:
if ПереданыНаСравнениеКорневыеУзлы then
Compare := .. результат их сравнения юю
else
Compare := 0;
end;
← →
Kolan © (2007-09-27 13:49) [17]> достаточно проверить истинность условия
not Assigned(Node1.Parent)
Вместоif (not Assigned(Node1.Data) and (not Assigned(Node2.Data))) then
Ладно, хорошо, буду знать, но! Я не возьму в толок зачем это все если до этих строк дело не доходит.
Событие возникает для тех нодов у которых есть родитель, а для тех, которые мне надо сравнить оно не возникает, так как у них Parent = nil.
--------if ПереданыНаСравнениеКорневыеУзлы then
Compare := … результат их сравнения юю
else
Compare := 0;
end;
То есть как я понял такого, чтобы были переданы НаСравнениеКорневыеУзлы не случается.
← →
Сергей М. © (2007-09-27 13:57) [18]
> как я понял такого, чтобы были переданы НаСравнениеКорневыеУзлы
> не случается
Вот цитата из справки к OnCompare:
Occurs when two nodes must be compared during a sort of the nodes in the tree view
Где ты там видишь хоть какие-либо комментарии по поводу невозбуждения события для корневых узлов ?
← →
Kolan © (2007-09-27 14:02) [19]> Где ты там видишь хоть какие-либо комментарии по поводу
> невозбуждения события для корневых узлов ?
Ладно, дык я точку ставлю и оно не возбуждается нифига… Так реально происходит, из-за чего — незнаю…(Про Parant=nil — предположение было).
Как понять из-за чего не возбуждается?
← →
Сергей М. © (2007-09-27 14:08) [20]Сначала ты утверждал, что
> OnCompare срабатывает
Теперь же
> оно не возбуждается нифига
Чему верить ?)
← →
Сергей М. © (2007-09-27 14:10) [21]И вообще, для какого объекта и каким образом ты инициируешь сортировку узлов ?
Я к тому, что, к примеру, метод CustomSort есть как у TTreeView, так и у TTreeNodes, и ведут они себя, мягко говоря, по-разному ...
← →
Kolan © (2007-09-27 14:15) [22]> И вообще, для какого объекта и каким образом ты инициируешь
> сортировку узлов ?
Я не инициирую, оно само…
> Чему верить ?)
Еще в [3] Kolan © (27.09.07 12:09) я говорил что событие стреляет только для вложеных узлов…
Щас подумал, скорее всего дело таки в том есть Data или нет(nil)…
Так как у дерева2 nil
2.2 Data
1 nil
1.1 Data
1.2 Data
Срабатывает событие только для 1.1 и 1.2.
А для дерева1 Data
2 Data
3 Data
Четыре раза срабатывает(то есть для всех)…
← →
Сергей М. © (2007-09-27 14:19) [23]
> Я не инициирую, оно само…
Убери нафих автосортировку и после любого изменения в дереве вызывай TreeNode.CustomSort(nil)
← →
Kolan © (2007-09-27 14:30) [24]> Убери нафих автосортировку
Ага, шас попробую…
← →
Kolan © (2007-09-27 14:53) [25]Сделал так:
FTreeView.CustomSort(nil, 0);
Правильно?
Работает…
…Там у меня разные деревья…
Вот если head ноды фамилии например, то сортируется верно… А вот с этой датой — невыходит…
ноды такие "01.09.2007", "07.09.2007", "Вчера"
Алгоитм такой:procedure TCardsView.Update(ASubject: TCustomDomainObject);
begin
inherited;
//ShowMessage(Self.ClassName+": "+ASubject.ClassName);
if ASubject is TPackage then
begin
FAllowChage := False;
FTreeView.Items.BeginUpdate;
try
FCardsListViewer.ViewCardsListAsList(FTreeView, (ASubject as TPackage).CardsList);
FTreeView.CustomSort(nil, 0);
finally
FTreeView.Items.EndUpdate;
FAllowChage := True;
end;
end;
end;
Должно вроде получитсяВчера
01.09.2007
07.09.2007
А получается …
01.09.2007
07.09.2007
Вчера
Странно, я же говорю ему(когда он сравнивает "Вчера" и "07.09.2007"), что вчера больше:if (Node1.Text = rsYesterday) and (Node2.Text <> rsToday) then
Compare := 1;
А в итоге оно ниже…
← →
Kolan © (2007-09-27 15:07) [26]Все, сам дурак. Разобрался. :)
Ega32 и Сергей М., благодарю за подробные разъяснения. :)
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.10.21;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.04 c