var
SL : TStringList;
procedure TForm1.CutBtnClick(Sender: TObject);
var
i, j, StartLevel : integer;
TNSel : TTreeNode;
begin
TNSel := TreeView1.Selected;
if TNSel <> nilthenbegin
StartLevel := TNSel.Level;
i := TNSel.AbsoluteIndex;
j := i; // note for later deletionif SL = nilthen
SL := TStringList.Create
else
SL.Clear;
SL.AddObject(TNSel.Text, pointer(0));
inc(i);
with TreeView1 dobeginwhile Items[i].Level > StartLevel dobegin{stop before next sibling to top node\}
SL.AddObject(Items[i].Text, pointer(Items[i].Level - StartLevel));
inc(i);
end; {while Items[i].Level > StartLevel\}
Items[j].Delete;
end; {with TreeView1\}end; {if TNSel <> nil\}end;
procedure TForm1.PasteBtnClick(Sender: TObject);
var
i, Level : integer;
TNSel, TN : TTreeNode;
beginwith TreeView1 dobegin
TNSel := Selected;
if TNSel <> nilthenbegin
TN := Items.Insert(TNSel, SL.Strings[0]);
Level := integer(SL.Objects[0]); // should be 0for i := 1 to SL.Count - 1 dobeginif integer(SL.Objects[i]) < Level thenbegin{go up one level\}
TN := TN.Parent;
Level := integer(SL.Objects[i]);
end; {if integer(SL.Objects[i]) < Level\}if Level = integer(SL.Objects[i]) then{same level\}
TN := Items.Add(TN, SL.Strings[i])
elsebegin{go down one level\}
TN := Items.AddChild(TN, SL.Strings[i]);
Level := integer(SL.Objects[i]);
end; {if Level = integer(SL.Objects[i])\}end; {for i := 1 to SL.Count - 1\}end; {if TNSel <> nil\}end; {with TreeView1\}end;
Привет! Я перевёл текст на русский язык:
Код, написанный на Delphi, используется для копирования и вставки узлов из компонента TreeView.
CutBtnClick процедура:
Эта процедура вызывается при клике кнопки "Cut". Вот что она делает:
Она получает текущее выбранное узло в TreeView.
Если узел выбран, то она хранит его уровень (глубина узла) и абсолютный индекс в переменных StartLevel и i соответственно.
Она создает или очищает объект TStringList (SL) для хранения текста и уровней узлов.
Она добавляет текст и уровень текущего узла в список SL.
Затем она перебирает соседние узлы текущего узла, пока не достигнет верхнего узла (родителя текущего узла).
Для каждого соседнего узла она добавляет его текст и уровень в список SL.
Наконец, она удаляет оригинальный узел.
PasteBtnClick процедура:
Эта процедура вызывается при клике кнопки "Paste". Вот что она делает:
Она получает текущее выбранное узло в TreeView.
Если узел выбран, то она создает новый узел, вставляя первый строку из списка SL в текущую позицию выбора.
Затем она перебирает остальные строки в списке SL и вставляет их в TreeView соответственно:
Если уровень текущей строки соответствует уровню предыдущего узла, то она добавляет дочерний узел к этому узлу.
Если уровень ниже уровня предыдущего узла, то она поднимается на один уровень, присваивая свойство Parent узла родителю предыдущего узла.
Если уровень выше уровня предыдущего узла, то она спускается на один уровень, добавляя новый дочерний узел к предыдущему узлу.
Альтернативное решение:
Вместо использования TStringList для хранения текста и уровней узлов можно использовать TCollection или массив для хранения узлов. Это бы устранило необходимость вручной управления памятью (использование Create и Clear) и сделало код более эффективным. Можно также рассмотреть объектно-ориентированный подход, создавая класс для представления узлов и их отношений.
В примере ниже я модифицировал код для использования TCollection:
typeTNode=class(TTreeNode)end;varNodeCollection:TCollection;i,Level:integer;TNSel,TN:TNode;procedureTForm1.CutBtnClick(Sender:TObject);begin// ...ifSL=nilthenSL:=TCollection.CreateelseSL.Clear;SL.AddObject(TNSel.Text,TNSel.Level);// ...end;procedureTForm1.PasteBtnClick(Sender:TObject);vari,Level:integer;beginwithTreeView1dobegin// ...TN:=Items.Insert(TNSel,NodeCollection[0]);Level:=NodeCollection.Objects[0];fori:=1toNodeCollection.Count-1dobeginifinteger(NodeCollection.Objects[i])<Levelthenbegin// go up one levelTN:=TN.Parent;Level:=integer(NodeCollection.Objects[i]);endelseifLevel=integer(NodeCollection.Objects[i])thenbegin// same levelTN:=Items.Add(TN,NodeCollection[i])elsebegin// go down one levelTN:=Items.AddChild(TN,NodeCollection[i]);Level:=integer(NodeCollection.Objects[i]);end;end;end;end;
В этом примере я создал класс TNode для представления узлов в TreeView. Процедура CutBtnClick теперь добавляет текст и уровень узла в TCollection, а процедура PasteBtnClick использует это TCollection для вставки узлов в TreeView.
Копирование и вставка узлов в дереве с помощью компонента TreeView в Delphi.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.