Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.10.21;
Скачать: [xml.tar.bz2];

Вниз

Как заблокировать 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.053 c
1-1185870724
Dmitry_177
2007-07-31 12:32
2007.10.21
PageControl переключение по условию


15-1190705543
Неместный
2007-09-25 11:32
2007.10.21
Delphi 7 SE и ODAC 6.10


15-1187779146
Сергей М.
2007-08-22 14:39
2007.10.21
Помощь экстрасенса


4-1177393309
AlexEgorov
2007-04-24 09:41
2007.10.21
Межпотоковое взаимодействие: есть поток, который при


2-1190886488
Nikfel
2007-09-27 13:48
2007.10.21
Список файлов и папок.





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