![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как заблокировать TreeView?
Kolan © (2007-09-27 11:38:00)Здравствуйте,
При добавлении Items TreeView сразу их отображает Хотелось бы сделать следующее:
Заблокировать TreeView
Добавить элементы
Разблокировать TreeView после этого все элементы появились сразу.
Kolan (2007-09-27 15:07:00) [1]Все, сам дурак. Разобрался. :)
Ega32 и Сергей М., благодарю за подробные разъяснения. :)
Kolan (2007-09-27 14:53:00) [2]Сделал так:
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 14:30:00) [3]> Убери нафих автосортировку
Ага, шас попробую
Сергей М. (2007-09-27 14:19:00) [4]
> Я не инициирую, оно само…
Убери нафих автосортировку и после любого изменения в дереве вызывай TreeNode.CustomSort(nil)
Kolan (2007-09-27 14:15:00) [5]> И вообще, для какого объекта и каким образом ты инициируешь
> сортировку узлов ?
Я не инициирую, оно само
> Чему верить ?)
Еще в [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:10:00) [6]И вообще, для какого объекта и каким образом ты инициируешь сортировку узлов ?
Я к тому, что, к примеру, метод CustomSort есть как у TTreeView, так и у TTreeNodes, и ведут они себя, мягко говоря, по-разному ...
Сергей М. (2007-09-27 14:08:00) [7]Сначала ты утверждал, что
> OnCompare срабатывает
Теперь же
> оно не возбуждается нифига
Чему верить ?)
Kolan (2007-09-27 14:02:00) [8]> Где ты там видишь хоть какие-либо комментарии по поводу
> невозбуждения события для корневых узлов ?
Ладно, дык я точку ставлю и оно не возбуждается нифига Так реально происходит, из-за чего незнаю (Про Parant=nil предположение было).
Как понять из-за чего не возбуждается?
Сергей М. (2007-09-27 13:57:00) [9]
> как я понял такого, чтобы были переданы НаСравнениеКорневыеУзлы
> не случается
Вот цитата из справки к OnCompare:
Occurs when two nodes must be compared during a sort of the nodes in the tree view
Где ты там видишь хоть какие-либо комментарии по поводу невозбуждения события для корневых узлов ?
Kolan (2007-09-27 13:49:00) [10]> достаточно проверить истинность условия
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:40:00) [11]
> Как-то же их(верхние узлы) можно сравнить
Параметрами Item1, Item2 в обработчик OnCompare всегдапередаются узлы одного и того же узла-родителя, поэтому для проверки, что в тек.момент сравниваются два каких-то корневых узла, достаточно проверить истинность условияnot Assigned(Node1.Parent)
> Дочерние меня не интересуют
Тогда правильным будет сделать так:
if ПереданыНаСравнениеКорневыеУзлы then
Compare := .. результат их сравнения юю
else
Compare := 0;
end;
Kolan (2007-09-27 13:16:00) [12]> твоя логика сравнения двух дочерних узлов одного и того
> же родителя
Дочерние меня не интересуют(они и так отсортированы) мне надо отсортировать верхние
Kolan (2007-09-27 13:13:00) [13]> К тому же с какого перепугу будут сравниваться узлы, принадлежащие разным родителям
Ну а как из:
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
Сергей М. (2007-09-27 12:38:00) [14]
> {Если данные = 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 12:29:00) [15]> [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:28:00) [16]Показывай, что у тебя творится в обработчике OnCompare ..
Kolan (2007-09-27 12:26:00) [17]
> А св-во Data узлов твоего дерева ты назначил, прежде чем
> сортировать ?
У головных нет, и не могу назначит Оно в другом месте нужно nil
Kolan (2007-09-27 12:26:00) [18]Для дерева:
1
2
3
Срабатывает 4 раза.
Может вот в чем дело:
у дерева:
1
1.1
1.2
2
2.2
Только вложеные ноды имеют Data nil
В у
1
2
3
Data назначена у всех
Пробовал ставить тип сортировки stText, но тогда событие вообще не случается
Сергей М. (2007-09-27 12:25:00) [19]
> отладчиком смотрю
Т.е. это событие у тебя возникает всего один раз ?
Чудеса в решете)
> SortTyp = stBoth
А св-во Data узлов твоего дерева ты назначил, прежде чем сортировать ?
Kolan (2007-09-27 12:19:00) [20]SortTyp = stBoth