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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.10.2011, 16:06   #1
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию Перетягивание формы вручную

Добрый день. У меня есть форма c BorderStyle:=None, мне нужно сделать возможность перетягивания формы за черную полоску вверху(Rectangle(0,0,Width,10)). Вроде бы все правильно, но форма летает из стороны в сторону. Прошу делать приоритет на этот способ(т.к. я пробовал много других), а потом уже советовать что-то другое.
Код:
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
if  (X>0) and (X<form1.Width)and(Y>0) and (Y<10) then begin
   Xf:=X-Form1.Left;
   Yf:=Y-Form1.Top;
   MouseDown:=True;
 end;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
if MouseDown=False then exit;

Form1.Left:=X-Xf;
Form1.Top:=Y-Yf;
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin

 Form1.Left:=X-Xf;
 Form1.Top:=Y-Yf;
 MouseDown:=False;
end;
Заранее благодарю.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 26.10.2011, 16:13   #2
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

Ваш способ, если быть честным - это сродни изобретению велосипеда с трапециевидными колесами... Есть же стандартный способ, который можно найти в инете за минуту... Вот пример:
http://devdelphi.ru/?p=337

Нужная Вам выдержка из статьи:

Цитата:
сделаем перемещение формы за любой ее элемент. Для этого мы будем использовать обработку сообщения WMNCHitTest.

Объявим процедуру в спецификаторе доступа private - procedure WMNCHitTest(var M: TWMNCHitTest); message wm_NCHitTest;

Далее установим курсор на данную процедуру и нажмем Ctrl+Shift+C, после чего у нас появится заготовка нашей процедуры.

Теперь напишем следующий код в нашей процедуре:

Код:
procedure TForm1.WMNCHitTest(var M: TWMNCHitTest);
begin
inherited;
 if  M.Result = htClient then
   M.Result := htCaption;
end;
Что мы здесь тут делаем, мы просто нашему результату присваиваем заголовок. То есть, за какую бы область наш курсор на форме не был зажат всегда будет думать, что это заголовок и свободно можно перемещать форму за любую ее область.

PS: //offtop: гы-гы, гратс меня с 555-м сообщением)))
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}

Последний раз редактировалось Johnson; 26.10.2011 в 16:16.
Johnson вне форума Ответить с цитированием
Старый 26.10.2011, 17:20   #3
tsar_
Форумчанин
 
Аватар для tsar_
 
Регистрация: 06.01.2011
Сообщений: 369
По умолчанию

Цитата:
Прошу делать приоритет на этот способ(т.к. я пробовал много других), а потом уже советовать что-то другое.
Сразу посоветую что-то другое.
Вот две процедуры:
Код:
//процедура перетаскивания
procedure TForm1.move;
begin
 ReleaseCapture; //освобождаем захват мыши
 //перенаправляем его в заголовок
 SendMessage(Form1.Handle, WM_NCLBUTTONDOWN, HTCAPTION, 0);
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 //если курсор в нужной области, то форма двигается
 if Y<10 then move; //этого достаточно
end;
Программирую по необходимости
tsar_ вне форума Ответить с цитированием
Старый 26.10.2011, 17:31   #4
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Спасибо. Помогло. Я рассматривал этот способ, но не додумался ввести условие.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 26.10.2011, 20:13   #5
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Метод пеpетаскивания фоpмы не только за заголовок, а вообще за любой компонент:
Код:
procedure TForm1.Form1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
ReleaseCapture;
Perform (WM_SYSCOMMAND,SC_MOVE+2,0);
end;
Этот кусочек соpца надо подцеплять в обpаботчик OnMouseDown контpола, за
котоpый будем таскать.

Сто раз уже рассматривалось.
Получите "ФУ" за неиспользование поиска по форуму !
mihali4 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Заполнение матрицы вручную Neitrosha Помощь студентам 1 30.11.2010 17:41
График вручную Heming Помощь студентам 0 18.10.2010 13:44
Delphi. Перетягивание изображения ugagaga Помощь студентам 3 12.12.2009 02:40
Подскажите, как сделать что бы перетягивание форм происходило одновременно! •ScReam•™ Помощь студентам 1 19.06.2009 00:45
Копирование *.exe вручную v01umE Общие вопросы C/C++ 4 06.07.2008 20:06