Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.062 c
11-1245250056
Dy1
2009-06-17 18:47
2013.03.22
ListView


15-1345453966
Es
2012-08-20 13:12
2013.03.22
ADO + большая транзакция


15-1349627361
Roman_man
2012-10-07 20:29
2013.03.22
Формальный аттестат и Веб-Мани. Кипер Лайт


2-1336127281
__QWERTY
2012-05-04 14:28
2013.03.22
как правильно очистить TList ы, чтобы не было утечек памяти


15-1333657802
Юрий
2012-04-06 00:30
2013.03.22
С днем рождения ! 6 апреля 2012 пятница





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