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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.06.2012, 21:10   #1
Montysson
Пользователь
 
Аватар для Montysson
 
Регистрация: 16.10.2011
Сообщений: 32
По умолчанию Перетаскивание нескольких объектов на форме

Доброго времени суток.

Не могу реализовать множественное перетаскивание, к примеру у меня есть объект, в виде записи:

Код:
TObj = packed record
  Top, Left: Integer;
  Width, Height: Integer;
  IsSelect: Boolean;
end;
И есть массив таких объектов:

Код:
Objs: array of TObj;
Сейчас я перетаскиваю такие объекты следующим образом:

Код:
 
if (ObjNum >= 0) and IsDown then
  with Objs[ObjNum] do
  begin
    Left := Round((X - Width div 2) / Scale);
    Top := Round((Y - Height div 2) / Scale);
  end;
И собственно все работает как нужно, но если выбраны несколько объектов и я пытаюсь их перетащить, то ничего не получается (В этом примере без масштабирования и без середины объекта, для наглядности):

Код:
var
  I: Integer;
begin
  for I := 0 to High(Objs) do
    if Objs[I].IsSelect then
      with Objs[I] do
      begin
        Left :=  Left + X - ClickPos.X; // Round((AX - CurrX) / Scale);
        Top :=  Top + Y - ClickPos.Y; // Round((AY - CurrY) / Scale);
      end;
end;
Наверно кто-нибудь уже реализовывал подобное, подскажите пожалуйста.
Montysson вне форума Ответить с цитированием
Старый 16.06.2012, 19:52   #2
samouelson
Пользователь
 
Регистрация: 07.12.2009
Сообщений: 46
По умолчанию

Да, у меня такая же проблема. Каким образом можно реализовать данную задачу?
samouelson вне форума Ответить с цитированием
Старый 17.06.2012, 15:03   #3
Montysson
Пользователь
 
Аватар для Montysson
 
Регистрация: 16.10.2011
Сообщений: 32
По умолчанию

Получилось кое-что сделать, переделал структуру данных объекта, добавил два поля:

Код:
TObj = packed record
  Top, Left: Integer;
  OldTop, OldLeft: Integer;
  Width, Height: Integer;
  IsSelect: Boolean;
end;
И на событие OnMouseDown добавил следующие строки:

Код:
Objs[ObjNum].OldLeft := X;
Objs[ObjNum].OldTop := Y;
Т.е. при нажатии на объект запоминаются его координаты до перетаскивания.

А в событии OnMouseMove написал:

Код:
var
  I: Integer;
begin
  for I := 0 to High(Objs) do
    if Objs[I].IsSelect then
      with Objs[I] do
      begin
        Left :=  OldLeft + X - ClickPos.X;
        Top :=  OldTop + Y - ClickPos.Y;
      end;
end;
Теперь при перетаскивании одного объекта все работает как надо, а при перетаскивании нескольких не работает. Просто при выборе нескольких объектов они перемещаются в точку клика и перемещаются все вместе в одной точке, не сохраняя при этом расстояний между объектами.

Подскажите как быть.
Montysson вне форума Ответить с цитированием
Старый 17.06.2012, 17:10   #4
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Взять точку начала таскания, взять точку конца таскания (или текущую точку таскания) по ним высчитывать дельта Х и У - и к координатам компонентов добавлять именно дельты - тогда и расстояния будут сохраняться, да и всякие олд-ы не потребуются
phomm вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перетаскивание объектов по форме WRC fan 66 Общие вопросы Delphi 3 08.12.2010 20:24
Перетаскивание объектов в Delphi Dennis777 Помощь студентам 2 06.11.2009 15:34
Перетаскивание объектов Rusl92 Общие вопросы Delphi 4 04.11.2008 12:04
Перетаскивание объектов по программе aesoem Компоненты Delphi 5 27.12.2007 20:42