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

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

Удаление узла TreeView по абсолютному индексу [D7]


recop ©   (2009-11-26 17:55:00) 

Здравствуйте уважаемые мастера. Есть дерево корневых узлов, например 5 элементов (TreeView1). Выделен четвертый элемент. Необходимо удалить третий элемент. Выделение должно остаться на четвертом, т.е. после удаления на третьем корневом узле.
Корневые узлы с развитой дочерней структурой.

Form1.TreeView1.Items[2].Destroy - удаляет второй дочерний узел первого корневого узла.

Подскажите, пожалуйста, где собака зарыта?


Jeer   (2009-11-30 16:19:00) [1]


> clickmaker ©   (30.11.09 16:14) [17]


А то :) Впрочем, этим никогда и даже не баловался, "идентити". Кышь от меня.
А вот скоко мегабайт занимает Он на диске - мне просто жалко "железо".


clickmaker   (2009-11-30 16:14:00) [2]

> тьфу на вас с вашим ORACLE :))

я слышал, в оракле идентити нет. Ацтой -)


Jeer   (2009-11-30 16:12:00) [3]

Можно, все можно.
Автору поста решать -что и насколько эффективнее, при его конкретной задаче.

P.S.
Я вот, в относительно недавней ветке, тоже объяснял - возникла нестандартная задача, предложил вариант ее решения, вполне эффективный, а главное - работающий и без особых вывертов. Предложил обсуждение.

Так ведь набросились сторонники сервер-процедур, да еще пытаясь мне объяснить, что кроме ORACLE-сервера, вообще все остальное туфта.

Так вот - тьфу на вас с вашим ORACLE :))


korneley   (2009-11-30 12:58:00) [4]


> Jeer ©   (27.11.09 16:35) [12]
> Хм..С другой стороны, мы всегда можем получить через node.
> Index текущий индекс ноды в пределах одного уровня (от 0
> до Child.Count-1).Может это еще Вам все упростит ?

А ещё есть   TTreeNode.Data, куда можно запихнуть информацию о порядковом номере процесса (чтобы не привязываться к индексу в самом дереве) Тогда уж тупо обход по TreeView1.Items[]с проверкой TreeNode.Levelи, собственно содержимого .DataДа и .Level, можно не проверять, всё по данным в ноде будет понятно.


Jeer   (2009-11-30 10:05:00) [5]


> recop ©   (27.11.09 17:13) [13]
>
>
> function  AbsoluteIndexRootNode(node: TTreenode, IndexNode:
>  integer):integer;
> begin
> Result := -1;


Согласен.


recop   (2009-11-27 17:13:00) [6]


function  AbsoluteIndexRootNode(node: TTreenode, IndexNode: integer):integer;
begin
Result := -1;
while (node <> nil) do begin
  if IndexNode = node.Index then begin
    Result := node.AbsoluteIndex;
    Break;
  end;
  node := node.GetNextSibling;
end;
end;


Думаю так получше, 0 - тоже результат.


Jeer   (2009-11-27 16:35:00) [7]

Хм..
С другой стороны, мы всегда можем получить через node.Index текущий индекс ноды в пределах одного уровня (от 0 до Child.Count-1).
Может это еще Вам все упростит ?


Jeer   (2009-11-27 16:32:00) [8]

Поправка:

function  AbsoluteIndexRootNode(node: TTreenode, IndexNode: integer):integer;
begin
Result := 0;
while (node <> nil) do begin
   if IndexNode = node.Index then begin
     Result := node.AbsoluteIndex;
     Break;
   end;
   node := node.GetNextSibling;
end;
end;


Jeer   (2009-11-27 16:27:00) [9]

Да не за что :)
Тем более мы оба из Калуги, как выясняется.

Ошибка в Вашей функции, есть однако.
Вот так корректнее:

function  AbsoluteIndexRootNode(node: TTreenode, IndexNode: integer):integer;
var
  i: integer;
  node: TTreeNode;
