![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с 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]>При удалении делаю так, а при добавлении код :
Лучше скажи в обработчиках каких событий этот код?