Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как заблокировать TreeView?


Страницы:   1 2

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо