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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.12.2009, 20:46   #1
RIO
Форумчанин
 
Аватар для RIO
 
Регистрация: 15.12.2007
Сообщений: 422
По умолчанию Отличный Drag And Drop в TTreeView

Здравствуйте ! Столкнулся с интересной проблемой. Реализовал Drag And Drop в TTreeView. Все вроде нормально работает, но не отлично. А именно - работает перетаскивание из пункта в пункт. А вот если, например - в пункте есть три подпункта (1, 2, 3) и их нужно поменять местами (3, 2, 1), это уже никак не сделать, разве что все эти подпункты выкидывать в другой пункт, а потом по очереди вкидывать обратно. Проект в приложении. Помогите пожалуйста, смотрел тему :

http://programmersforum.ru/showthread.php?t=54194

Хорошенько погуглил, но того, что нужно так и не нашел
Вложения
Тип файла: rar TV.rar (192.4 Кб, 10 просмотров)
RIO вне форума Ответить с цитированием
Старый 09.12.2009, 21:45   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Да ничего сложного.
Код:
procedure TForm1.TreeView1DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
(Source as TTreeView).Selected.MoveTo((Sender as TTreeView).DropTarget, naInsert);
end;
Это будет действовать при любом перемещении ноды, кроме случая, когда вы попытаетесь поставить ноду последней.
Один из методов решения - пусть по нажатию, например, клавиши CTRL у вас меняется naInsert на naAdd...
То есть без клавиши CTRL будет вставка "перед", а с нажатием - "после".
mihali4 вне форума Ответить с цитированием
Старый 10.12.2009, 01:20   #3
RIO
Форумчанин
 
Аватар для RIO
 
Регистрация: 15.12.2007
Сообщений: 422
По умолчанию

Да, идея действительно хорошая. Только вот у меня возникли проблемы с отслежкой зажатой клавиши CTRL. Как и куда поставить проверку ?
RIO вне форума Ответить с цитированием
Старый 10.12.2009, 01:36   #4
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Тоже просто.
Код:
procedure TForm1.TreeView1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if Shift=[ssCtrl] then
Label3.Caption:='Ctrl нажата';
end;
Вместо
Код:
Label3.Caption:='Ctrl нажата';
ставите установку некоего флажка (это такая булева глобальная переменная, изначально False).
Ну, а дальше...? (поверьте, я хочу вас "научить", а не "сунуть готовый исходник". поэтому и "мучаю" )
mihali4 вне форума Ответить с цитированием
Старый 10.12.2009, 01:49   #5
RIO
Форумчанин
 
Аватар для RIO
 
Регистрация: 15.12.2007
Сообщений: 422
По умолчанию

Спасибо Я понял. И правильно вы делаете Поддерживаю ! А насчет процедуры TreeView1KeyDown не подумал, что-то меня переубедило, что именно там нужно логическую переменную ставить

Только у меня будет вопрос, почему именно :

Код:
if Shift = [SSCtrl] then
Я всегда пользовался :

Код:
if Key = VK_CONTROL then
? ? ?
RIO вне форума Ответить с цитированием
Старый 10.12.2009, 08:36   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Специально разделили
key это нефункциональные клавиши клавиатуры.
Остаются SHIFT, CTRL, ALT - потому что они используются в стандартных горячих клавишай.
Это нормальный ход
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.12.2009, 11:33   #7
RIO
Форумчанин
 
Аватар для RIO
 
Регистрация: 15.12.2007
Сообщений: 422
По умолчанию

mihali4, возникли проблемы с флажком. Сделал так :

Код:
procedure TBox.TreeView1DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
  if TVB then
  begin
     (Source as TTreeView).Selected.MoveTo((Sender as TTreeView).DropTarget, NAInsert);
     Exit;
  end;
     (Source as TTreeView).Selected.MoveTo((Sender as TTreeView).DropTarget, NAAdd);
end;

procedure TBox.TreeView1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Shift = [SSCtrl] then
     TVB := True;
end;
Теперь, нужно как-то после перетаскивания вернуть флажку фелс. Но с этим не получается. Делал так :

Код:
procedure TBox.TreeView1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  TVB := False;
  if Shift = [SSCtrl] then
     TVB := True;
end;
Но программа работает не корректно.
RIO вне форума Ответить с цитированием
Старый 10.12.2009, 14:05   #8
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Просто
Код:
TVB := False;
поставьте перед
Код:
Exit;
mihali4 вне форума Ответить с цитированием
Старый 10.12.2009, 15:23   #9
RIO
Форумчанин
 
Аватар для RIO
 
Регистрация: 15.12.2007
Сообщений: 422
По умолчанию

Пробовал, но не работает, то что мне нужно. Видно из-за того, что у меня еще используется DragOver и там тоже проверка на эту переменную и ехит. Посмотрите исходники, я думаю поймете в чем проблема. Я делаю так, запускаю екзе, зажимаю контрол, меняю положение подпунктов. Но потом отпускаю контрол и хочу вложить подпукнт в подпункт и вот все, не работает (опять обмен пунктов работает, буд-то контрол зажат), если я раз сделаю обмен, то потом могу выполнять уже вкладывание.
Вложения
Тип файла: rar TV Second.rar (193.0 Кб, 11 просмотров)
RIO вне форума Ответить с цитированием
Старый 10.12.2009, 17:28   #10
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Елы-палы, ну добавьте
Код:
procedure TBox.TreeView1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  TVB := False;
end;
mihali4 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
drag and drop kelty Помощь студентам 0 11.09.2009 23:00
Drag and Drop nusik Общие вопросы C/C++ 2 09.07.2009 11:09
Нужна помощь (Drag-And-Drop & Drag-Abd-Dock)) Arkuz Общие вопросы Delphi 1 18.04.2009 00:15
Drag and Drop Xardas Общие вопросы Delphi 8 20.01.2008 23:09