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

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

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

Delphi.int.ru Expert

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

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

#   

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


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

Подробнее »



Вопрос # 5

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

При перемещении одной формы нужно чтобы вторая перемещалась вместе с ней.

bruder Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: bruder (статус: 4-ый класс)
Вопрос отправлен: 11 мая 2006, 12:34
Состояние вопроса: решён, ответов: 4.

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

Для того, что бы отловить перемещение формы, необходимо перехватывать событие WM_MOVE. В обработчике просто запоминаем новые координаты, стравниваем со старыми, рассчитываем новые координаты для второй формы.

Приложение:
  1. ...
  2. type
  3. TfrmMain = class(TForm)
  4. private
  5. procedure OnMove(var Msg: TWMMove); message WM_MOVE;
  6. end;
  7. ...
  8. procedure TfrmMain.OnMove(var Msg: TWMMove);
  9. begin
  10. inherited;
  11. ...
  12. end;
  13. ...
  14.  
  15.  


Ответ отправил: Вадим К (статус: Академик)
Время отправки: 11 мая 2006, 13:40
Оценка за ответ: 4

Комментарий к оценке: В следующий раз не ленись и пиши исходник полностью. Я это и сам знаю, что нужно обрабатывать WM_MOVE. Сама проблема в координатах... Авансом тебе 4! :P

Ответ #2. Отвечает эксперт: Матвеев Игорь Владимирович

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

Приложение:
  1.  
  2. TForm1 = class(TForm)
  3. private
  4. { Private declarations }
  5. public
  6. { Public declarations }
  7. procedure WMMove(var Message: TMessage); message WM_MOVE;
  8. end;
  9.  
  10.  
  11. procedure TForm1.WMMove(var Message: TMessage);
  12. begin
  13.  
  14. if Form2 = nil then Exit;
  15. Form2.Left := Left+Width;
  16. Form2.Top := Top;
  17. end;


Ответ отправил: Матвеев Игорь Владимирович (статус: Студент)
Время отправки: 12 мая 2006, 12:43
Оценка за ответ: 5

Комментарий к оценке: Ну это так, "отписка". Главная цель достигнута - перемещение. А как же быть, если надо, чтобы вторая форма не сбоку плелась, а снизу? (и с других краёв и вообще не с краёв...) А вообще тема такая: вторая форма липнет к первой и при перемещении первой вторая, оставаясь прилипшей, движется за первой. Липкость уже готова, а вот с перемещением не очень... Получается так, что при резком перемещении вторая форма отлипляется и уже не перемещается :)

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

Когда-то я делал нечто подобное.
Кинул на форму таймер(стандартный компонент) и в его основном событии писал нечто вроде:

if Form2.Left > (Form1.Left + Form1.Width + 1) then Form2.Left := Form2.Left - 1;

Тоже самое для движения на право, вверх и вниз. Посчитаешь сам. Я надеюсь, идея ясна.

Интервал таймера ставишь по вкусу. Таким образом, вторая форма красиво, плавно догоняет первую и прилипает к ней.

Ответ отправил: Zeon (статус: 2-ой класс)
Время отправки: 12 мая 2006, 17:39
Оценка за ответ: 5

Комментарий к оценке: Напрягает только фраза : "Посчитаешь сам." ;) Эт не есть гуд! Ну в общем с таймером - оригинально...

Ответ #4. Отвечает эксперт: mvp

Форма два прилипает к форме 1 справа и снизу, при движении формы. По исходникам можете доделать и до прилипания слева и
сверху.

Приложение:
  1. Project1.dpr:
  2.  
  3. program Project1;
  4.  
  5. uses
  6. Forms,
  7. Unit1 in 'Unit1.pas' {Form1},
  8. Unit2 in 'Unit2.pas' {Form2};
  9.  
  10. {$R *.res}
  11.  
  12. begin
  13. Application.Initialize;
  14. Application.CreateForm(TForm2, Form2);
  15. Application.CreateForm(TForm1, Form1);
  16. Application.Run;
  17. end.
  18.  
  19. Unit1.pas
  20.  
  21. unit Unit1;
  22.  
  23. interface
  24.  
  25. uses
  26. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  27. Dialogs;
  28.  
  29. type
  30. TForm1 = class(TForm)
  31. procedure FormCreate(Sender: TObject);
  32. procedure FormMove(var Msg : TWMMove); message WM_MOVe;
  33. private
  34. lastx, lastY : integer;
  35. { Private declarations }
  36. public
  37. { Public declarations }
  38. end;
  39.  
  40. var
  41. Form1: TForm1;
  42.  
  43. implementation
  44.  
  45. uses Unit2;
  46.  
  47. {$R *.dfm}
  48.  
  49. procedure TForm1.FormCreate(Sender: TObject);
  50. begin
  51. lastx := Left;
  52. lastY := Top;
  53. show
  54. end;
  55. //------------------------------------------------------------------------------
  56. procedure TForm1.FormMove;
  57. var j : ^Rpos;
  58. begin
  59. inherited;
  60. new(j);
  61. j^.lastx := lastx;
  62. j^.lasty := lastY;
  63. j^.x := Left;
  64. j^.y := Top;
  65. j^.width := Width;
  66. j^.heigh := Height;
  67. postmessage(form2.Handle, wm_user + 1, 0, integer(j));
  68. lastx := left;
  69. lasty := top;
  70. end;
  71. //------------------------------------------------------------------------------
  72. end.
  73.  
  74. Unit2.pas
  75.  
  76. unit Unit2;
  77.  
  78. interface
  79.  
  80. uses
  81. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  82. Dialogs;
  83.  
  84. type
  85. RPos = record lastx, lasty, x, y, width, heigh : integer end;
  86. TForm2 = class(TForm)
  87. private
  88. procedure FormMove(var Msg : TMessage); message wm_user + 1;
  89. { Private declarations }
  90. public
  91. { Public declarations }
  92. end;
  93.  
  94. var
  95. Form2: TForm2;
  96.  
  97. implementation
  98. procedure Tform2.FormMove;
  99. var j : ^RPos;
  100. begin
  101. j := pointer(msg.LParam);
  102. if abs(j^.lastx + j^.width - self.Left) < 5 then begin
  103. self.left := j^.x + j^.width;//self.left + j^.x - j^.lastx;
  104. self.top := self.top + j^.y - j^.lasty
  105. end else if abs(j^.lasty + j^.heigh - self.top) < 5 then begin
  106. self.left := self.left + j^.x - j^.lastx;
  107. self.top := j^.y + j^.heigh;// self.top + j^.y - j^.lasty
  108. end;
  109. dispose(j)
  110. end;
  111.  
  112.  
  113. {$R *.dfm}
  114.  
  115. end.


Ответ отправил: mvp (статус: 4-ый класс)
Время отправки: 18 мая 2006, 12:33


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

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

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

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

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