begin
 Result := 0;
 while (node <> nil) do begin
    if IndexNode = node.Index then  Break;
    node := node.GetNextSibling;
 end;
 if (node <> nil) then
   Result := node.AbsoluteIndex;
end;


> За совет спасибо, теперь это выглядит вот так:
>
>
> function  AbsoluteIndexRootNode(IndexNode: integer):integer;
>
> var i, n: integer;  node: TTreeNode;
> begin
> n:=0;
> node := Form1.TreeView1.Items.GetFirstNode; // Items[0]
> while (node <> nil) do begin
>  if n = IndexNode then  Break;
>  node := node.GetNextSibling;
>  Inc(n);
> end;
> result := node.AbsoluteIndex;
> end;


recop   (2009-11-27 15:11:00) [10]

Узлы верхнего уровня - процессы, в потомках - параметры процессов. Все значения хранятся в многоуровневом массиве. Процессы, как и параметры можно подгружать и удалять.

Запущенным процесс может быть только один и работает в потоке, что допускает параллельно редактировать параметров как других (незапущенных) процессов, так и запущенного.

Возникают моменты, когда последовательная обработка объектов не допускается, например, какой-то процесс запущен, а значит обработка должна обойти данный объект.

И еще, т.к. главным является все же  многоуровневый массив, то обращение к параметрам осуществляется как: aGl[x,22] где x = порядковый номер открытого процесса.

За совет спасибо, теперь это выглядит вот так:


function  AbsoluteIndexRootNode(IndexNode: integer):integer;
var i, n: integer;  node: TTreeNode;
begin
n:=0;
node := Form1.TreeView1.Items.GetFirstNode; // Items[0]
while (node <> nil) do begin
 if n = IndexNode then  Break;
 node := node.GetNextSibling;
 Inc(n);
end;
result := node.AbsoluteIndex;
end;


Jeer   (2009-11-27 14:09:00) [11]

Не знаю Вашей задачи, конечно, но, мне кажется, Вы создаете себе и пользователям трудности, потом претендуете на звание Героя.
Стандартным является работа с выделеннымобъектом.

Если бы Вы изложили задачу на немного подробнее, наверняка получили бы более точные варианты ее решения.

Ну, а пробежать по узлам верхнего уровня легко позволяет следующая, более эффективная Вашей, конструкция:

node := tv.GetFirstNode; // Items[0]
while (node <> nil) do begin
// do something
 node := node.GetNextSibling;
end;


recop   (2009-11-27 12:58:00) [12]

Пока решил вопрос опросом итемов, для получения абсолютного индекса нужного узла, подскажите, plz, насколько это провильно.


function  AbsoluteIndexRootNode(IndexNode: integer):integer;
var i, n: integer;
begin
 n:=0;
 for i:=0 to Form1.TreeView1.Items.Count -1 do begin
   if (Form1.TreeView1.Items[i].Level = 0) then begin
     if (n = IndexNode) then begin
       result:=i;
       exit;
     end;
     Inc(n);
   end;
 end;
end;


recop   (2009-11-27 12:02:00) [13]

Согласен. Замылился. Не абсолютный индекс, а номер корневого узла:

0-XX
1-XX
2-XX
3


Jeer   (2009-11-27 11:57:00) [14]


> recop ©   (27.11.09 11:46) [4]
>
> Дополнение: известен только абсолютный индекс корневого
> узла предназначенного для удаления.


Значит Вы неправильно понимаете, что такое абсолютный индекс.
Он строится в порядке рекурсивного обхода текущего дерева.
*.Items[2].Delete удалит ноду с абс.индексом 2 и все ее чайлд-ноды.


recop   (2009-11-27 11:46:00) [15]

Дополнение: известен только абсолютный индекс корневого узла предназначенного для удаления.


recop   (2009-11-27 11:44:00) [16]

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


recop   (2009-11-27 11:31:00) [17]

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


Jeer   (2009-11-27 09:46:00) [18]

node := *.Selected.GetPrevSibling;
node.Delete;


Наверх

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