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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.06.2014, 05:22   #1
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,210
Вопрос Не перемещается компонент мышкой

Всем добрый день!
После моего длительного отсутствия на данном форуме, я вернулся к вам и вернулся с таким вопросом
У меня не срабатывает код, который должен перемещать мышкой динамически созданную панельку.
Я написал 3 процедуры в основной форме:
Код:
...
  private
    { Private declarations }
  public
    procedure GN(Sender: TObject);
    procedure MouseD(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure MouseM(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure MouseU(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    { Public declarations }
  end;

var
  MouseDownSpot: TPoint;
  Capturing: Bool;

procedure TMainForm.MouseD(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 SetCapture(TWinControl(ActiveControl).Handle);
 Capturing:=True;
 MouseDownSpot.X:=x;
 MouseDownSpot.Y:=y;
end;

procedure TMainForm.MouseM(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
 if Capturing then
 begin
  TWinControl(ActiveControl).Left:=TWinControl(ActiveControl).Left - (MouseDownSpot.X - x);
  TWinControl(ActiveControl).Top:=TWinControl(ActiveControl).Top - (MouseDownSpot.Y - y);
 end;
end;

procedure TMainForm.MouseU(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 if Capturing then
 begin
  ReleaseCapture;
  Capturing:=False;
  TWinControl(ActiveControl).Left:=TWinControl(ActiveControl).Left - (MouseDownSpot.X - x);
  TWinControl(ActiveControl).Top:=TWinControl(ActiveControl).Top - (MouseDownSpot.Y - y);
 end;
end;
Созданной панельке я программно присваиваю эти процедуры:
Код:
 ...
  OnMouseDown:=MainForm.MouseD;
  OnMouseMove:=MainForm.MouseM;
  OnMouseUp:=MainForm.MouseU;
 ...
Использовал TWinControl(ActiveControl), т.к. мне надо перемещать активную панельку. Любую выбранную панельку.
Однако данный код не срабатывает и панелька не двигается. А мне всего-то надо, чтобы она перемещалась мышкой, как в DesignTime, но только в RunTime.

Прошу помочь и подсказать мне, почему не работает мой код. Да, кстати, если это важно, то панельки создаются на компоненте ScrollBox.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 08.06.2014, 09:23   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Отладку проводит? Бряки ставил?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 08.06.2014, 09:39   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Замени везде ActiveControl на Sender. ActiveControl - зачем он там?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 08.06.2014, 10:06   #4
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,210
По умолчанию

Аватар, спасибо огромное, заработало!
А почему с Sender заработало?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 08.06.2014, 10:15   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Потому что в Sender указатель на панель, а нажатие мышью на панели не делает её активным контролом. В AciveControl указатель на контрол с фокусом ввода если он есть
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 08.06.2014, 11:27   #6
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

DW и этого достаточно, чтобы тягать панельку:
Код:
procedure TForm1.Panel2MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
const
  SC_DRAGMOVE = $F012;
begin
  ReleaseCapture;
  Panel2.Perform(WM_SYSCOMMAND, SC_DRAGMOVE, 0);
end;
Пример работы: http://www.youtube.com/watch?v=yTEDvM99he0
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 09.06.2014, 10:12   #7
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Есть халява, притом более работоспособная: TMoveControl на просторах гугл-кода. Ещё есть компонент в пакете Cindy, забыл как классназывается, вроде TcyRunTimeResizer.
Человек_Борща вне форума Ответить с цитированием
Старый 09.06.2014, 13:43   #8
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...а в чем выражена эта более работоспособность халявы?
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
двигаю контрол мышкой, почему мышка перемещается быстрее чем контрол PaulRom Microsoft Office Access 0 06.12.2011 11:19
[Поиск] Компонент локализации строковых ресурсов и сторонних компонент delphi Человек_Борща Компоненты Delphi 3 23.08.2011 10:44
Проблема с мышкой!!! Slesar Компьютерное железо 4 14.08.2011 12:24
1. Нарисовать часы в Pascal. Секундная стрелка перемещается. Темир Помощь студентам 5 13.06.2010 13:21
Progressbar не перемещается на задний план tocsik Компоненты Delphi 5 20.09.2009 18:32