| 
| 
 | Вопрос # 1 858/ вопрос открыт / | 
 |  Здравствуйте, эксперты!Как сделать чтобы форма перемещалась только в заданной области относительно рабочего окна или относительно mainform
 
|  |   Вопрос задал: 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 (статус: Бакалавр), 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; |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |