![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TreeView
начинающий7 © (2012-08-15 19:40:00)Здраствуйте. Подскажите есть TreeView как удалить записи 2 уровня
AV (2012-08-17 12:04:00) [1]за высказывание без указания конкретики тоже :)
И потом,
> 13:31) [4]
Обед у меня в 13-00, я поел :) , накидал за оставшееся до :31 время и выложил аз есмь.
Напишешь за 15 минут лучше?
MsGuns (2012-08-17 11:47:00) [2]>[4]
Убивать за такие алгоритмы и стиль кодирования. Без суда и следствия !
Ну или пожизненно отлучать от программирования :)
AV (2012-08-17 08:07:00) [3]
> > FreeAndNil(LN); - удалить самого
>
> зачем?
Я ее натравливаю на того, кого захотел удалить юзер
Что бы не обращаться все время как к TTreeNode(ListNodeToKill.Items[i]), а как к LN
kilkennycat (2012-08-17 01:30:00) [4]
> FreeAndNil(LN); - удалить самого
зачем? во-первых, ты ее сам не создаешь, во-вторых, в начале цикле ее значение меняешь.
AV (2012-08-17 00:52:00) [5]ну и да, не оптимально конечно.
Встанет вопрос в скорости, оптимиировать надо будет
AV (2012-08-17 00:45:00) [6]Все за ради что бы мозга не напрягалась :)
> зачем?
FillKillList
Получить в список второго уровня, что бы не следить после перемещений, не встал ли на второй уровень кто из детей, тогда его не считаем, а других считаем.
Просто, получим список второго уровня.
далее идем по нему, и удаляем
FreeAndNil(LN); - удалить самого
если детей надо оставить - делаем однообразно, как выше
Зачем приемника нагружать очередным выкрутасом. Делаем все также, как он уже разбирал, т.е. как и выше
kilkennycat (2012-08-16 23:12:00) [7]
> FreeAndNil(LN);
> FillKillList
зачем?
procedure WorkWithChildren; - вызов MoveChilds даже если нет детей?
AV (2012-08-16 13:31:00) [8]а-ля так
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 часов!
AV (2012-08-16 09:13:00) [9]
> TreeView как удалить записи 2 уровня
Поэтапно
1. Научится определять, что это второй уровень узла в дереве
2. Получать все дочерние узлы конкретного узла
31. Соединять дочерние узлы с родителем для конкретного узла
32. Удалять всех потомков для конкретного узла
Германн (2012-08-16 02:44:00) [10]
> Перебором. В цикле сравнивать если уровень 2 удаляй возможно
> перед удалением придется найти всех детей ноды и удалить
Задача не описана. Возможно нужно удалить только сам второй уровень. Т.е. удалить одно промежуточное звено в цепи х.з. чего.
kilkennycat (2012-08-15 20:33:00) [11]Перебором. В цикле сравнивать если уровень 2 удаляй возможно перед удалением придется найти всех детей ноды и удалить (в моем компоненте так)