Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.10.21;
Скачать: CL | DM;

Вниз

Как заблокировать TreeView?   Найти похожие ветки 

 
Kolan ©   (2007-09-27 11:38) [0]

Здравствуйте,
 При добавлении Items TreeView сразу их отображает&#133 Хотелось бы сделать следующее:

Заблокировать 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;

Угу.

А я сразу сюда спрошу, чтобы не плодить темы&#133

У меня есть дерево:
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
> &#133
> 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 назначена у всех&#133

Пробовал ставить тип сортировки stText, но тогда событие вообще не случается&#133


 
Kolan ©   (2007-09-27 12:26) [10]


> А св-во Data  узлов твоего дерева ты назначил, прежде чем
> сортировать ?

У головных нет, и не могу назначит&#133 Оно в другом месте нужно nil&#133


 
Сергей М. ©   (2007-09-27 12:28) [11]

Показывай, что у тебя творится в обработчике OnCompare ..


 
Kolan ©   (2007-09-27 12:29) [12]

> [11] Сергей М. ©   (27.09.07 12:28)
> Показывай, что у тебя творится в обработчике OnCompare &#133

Дело не в том что творится, дело в том что он не стреляет для нодов БЕЗ Data, видимо&#133

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 := &#151;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


Как-то же их(верхние узлы) можно сравнить&#133


> Вот это поясни&#133

Да это все не важно&#133 Там в названиях даты. Кроме того я проверяю даты и пишу &laquo;Сегодня&raquo;, &laquo;Вчера&raquo; если надо.

Получится должно:

Сегодня
 1
 2
Вчера
 1
 2
 3
01.09.2007
 1


 
Kolan ©   (2007-09-27 13:16) [15]

> &#133 твоя логика сравнения двух дочерних узлов одного и того
> же родителя &#133

Дочерние меня не интересуют(они и так отсортированы) мне надо отсортировать верхние&#133


 
Сергей М. ©   (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 := &#133 результат их сравнения юю
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]

> Где ты там видишь хоть какие-либо комментарии по поводу
> невозбуждения события для корневых узлов ?

Ладно, дык я точку ставлю и оно не возбуждается нифига&#133 Так реально происходит, из-за чего &#151; незнаю&#133(Про Parant=nil &#151; предположение было).

Как понять из-за чего не возбуждается?


 
Сергей М. ©   (2007-09-27 14:08) [20]

Сначала ты утверждал, что

> OnCompare срабатывает


Теперь же

> оно не возбуждается нифига


Чему верить ?)


 
Сергей М. ©   (2007-09-27 14:10) [21]

И вообще, для какого объекта и каким образом ты инициируешь сортировку узлов ?

Я к тому, что, к примеру, метод CustomSort есть как у TTreeView, так и у TTreeNodes, и ведут они себя, мягко говоря, по-разному ...


 
Kolan ©   (2007-09-27 14:15) [22]

> И вообще, для какого объекта и каким образом ты инициируешь
> сортировку узлов ?

Я не инициирую, оно само&#133


> Чему верить ?)

Еще в [3] Kolan ©   (27.09.07 12:09) я говорил что событие стреляет только для вложеных узлов&#133

Щас подумал, скорее всего дело таки в том есть Data или нет(nil)&#133  

Так как у дерева

2 nil
2.2 Data
1 nil
1.1 Data
1.2 Data


Срабатывает событие только для 1.1 и 1.2.

А для дерева

1 Data
2 Data
3 Data


Четыре раза срабатывает(то есть для всех)&#133


 
Сергей М. ©   (2007-09-27 14:19) [23]


> Я не инициирую, оно само…


Убери нафих автосортировку и после любого изменения в дереве вызывай TreeNode.CustomSort(nil)


 
Kolan ©   (2007-09-27 14:30) [24]

> Убери нафих автосортировку

Ага, шас попробую&#133


 
Kolan ©   (2007-09-27 14:53) [25]

Сделал так:
FTreeView.CustomSort(nil, 0);
Правильно?

Работает&#133

&#133Там у меня разные деревья&#133

Вот если head ноды фамилии например, то сортируется верно&#133 А вот с этой датой &#151; невыходит&#133

ноды такие "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


А получается &#133


01.09.2007
07.09.2007
Вчера


Странно, я же говорю ему(когда он сравнивает "Вчера" и "07.09.2007"), что вчера больше:
if (Node1.Text = rsYesterday) and (Node2.Text <> rsToday) then
 Compare := 1;


А в итоге оно ниже&#133


 
Kolan ©   (2007-09-27 15:07) [26]

Все, сам дурак. Разобрался. :)

Ega32 и Сергей М., благодарю за подробные разъяснения. :)



Страницы: 1 вся ветка

Текущий архив: 2007.10.21;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.022 c
6-1172175913
NikOracul
2007-02-22 23:25
2007.10.21
Как программно создать модемное соединение с интернетом?


2-1191017226
SveTTT
2007-09-29 02:07
2007.10.21
как вернуть значение из TEdit в TEdit другой формы


15-1190354682
vajo
2007-09-21 10:04
2007.10.21
Vista &amp; XP


2-1191294121
Создатель форм
2007-10-02 07:02
2007.10.21
переключение между MDI Child


15-1190566202
Турбомер
2007-09-23 20:50
2007.10.21
Куда и как обратиться?