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

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

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

Delphi.int.ru Expert

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

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

#   

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


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

DNK
I. DNK
Баллы: 5

Подробнее »



Вопрос # 1 292

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

Приветствую, уважаемые эксперты!
Для перемещения формы без заголовка я пользуюсь таким кодом:

const
SC_DragMove = $F012;
begin
ReleaseCapture;
perform(WM_SysCommand, SC_MOVE+2, 0);

но когда пытаешься переместить форму вверх экрана, то не получается поднять выше -25 форма возращается. но мне желательно чтобы форма поднималась выше. как это реализовать?

Примечание #1 (26 января 2008, 15:20):
форма имеет стиль bsNone, а на ней расположены несколько панелей

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

Вопрос задал: Виталий (статус: 2-ой класс)
Вопрос отправлен: 26 января 2008, 15:18
Состояние вопроса: открыт, ответов: 3.

Ответ #1. Отвечает эксперт: DoS

Здравствуйте, Виталий-1552!
Попробуйте добавить в раздел Private формы переменные Dragging: Boolean; OldX, OldY: Integer и сделать так:

Приложение:
  1. procedure TForm1.MouseDown(Sender: TObject; Button: TMouseButton;
  2. Shift: TShiftState; X, Y: Integer);
  3. begin
  4. If Button = mbLeft Then begin
  5. Dragging := True;
  6. OldX := X;
  7. OldY := Y;
  8. end;
  9. end;
  10.  
  11. procedure TForm1.MouseMove(Sender: TObject; Shift: TShiftState;
  12. X, Y: Integer);
  13. begin
  14. If Dragging Then Begin
  15. Left := Left + X - OldX;
  16. Top := Top + Y - OldY;
  17. End;
  18. end;
  19.  
  20. procedure TForm1.MouseUp(Sender: TObject; Button: TMouseButton;
  21. Shift: TShiftState; X, Y: Integer);
  22. begin
  23. Dragging := False;
  24. end;


Ответ отправил: DoS (статус: 1-ый класс)
Время отправки: 26 января 2008, 22:38

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

Здравствуйте, Виталий-1552!
Какое-то время назад Майкрософт ввела запрет на размещение формы за пределами экрана - много вирусов пользовалось этим, размещая там свои окна. Поднятие вверх ограничего 25 - так как это размер заголовка формы на вашем компьютере. у меня это 18. Их можно понять - не каждый мог отдвинуть окно назад, если видит только его низ. Так что рекомендую забросить эту идею, а реализовать по другому - например уменьшая размеры формы, когда она подъежает вверх.

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 27 января 2008, 14:23

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

Здравствуйте, Виталий-1552!
Если я правильно Вас понял, то Вам надо "тоскать" форму мышей не по заголовку, т.к. его нет.
Тогда я предлагаю Вам воспользоваться вот этим кодом. Я сам им пользуюсь в своих проектах.
На один Контрол делаете обработчик события OnMouseDown. Например на Panel1:

procedure TForm1.Panel1MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
Const
  SC_DragMove = $F012;  { a magic number }
begin
  ReleaseCapture;
  perform(WM_SysCommand, SC_DragMove, 0);
end;
На остальных Контролах указываете тотже обработчик. Таким образом, Вы сможете перемещать форму кликая по тем Контролам, у которых указан такой обработчик.

P.S. Я сомтрю Вы почти правильно написали, но ошиблись в одном месте... ;-)

Ответ отправил: Feniks (статус: Бакалавр)
Время отправки: 29 января 2008, 10:40


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

Всего сообщений: 1; последнее сообщение — 27 января 2008, 18:41; участников в обсуждении: 1.
Виталий

Виталий (статус: 2-ой класс), 27 января 2008, 18:41 [#1]:

ок спасибо

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

Версия движка: 2.6+ (26.01.2011)
Текущее время: 24 августа 2017, 02:09
Выполнено за 0.08 сек.
Рейтинг@Mail.ru