Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.05.2010, 16:27   #1
RIO
Форумчанин
 
Аватар для RIO
 
Регистрация: 15.12.2007
Сообщений: 422
По умолчанию Поменять местами элементы в TreeView

Здравствуйте! В Интернете есть много примеров, как менять местами элементы в дереве, но они все с использованием перемещения мышью. Мне же необходимо написать две процедуры, для двух кнопок, то есть по нажатию первой кнопки, выделенный элемент меняется с предыдущим. А по нажатию второй, выделенный элемент меняется со следующим. Для этого пользуюсь процедуру приведенной ниже, но вот все никак не могу разобраться с самим алгоритмом перемещения для кнопок, помогите пожалуйста

Код:
procedure ExchangeNodes(TreeView: TTreeView; Node1, Node2: TTreeNode);
var _n1, _n2: ttreenode;
    m1, m2: TNodeAttachMode;
begin
     if (Node1 = nil) or (Node2 = nil) then Exit;
     m1 := naInsert;
     _n1 := Node2.getNextSibling;
     if _n1 = nil then
      if Node2.Parent <> nil then
      begin
       m1 := naAddChild;
       _n1 := Node2.Parent;
      end else m1 := naAdd;

     m2 := naInsert;
     _n2 := Node1.getNextSibling;
     if _n2 = nil then
      if Node1.Parent <> nil then
      begin
       m2 := naAddChild;
       _n2 := Node1.Parent;
      end else m2 := naAdd;

     Node1.MoveTo(_n1, m1);
     Node2.MoveTo(_n2, m2);
end;

procedure TForm2.SpeedButton1Click(Sender: TObject);
var
  I, J: Integer;
  N1, N2: TTreeNode;
begin
  I := TreeView1.Selected.AbsoluteIndex;
//  ShowMessage(IntToStr(I));
  N1 := TreeView1.Selected;
  N2 := TreeView1.Items[I].GetPrev;
  if N1.Parent = N2.Parent then
     Exit;
  ExchangeNodes(TreeView1, N1, N2);
end;
RIO вне форума Ответить с цитированием
Старый 16.05.2010, 01:47   #2
noname Incognito
Пользователь
 
Аватар для noname Incognito
 
Регистрация: 15.05.2010
Сообщений: 17
По умолчанию

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

////ПОМЕНЯТЬ МЕСТАМИ ВЫДЕЛЕННУЮ ВЕТКУ С ПРЕДЫДУЩЕЙ////////////////////////////
procedure TForm1.Button1Click(Sender: TObject);
var
i:byte;
begin
i:=TreeView1.Selected.AbsoluteIndex ; {определяем индекс выделенной ветки}
if i<>0 then TreeView1.Selected.MoveTo(TreeView1 .Items[i-1], naInsert);
{если индекс нулевой (первый елемент в дереве) соответственно ничего не меняем. Если нет используем метод "MoveTo". Конкретно в данном случае происходит вставка ветки к которой применяется метод (выделенная) ПЕРЕД той, которая указана как параметр( перед выделенной ). Всё...}
end;
//////////////////////////////////////////////////////////////////////////////////////////////////////

////ПОМЕНЯТЬ МЕСТАМИ ВЫДЕЛЕННУЮ ВЕТКУ СО СЛЕДУЮЩЕЙ////////////////////////////
procedure TForm1.Button2Click(Sender: TObject);
var
i:byte;
begin
i:=TreeView1.Selected.AbsoluteIndex ; {аналогично...}
if i<>TreeView1.Items.Count-1 then TreeView1.Items[i+1].MoveTo(TreeView1.Selected, naInsert); {если ветка последняя в списке, опять-же, ничего не делаем. В противном случае метод "MoveTo" применяем к ветке следующей за выделенной.}
end;
////////////////////////////////////////////////////////////////////////////////////////////////////

Как видите комментов на порядок больше чем самого кода) Но даже в этом случае выглядит это немного яснее и короче, чем то, что написали вы) Правда, здесь не берётся во внимание какие "виды" веток меняются местами. Если допустим поменять ветку и её подветку получится не очень эстэтично) И непонятно как ваша программа должна себя вести при таких вариантах. Так же как и в процедуре "ExchangeNodes", "в лоб"?.. Уточните условия.

Последний раз редактировалось noname Incognito; 16.05.2010 в 02:33.
noname Incognito вне форума Ответить с цитированием
Старый 16.05.2010, 02:30   #3
RIO
Форумчанин
 
Аватар для RIO
 
Регистрация: 15.12.2007
Сообщений: 422
По умолчанию

Вообще, да, мне это подходит Спасибо огромное
RIO вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поменять местами элементы в массиве! Angel-dm Паскаль, Turbo Pascal, PascalABC.NET 5 14.04.2010 14:59
Поменять местами элементы в массиве (реверс) Андрей.12 Помощь студентам 7 15.11.2009 16:51
[C++] Поменять местами наименьший и второй по величине элементы StudeHt Помощь студентам 2 10.06.2009 23:33
Динамика. Поменять местами наименьший и второй по величине элементы StudeHt Паскаль, Turbo Pascal, PascalABC.NET 3 27.05.2009 02:20
Ввести двумерный массив и поменять в нём местами элементы Ku6ep Помощь студентам 3 23.12.2008 18:25