Форум: "Начинающим";
Текущий архив: 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.073 c