Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 858

/ вопрос открыт /

Здравствуйте, эксперты!
Как сделать чтобы форма перемещалась только в заданной области относительно рабочего окна или относительно mainform

seryoga Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: seryoga (статус: 1-ый класс)
Вопрос отправлен: 28 августа 2008, 11:44
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, seryoga!
Вообще то такое поведение считается плохим решением. Но сделать можно. в private часть обявления формы добавляем такое

private
  procedure MyMove(var msg:TMessage); message WM_MOVE);
потом жмём Ctrl+Shift+C
Появиться обработчик этого события. Оно будет вызываться всегда, как только пользователь попытается передвинуть форму. В самом обработчике анализируем свойства Left, top, width, height и принимаем решение. Если фома выходит за границы - просто двигаем назад, присвоив нужное значение свойствам.

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 28 августа 2008, 13:08

Ответ #2. Отвечает эксперт: Feniks

Здравствуйте, seryoga!
Все очень просто. Для этого надо ловить и обрабатывать сообщение WM_MOVING от Windows, которое посылается при перемещении формы.
Сначало в блоке Type добовляете запись:

TWmMoving = record
   Msg: Cardinal;
   fwSide: Cardinal;
   lpRect: PRect;
   Result: Integer;
  end;
Потом в блок private вашей формы добавляете объявление обработчика этого сообщения:
procedure WMMoving(var msg: TWMMoving); message WM_MOVING;
И уже в самом implementation пишем сам обработчик:
procedure TForm1.WMMoving(var msg: TWMMoving);
var
   BlockRect: TRect;
begin
   BlockRect.Left   := 100;
   BlockRect.Top    := 100;
   BlockRect.Right  := 600;
   BlockRect.Bottom := 600;
//   BlockRect := Screen.WorkareaRect;
  // compare the new form bounds in msg.lpRect^ with r and modify it if
  // necessary
   if msg.lprect^.left < BlockRect.left then
     OffsetRect(msg.lprect^, BlockRect.left - msg.lprect^.left, 0);
   if msg.lprect^.top < BlockRect.top then
     OffsetRect(msg.lprect^, 0, BlockRect.top - msg.lprect^.top);
   if msg.lprect^.right > BlockRect.right then
     OffsetRect(msg.lprect^, BlockRect.right - msg.lprect^.right, 0);
   if msg.lprect^.bottom > BlockRect.bottom then
     OffsetRect(msg.lprect^, 0, BlockRect.bottom - msg.lprect^.bottom);
   inherited;
end;
Имя переменной BlockRect типа записи как раз и отвечает за координаты допустимой зоны для перемещения формы.

P.S. Желаю удачи.

Ответ отправил: Feniks (статус: Бакалавр)
Время отправки: 28 августа 2008, 13:16


Мини-форум вопроса

Всего сообщений: 1; последнее сообщение — 28 августа 2008, 13:39; участников в обсуждении: 1.
Feniks

Feniks (статус: Бакалавр), 28 августа 2008, 13:39 [#1]:

А для того, что вообще заблокировать перемещение формы, используйте сдежующий код:
type
TyourForm = class(TForm)
private
   { Private declarations }
   procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;
end;
 
procedure TyourForm.WMNCHitTest(var Message: TWMNCHitTest);
begin
inherited;
with Message do
   if Result = HTCAPTION then
     Result := HTNOWHERE;
end;

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:47
Выполнено за 0.04 сек.