Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1258130978
_
2009-11-13 19:49
2010.01.17
Битая информация на флешке.


1-1233807030
megaadmin
2009-02-05 07:10
2010.01.17
DLL и завершение работы Windows


2-1258720030
Andrewtitoff
2009-11-20 15:27
2010.01.17
VBA => Delphi


2-1258794558
Б
2009-11-21 12:09
2010.01.17
Почему программа создавая окно - вылетает?


15-1258398854
_
2009-11-16 22:14
2010.01.17
Клавиатура отказывает.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский