Форум: "Начинающим";
Текущий архив: 2010.01.17;
Скачать: [xml.tar.bz2];
ВнизУдаление узла TreeView по абсолютному индексу Найти похожие ветки
← →
recop © (2009-11-26 17:55) [0]Здравствуйте уважаемые мастера. Есть дерево корневых узлов, например 5 элементов (TreeView1). Выделен четвертый элемент. Необходимо удалить третий элемент. Выделение должно остаться на четвертом, т.е. после удаления на третьем корневом узле.
Корневые узлы с развитой дочерней структурой.
Form1.TreeView1.Items[2].Destroy - удаляет второй дочерний узел первого корневого узла.
Подскажите, пожалуйста, где собака зарыта?
← →
Jeer © (2009-11-27 09:46) [1]node := *.Selected.GetPrevSibling;
node.Delete;
← →
recop © (2009-11-27 11:31) [2]Спасибо, но, наверное, не правильно поставлен вопрос. Выделен может быть любой узел и любой узел может быть запрошен на удаление (не только предыдущий).
← →
recop © (2009-11-27 11:44) [3]Спасибо, но, наверное, не правильно поставлен вопрос. Выделен может быть любой узел и любой корневой узел может быть запрошен на удаление (не только предыдущий).
← →
recop © (2009-11-27 11:46) [4]Дополнение: известен только абсолютный индекс корневого узла предназначенного для удаления.
← →
Jeer © (2009-11-27 11:57) [5]
> recop © (27.11.09 11:46) [4]
>
> Дополнение: известен только абсолютный индекс корневого
> узла предназначенного для удаления.
Значит Вы неправильно понимаете, что такое абсолютный индекс.
Он строится в порядке рекурсивного обхода текущего дерева.
*.Items[2].Delete удалит ноду с абс.индексом 2 и все ее чайлд-ноды.
← →
recop © (2009-11-27 12:02) [6]Согласен. Замылился. Не абсолютный индекс, а номер корневого узла:
0-XX
1-XX
2-XX
3
← →
recop © (2009-11-27 12:58) [7]Пока решил вопрос опросом итемов, для получения абсолютного индекса нужного узла, подскажите, 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;
← →
Jeer © (2009-11-27 14:09) [8]Не знаю Вашей задачи, конечно, но, мне кажется, Вы создаете себе и пользователям трудности, потом претендуете на звание Героя.
Стандартным является работа с выделенным объектом.
Если бы Вы изложили задачу на немного подробнее, наверняка получили бы более точные варианты ее решения.
Ну, а пробежать по узлам верхнего уровня легко позволяет следующая, более эффективная Вашей, конструкция:
node := tv.GetFirstNode; // Items[0]
while (node <> nil) do begin
// do something
node := node.GetNextSibling;
end;
← →
recop © (2009-11-27 15:11) [9]Узлы верхнего уровня - процессы, в потомках - параметры процессов. Все значения хранятся в многоуровневом массиве. Процессы, как и параметры можно подгружать и удалять.
Запущенным процесс может быть только один и работает в потоке, что допускает параллельно редактировать параметров как других (незапущенных) процессов, так и запущенного.
Возникают моменты, когда последовательная обработка объектов не допускается, например, какой-то процесс запущен, а значит обработка должна обойти данный объект.
И еще, т.к. главным является все же многоуровневый массив, то обращение к параметрам осуществляется как: 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 16:27) [10]Да не за что :)
Тем более мы оба из Калуги, как выясняется.
Ошибка в Вашей функции, есть однако.
Вот так корректнее:
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;
← →
Jeer © (2009-11-27 16:32) [11]Поправка:
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:35) [12]Хм..
С другой стороны, мы всегда можем получить через node.Index текущий индекс ноды в пределах одного уровня (от 0 до Child.Count-1).
Может это еще Вам все упростит ?
← →
recop © (2009-11-27 17:13) [13]
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-30 10:05) [14]
> recop © (27.11.09 17:13) [13]
>
>
> function AbsoluteIndexRootNode(node: TTreenode, IndexNode:
> integer):integer;
> begin
> Result := -1;
Согласен.
← →
korneley © (2009-11-30 12:58) [15]
> 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 16:12) [16]Можно, все можно.
Автору поста решать -что и насколько эффективнее, при его конкретной задаче.
P.S.
Я вот, в относительно недавней ветке, тоже объяснял - возникла нестандартная задача, предложил вариант ее решения, вполне эффективный, а главное - работающий и без особых вывертов. Предложил обсуждение.
Так ведь набросились сторонники сервер-процедур, да еще пытаясь мне объяснить, что кроме ORACLE-сервера, вообще все остальное туфта.
Так вот - тьфу на вас с вашим ORACLE :))
← →
clickmaker © (2009-11-30 16:14) [17]> тьфу на вас с вашим ORACLE :))
я слышал, в оракле идентити нет. Ацтой -)
← →
Jeer © (2009-11-30 16:19) [18]
> clickmaker © (30.11.09 16:14) [17]
А то :) Впрочем, этим никогда и даже не баловался, "идентити". Кышь от меня.
А вот скоко мегабайт занимает Он на диске - мне просто жалко "железо".
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2010.01.17;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.006 c