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

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

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

Delphi.int.ru Expert

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

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

#   

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


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

Подробнее »



Вопрос # 458

/ вопрос решён /

Здравствуйте. У меня к вам такой вопрос?
Есть две формы Form1 и Form2.
Form1.Width :=500;
Form1.Height := 300;
Form1.Left := 30;
Form1.Top := 30;
Form1.Visible := true;
Form2.Width :=500;
Form2.Height := 300;
Form2.Left := 0;
Form2.Top := 0;
Form2.Visible := true;
Разница только в параметрах Left и Top.
У меня вопрос, можно сделать так, чтобы
перетаскивая Form1 мышкой, Form2 перемещалась
вместе с ней, как будто они приклеенные.
Заранее благодарен.

Толков Геннадий Викторович Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: Толков Геннадий Викторович (статус: Посетитель)
Вопрос отправлен: 7 апреля 2007, 00:14
Состояние вопроса: решён, ответов: 2.

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

Можно, нужно для первой формы обрабатывать сообщение WM_MOVE. Это сообщение посылается форме, когда она пересовывается. Новые координаты второй формы всегда можно расчитать, зная координаты первой формы.
обработчик доделываем так.
В private разделе формы добавляем строку
procedure MyFormMove(var msgTMessage);message WM_MOVE;
и нажимаем Ctrl+Shift+C. Делфи сгенерит обработчик, в котором можно писать код

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 7 апреля 2007, 01:01
Оценка за ответ: 5

Ответ #2. Отвечает эксперт: Дима Гусаков

Здравствуйте, Толков Геннадий Викторович!

Код действует при нажатии мыши на поле формы

Приложение:
  1. var
  2. Form1: TForm1;
  3. CursorPos, FormPos: TPoint;
  4. Drag: boolean;
  5. ....
  6.  
  7. procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  8. Shift: TShiftState; X, Y: Integer);
  9. begin
  10. if Button = mbLeft then // ÷òîá íå "òàñêàëîñü" ïî íàæàòèþ ïðàâîé êíîïêè ìûøè
  11. begin
  12. Drag := True;
  13. // Çàïîìèíàåì ïîëîæåíèå îêíà â ìîìåíò íà÷àëà ïåðåòàñêèâàíèÿ
  14. FormPos.X := Left;
  15. FormPos.Y := Top;
  16. // Çàïîìèíàåì ïîëîæåíèå êóðñîðà â ìîìåíò íà÷àëà ïåðåòàñêèâàíèÿ
  17. GetCursorPos(CursorPos);
  18. end;
  19. end;
  20.  
  21. procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  22. Shift: TShiftState; X, Y: Integer);
  23. begin
  24. if Button = mbLeft then Drag := False;
  25. end;
  26.  
  27. procedure TForm1.OnIdle(Sender: TObject; var Done: boolean);
  28. var Point: TPoint;
  29. begin
  30. if Drag then
  31. begin// Ïðîâåðÿåì íàõîäèòñÿ ëè ôîðìà â ðåæèìå ïåðåòàñêèâàíèÿ
  32. GetCursorPos(Point); // Óçíà¸ì íîâûå êîîðäèíàòû êóðñîðà
  33. // Äâèãàåì îêîøêî
  34. Left := FormPos.X + Point.X - CursorPos.X;
  35. Top := FormPos.Y + Point.Y - CursorPos.Y;
  36.  
  37. Form2.Left := Left + Form1.Width;
  38. Form2.Top := Top;
  39. end;
  40. end;
  41.  
  42. procedure TForm1.FormCreate(Sender: TObject);
  43. begin
  44. Application.OnIdle := OnIdle;
  45. end;
  46.  


Ответ отправил: Дима Гусаков (статус: 2-ой класс)
Время отправки: 7 апреля 2007, 15:26
Оценка за ответ: 5


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

Всего сообщений: 0.

31 января 2011, 19:26: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)

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

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