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

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

Проблема с TreeView [D6, Win2k]


dream ©   (2004-12-03 10:18:00) 

В общем имееться treeview с несколькими тесячами записей ... но подгрупп в нём всего 1 категория т.е

--- группа 1
---- подгруппа 1
---- подгруппа 2
---- подгруппа 3
--- Группа 2
---- подгруппа 1
---- подгруппа 2
---- подгруппа 3  

В чём проблема : нужно чтобы при нажатии на группу из базы брались подгруппы и вставлялись на свой место а при закрытии группы опять удалялись ( т.е оставались видимыми только названия групп )

При удалении делаю так :

if treeview1.Selected.Level <> 0 then exit;

for n:=1 to treeview1.Selected.Count do begin
if treeview1.Selected.Count > 0 then
TreeView1.Items[1].Delete;
end;

а при добавлении код :

if treeview1.Selected.Level <> 0 then exit;

nodemain:= TreeView1.Selected;

for n:=1 to treeview1.Selected.Count do begin
if treeview1.Selected.Count > 0 then
TreeView1.Items[1].Delete;
end;

if ADO_group.Locate('Description',TreeView1.Selected.Text ,[locaseinsensitive])  = true then begin

for i := 1 to ADO_subGroup.RecordCount do begin
ADO_subGroup.RecNo:=i;
if ADO_subGroup.fieldbyname('IDGroup').AsString = ADO_group.fieldbyname('IDGroup').AsString then
nodenew:=TreeView1.Items.AddChild (nodemain,ADO_subGroup.fieldbyname('Description').AsString);
end;
end;

Работает через раз , иногда удаляет сами группы а не подгруппы ... ужа запарился что не так в коде ? Подскажите пожалуйста


ЮЮ   (2004-12-06 05:46:00) [1]

Как, скажи, можно распахнуть узел, если у него нет детей? Вот я и предлагаю при создании "группы" вставлять Dummy "подгруппу", которая все-равно при распахивании будет уничтожена. Аналогично, после удаления всех "подгрупп" при сворачивании "группы" добавить туда же  Dummy "подгруппу".


dream   (2004-12-03 13:19:00) [2]

Как раз и нужно удалять... чтобы не тормозить процесс.. там могут содержаться несколькко тыс записей.

а отследить нажатие некак нельзя ?


ЮЮ   (2004-12-03 12:25:00) [3]

>а то при двойном щелчке работает а при нажатии на развернуть не работет

А как он может работать, если после сворачивания ты всех детей удалил? Оставляй хотя бы одного :) Или вообще не трогай: у тебя же в коде на открытие всё равно стоит сначала удаление


dream   (2004-12-03 12:13:00) [4]

Ну да я просто не так выразился , написал перебор а установку позиции как раз и не написал.

Слушай ты не знаешь случайно как отследить нажатие на крестик ( развернуть ) а то при двойном щелчке работает а при нажатии на развернуть не работет


ЮЮ   (2004-12-03 11:49:00) [5]

Тогда уж, возврат в начало списка, точнее, позиционирование в списке, это как раз ADO_subGroup.RecNo:=i;, которое я сразу не приметил.


dream   (2004-12-03 11:34:00) [6]

Так работает без проблем , а при  ADO_subGroup.Next; скорость навигации по базе ухудшаеться в несколько раз.

Возврат в начало списка это как раз
for i := 1 to ADO_subGroup.RecordCount do begin


ЮЮ   (2004-12-03 11:01:00) [7]

Если ADO_group и ADO_subGroup и связаны как Master-Detail, то проверка

if ADO_subGroup.fieldbyname('IDGroup').AsString = ADO_group.fieldbyname('IDGroup').AsString then

просто лишняя, если, нет, то нет возврата к началу НД
Цикл организован неправильно, надо
 ADO_subGroup.First;
 while not ADO_subGroup.EOF do begin
 ...
   ADO_subGroup.Next;
 end;


dream   (2004-12-03 10:59:00) [8]

Спасибо ! Получилось ... я просто ещё толком не знаком с этим компонентом по этому и запутался.


ЮЮ   (2004-12-03 10:54:00) [9]

for n:=1 to treeview1.Selected.Count do begin
if treeview1.Selected.Count > 0 then
TreeView1.Items[1].Delete;
end;

Во-первых, индекс в Items изменяется от 0 до Items.Count - 1.
Во-вторых, после TreeView1.Items[1].Delete будет удален 2 элемент списка ВСЕГО ДЕРЕВА со всеми своими детьми. Зачем всё это ещё и в цикле делать, тем более, зависящего от Selected?

for n := treeview1.Selected.Count - 1 downto 0 do
  treeview1.Selected.Item[n].Delete


dream   (2004-12-03 10:39:00) [10]

Добавление : TreeView1DblClick

Удаление : Collapsing


ЮЮ   (2004-12-03 10:31:00) [11]

>При удалении делаю так, а при добавлении код :

Лучше скажи в обработчиках каких событий этот код?


Наверх

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