![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Удаление узла 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;