Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как передвинуть курсором форму приложения в Delphi

930
16 февраля 2015 года
Sash1k
115 / / 27.04.2007
Есть приложение на Delphi, которое состоит и формы (TForm) и текстового поля на ней (TLabel), такой вопрос, как кликнуть курсором по форме и держать правую кнопку мыши, что бы можно было двигать форму приложения по экрану?
252
16 февраля 2015 года
koderAlex
1.4K / / 07.09.2005
повесь на событие FormMouseMove обработчик :
void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
{
const int SC_DRAGMOVE=61458;//0xF012;
((TForm *)Sender)->Perform(WM_SYSCOMMAND,SC_DRAGMOVE,0);
}

это из билдера . под дельфи сам адаптируешь .
930
16 февраля 2015 года
Sash1k
115 / / 27.04.2007
Передал под Delphi, получилось так:
 
Код:
procedure TmainForm.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);

const
 SC_DRAGMOVE = 61458;
begin
 mainForm.Perform(WM_SYSCOMMAND, SC_DRAGMOVE, 0);
end;
но все равно не работает:(
465
16 февраля 2015 года
QWERYTY
595 / / 25.03.2012
Это из билдера, только не работает.
Проверял в С++ Builder 2010

И то что автор утверждает что у него не работает не является его криворукостью.
Проверял в Delphi 2010 под Win 7.

Я добился перемещения окна вот таким кривым способом:
Код:
var
  Form1: TForm1;
  FormPoint: TPOINT;

implementation

{$R *.dfm}



procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
   FormPoint.X := X;  // Сохраняем Х координату внутри формы в момент нажатия
   FormPoint.Y := Y;

end;



procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
DescPoint: TPOINT;
begin
   GetCursorPos(DescPoint);
   if ssRight in Shift then
   begin
      Form1.Left := DescPoint.X - FormPoint.X - (Width - ClientWidth);
      Form1.Top  := DescPoint.Y - FormPoint.Y - (Height - ClientHeight);
   end;

end;
Но есть проблема. При резком перемещении мыши курсор уезжает за пределы формы, ну дальше я думаю понятно что происходит.


Если кто знает поделитесь как система перемещает окно когда его цепляешь левой кнопкой за заголовок.
930
16 февраля 2015 года
Sash1k
115 / / 27.04.2007
Сделал так, но форма может перемещаться только по горизонтали, не могу двигать ее хаотично по экрану.

Кстати, тоже интересно, как можно двигать форму левой кнопкой мыши.
465
16 февраля 2015 года
QWERYTY
595 / / 25.03.2012
Странно, у меня по всякому ездит.

Но в любом случае артефактов до х...
Форма оставляет за собой следы, и выше уже писал про быстрое движение.

Когда цепляешь левой кнопкой мыши форма ездит при любой скорости перемещения и не "отваливается" от мышки.
8
16 февраля 2015 года
mfender
3.5K / / 15.06.2005
Почти то же как у камрада QWERTY извратился.
Вроде работает.
Код:
type
  private
    FDiffX, FDiffY: Integer;

var
  Form10: TForm10;

implementation

procedure TForm10.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  FDiffX := X;
  FDiffY := Y;
end;

procedure TForm10.FormMouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
begin
  if ssRight in Shift then
  begin
    TForm(Sender).Left := Mouse.CursorPos.X - FDiffX;
    TForm(Sender).Top := Mouse.CursorPos.Y - FDiffY;
  end;
end;
465
16 февраля 2015 года
QWERYTY
595 / / 25.03.2012
Ага, прикольно!
Только эфект тот же. И курсор при захвате формы смещается вверх.


PS: QWERYTY, уважаемый
8
16 февраля 2015 года
mfender
3.5K / / 15.06.2005
Вычислений меньше, я юзаю Mouse. Ну а вверьх прыгает на толщину бордюра формы. Его можно посчитать. Хотя, если есть нужда двигать форму правой кнопкой, догадываюсь там нет бордюра (BorderStyle = bsNone).
326
16 февраля 2015 года
sadovoya
757 / / 19.11.2005
Нашел намек на http://forum.vingrad.ru/topic-174737.html
Работает при нажатой левой клавише:
 
Код:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
const
  SC_DRAGMOVE = 61458;
begin
   ReleaseCapture();
   SendMessage(Handle, WM_SYSCOMMAND, SC_DRAGMOVE, 0);
end;
8
16 февраля 2015 года
mfender
3.5K / / 15.06.2005
В ТЗ написано чтобы правой двигать...
465
16 февраля 2015 года
QWERYTY
595 / / 25.03.2012
Да, натыкался на этот код, но он не работал при нажатой правой кнопке.

Осталось понять как заточить под правую кнопку.


PS:
Вот хрень. В чужих процессах запрещал перемещение окон, а тут в своём не могу передвинуть )))
326
16 февраля 2015 года
sadovoya
757 / / 19.11.2005
У ТС также написано:
Цитата:
Кстати, тоже интересно, как можно двигать форму левой кнопкой мыши.

465
16 февраля 2015 года
QWERYTY
595 / / 25.03.2012
Цитата: sadovoya
У ТС также написано:
Цитата:
Кстати, тоже интересно, как можно двигать форму левой кнопкой мыши.

Ну разумеется это интересно в контексте понять механизм, и переделать под правую )))
Изначально очевидно планировалось правой.

8
16 февраля 2015 года
mfender
3.5K / / 15.06.2005
Нет, я читать не разучился. В ТЗ написано только про правую:
Цитата:
Есть приложение на Delphi, которое состоит и формы (TForm) и текстового поля на ней (TLabel), такой вопрос, как кликнуть курсором по форме и держать правую кнопку мыши, что бы можно было двигать форму приложения по экрану?

326
16 февраля 2015 года
sadovoya
757 / / 19.11.2005
В ТЗ - да, но далее у ТС (топик-стартера), что я написал.
Менять назначения кнопок можно ф-цией SwapMouseButton.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог