Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

TreeView   Найти похожие ветки 

 
начинающий7   (2012-08-15 19:40) [0]

Здраствуйте. Подскажите есть TreeView как удалить записи 2 уровня


 
kilkennycat ©   (2012-08-15 20:33) [1]

Перебором. В цикле сравнивать если уровень 2 удаляй возможно перед удалением придется найти всех детей ноды и удалить (в моем компоненте так)


 
Германн ©   (2012-08-16 02:44) [2]


> Перебором. В цикле сравнивать если уровень 2 удаляй возможно
> перед удалением придется найти всех детей ноды и удалить

Задача не описана. Возможно нужно удалить только сам второй уровень. Т.е. удалить одно промежуточное звено в цепи х.з. чего.


 
AV ©   (2012-08-16 09:13) [3]


> TreeView как удалить записи 2 уровня

Поэтапно
1. Научится определять, что это второй уровень узла в дереве
2. Получать все дочерние узлы конкретного узла
31. Соединять дочерние узлы с родителем для конкретного узла
32. Удалять всех потомков для конкретного узла


 
AV ©   (2012-08-16 13:31) [4]

а-ля так

 
public      { Public declarations }
   procedure DeleteNodesFromLevel(TV: TTreeView; const nLvl: Integer; DelChild: Boolean);
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.DeleteNodesFromLevel(TV: TTreeView; const nLvl: Integer; DelChild: Boolean);
var
 N: TTreeNode;
 LN, CN: TTreeNode;
 i: Integer;
 ListNodeToKill: TList;
 ListChild: TList;

 procedure FillKillList;
 begin
   N := TV.Items.GetFirstNode;
   while N.GetNext <> nil do
   begin
     if N.Level = nLvl then
       ListNodeToKill.Add(Pointer(N));
     N := N.GetNext;
   end;
 end;

 procedure WorkWithChildren;
   procedure FillChildsList;
   begin
     N := LN.getFirstChild;
     while N <> nil do
     begin
       ListChild.Add(Pointer(N));
       N := LN.GetNextChild(N);
     end;
   end;
   procedure MoveChilds;
   var
     j: Integer;
   begin
     for j := 0 to ListChild.Count - 1 do
     begin
       CN := TTreeNode(ListChild.Items[j]);
       if LN.Parent <> nil then
         CN.MoveTo(LN.Parent, naAddChild);
     end;
   end;
 begin
   ListChild := TList.Create;
   FillChildsList;
   MoveChilds;
   FreeAndNil(ListChild);
 end;

begin
 ListNodeToKill := TList.Create;
 FillKillList;
 for i := 0 to ListNodeToKill.Count - 1 do
 begin
   LN := TTreeNode(ListNodeToKill.Items[i]);
   if DelChild then
     LN.DeleteChildren else
     WorkWithChildren;
   FreeAndNil(LN);
 end;
 FreeAndNil(ListNodeToKill);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 DeleteNodesFromLevel(tv1, 1, CheckBox1.Checked);
end;


ps
Да делать нечего )
Чистого времени до отпуска осталось 12 часов!


 
kilkennycat ©   (2012-08-16 23:12) [5]


> FreeAndNil(LN);

> FillKillList

зачем?
procedure WorkWithChildren; - вызов MoveChilds даже если нет детей?


 
AV ©   (2012-08-17 00:45) [6]

Все за ради что бы мозга не напрягалась :)


> зачем?

FillKillList

Получить в список второго уровня, что бы не следить после перемещений, не встал ли на второй уровень кто из детей, тогда его не считаем, а других считаем.
Просто, получим список второго уровня.
далее идем по нему, и удаляем
FreeAndNil(LN); - удалить самого

если детей надо оставить - делаем однообразно, как выше
Зачем приемника нагружать очередным выкрутасом. Делаем все также, как он уже разбирал, т.е. как и выше


 
AV ©   (2012-08-17 00:52) [7]

ну и да, не оптимально конечно.
Встанет вопрос в скорости, оптимиировать надо будет


 
kilkennycat ©   (2012-08-17 01:30) [8]


> FreeAndNil(LN); - удалить самого

зачем? во-первых, ты ее сам не создаешь, во-вторых, в начале цикле ее значение меняешь.


 
AV ©   (2012-08-17 08:07) [9]


> > FreeAndNil(LN); - удалить самого
>
> зачем?

Я ее натравливаю на того, кого захотел удалить юзер
Что бы не обращаться все время как к TTreeNode(ListNodeToKill.Items[i]), а как к LN


 
MsGuns ©   (2012-08-17 11:47) [10]

>[4]

Убивать за такие алгоритмы и стиль кодирования. Без суда и следствия !
Ну или пожизненно отлучать от программирования :)


 
AV ©   (2012-08-17 12:04) [11]

за высказывание без указания конкретики тоже :)

И потом,

> 13:31) [4]

Обед у меня в 13-00, я поел :) , накидал за оставшееся до :31 время и выложил аз есмь.
Напишешь за 15 минут лучше?



Страницы: 1 вся ветка

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.062 c
2-1342449803
solovei
2012-07-16 18:43
2013.03.22
дождаться завершения установки


15-1349268838
Чтец
2012-10-03 16:53
2013.03.22
Книга в формате Word


15-1329510280
istok20
2012-02-18 00:24
2013.03.22
Перехват gtalk и gmail..


15-1333744203
Юрий
2012-04-07 00:30
2013.03.22
С днем рождения ! 7 апреля 2012 суббота


2-1340622845
Ele
2012-06-25 15:14
2013.03.22
Цикл по полям записи





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский