Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Копировать и вставлять TreeNode

Delphi , Компоненты и Классы , TTreeView

Копировать и вставлять TreeNode


 var
   SL : TStringList;

 procedure TForm1.CutBtnClick(Sender: TObject);
 var
   i, j, StartLevel : integer;
   TNSel : TTreeNode;
 begin
   TNSel := TreeView1.Selected;
   if TNSel <> nil then begin
     StartLevel := TNSel.Level;
     i := TNSel.AbsoluteIndex;
     j := i; // note for later deletion
     if SL = nil then
       SL := TStringList.Create
     else
       SL.Clear;
     SL.AddObject(TNSel.Text, pointer(0));
     inc(i);
     with TreeView1 do begin
       while Items[i].Level > StartLevel do begin
         {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;
 begin
   with TreeView1 do begin
     TNSel := Selected;
     if TNSel <> nil then begin
       TN := Items.Insert(TNSel, SL.Strings[0]);
       Level := integer(SL.Objects[0]); // should be 0
       for i := 1 to SL.Count - 1 do begin
         if integer(SL.Objects[i]) < Level then begin
           {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])
         else begin
           {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". Вот что она делает:

  1. Она получает текущее выбранное узло в TreeView.
  2. Если узел выбран, то она хранит его уровень (глубина узла) и абсолютный индекс в переменных StartLevel и i соответственно.
  3. Она создает или очищает объект TStringList (SL) для хранения текста и уровней узлов.
  4. Она добавляет текст и уровень текущего узла в список SL.
  5. Затем она перебирает соседние узлы текущего узла, пока не достигнет верхнего узла (родителя текущего узла).
  6. Для каждого соседнего узла она добавляет его текст и уровень в список SL.
  7. Наконец, она удаляет оригинальный узел.

PasteBtnClick процедура:

Эта процедура вызывается при клике кнопки "Paste". Вот что она делает:

  1. Она получает текущее выбранное узло в TreeView.
  2. Если узел выбран, то она создает новый узел, вставляя первый строку из списка SL в текущую позицию выбора.
  3. Затем она перебирает остальные строки в списке SL и вставляет их в TreeView соответственно:

  4. Если уровень текущей строки соответствует уровню предыдущего узла, то она добавляет дочерний узел к этому узлу.

  5. Если уровень ниже уровня предыдущего узла, то она поднимается на один уровень, присваивая свойство Parent узла родителю предыдущего узла.
  6. Если уровень выше уровня предыдущего узла, то она спускается на один уровень, добавляя новый дочерний узел к предыдущему узлу.

Альтернативное решение:

Вместо использования TStringList для хранения текста и уровней узлов можно использовать TCollection или массив для хранения узлов. Это бы устранило необходимость вручной управления памятью (использование Create и Clear) и сделало код более эффективным. Можно также рассмотреть объектно-ориентированный подход, создавая класс для представления узлов и их отношений.

В примере ниже я модифицировал код для использования TCollection:

type
  TNode = class(TTreeNode) end;

var
  NodeCollection: TCollection;
  i, Level: integer;
  TNSel, TN: TNode;

procedure TForm1.CutBtnClick(Sender: TObject);
begin
   // ...
  if SL = nil then
    SL := TCollection.Create
  else
    SL.Clear;
  SL.AddObject(TNSel.Text, TNSel.Level);
   // ...
end;

procedure TForm1.PasteBtnClick(Sender: TObject);
var
  i, Level: integer;
begin
  with TreeView1 do begin
     // ...
    TN := Items.Insert(TNSel, NodeCollection[0]);
    Level := NodeCollection.Objects[0];
    for i := 1 to NodeCollection.Count - 1 do begin
      if integer(NodeCollection.Objects[i]) < Level then begin
         // go up one level
        TN := TN.Parent;
        Level := integer(NodeCollection.Objects[i]);
      end else if Level = integer(NodeCollection.Objects[i]) then begin
         // same level
        TN := Items.Add(TN, NodeCollection[i])
      else begin
         // go down one level
        TN := 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: TTreeView ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-01-28 06:18:38/0.0036740303039551/0