Главная страница
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.49 MB
Время: 0.284 c
3-1275925400
Дмитрий Белькевич
2010-06-07 19:43
2013.03.22
Оптимизировать запрос


15-1340569805
Юрий
2012-06-25 00:30
2013.03.22
С днем рождения ! 25 июня 2012 понедельник


15-1330707938
ClawClaw
2012-03-02 21:05
2013.03.22
Внезапно стал выключаться ноутбук


2-1330408314
AV
2012-02-28 09:51
2013.03.22
Владение критической секцией


15-1331105582
alexdn
2012-03-07 11:33
2013.03.22
Бит торрент