|
Вопрос # 5/ вопрос решён / |
|
При перемещении одной формы нужно чтобы вторая перемещалась вместе с ней.
 |
Вопрос задал: bruder (статус: 4-ый класс)
Вопрос отправлен: 11 мая 2006, 12:34
Состояние вопроса: решён, ответов: 4.
|
Ответ #1. Отвечает эксперт: Вадим К
Для того, что бы отловить перемещение формы, необходимо перехватывать событие WM_MOVE. В обработчике просто запоминаем новые координаты, стравниваем со старыми, рассчитываем новые координаты для второй формы.
Приложение: Переключить в обычный режим- ...
- type
- TfrmMain = class(TForm)
- private
- procedure OnMove(var Msg: TWMMove); message WM_MOVE;
- end;
- ...
- procedure TfrmMain.OnMove(var Msg: TWMMove);
- begin
- inherited;
- ...
- end;
- ...
-
-
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 11 мая 2006, 13:40
Оценка за ответ: 4
Комментарий к оценке: В следующий раз не ленись и пиши исходник полностью. Я это и сам знаю, что нужно обрабатывать WM_MOVE. Сама проблема в координатах... Авансом тебе 4! :P
|
Ответ #2. Отвечает эксперт: Матвеев Игорь Владимирович
Вы должны обрабатывать сообщение WM_MOVE формы, оно происходит при изменении положения формы.
Приложение: Переключить в обычный режим-
- TForm1 = class(TForm)
- private
- { Private declarations }
- public
- { Public declarations }
- procedure WMMove(var Message: TMessage); message WM_MOVE;
- end;
-
-
- procedure TForm1.WMMove(var Message: TMessage);
- begin
-
- if Form2 = nil then Exit;
- Form2.Left := Left+Width;
- Form2.Top := Top;
- 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 справа и снизу, при движении формы. По исходникам можете доделать и до прилипания слева и
сверху.
Приложение: Переключить в обычный режим- Project1.dpr:
-
- program Project1;
-
- uses
- Forms,
- Unit1 in 'Unit1.pas' {Form1},
- Unit2 in 'Unit2.pas' {Form2};
-
- {$R *.res}
-
- begin
- Application.Initialize;
- Application.CreateForm(TForm2, Form2);
- Application.CreateForm(TForm1, Form1);
- Application.Run;
- end.
-
- Unit1.pas
-
- unit Unit1;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs;
-
- type
- TForm1 = class(TForm)
- procedure FormCreate(Sender: TObject);
- procedure FormMove(var Msg : TWMMove); message WM_MOVe;
- private
- lastx, lastY : integer;
- { Private declarations }
- public
- { Public declarations }
- end;
-
- var
- Form1: TForm1;
-
- implementation
-
- uses Unit2;
-
- {$R *.dfm}
-
- procedure TForm1.FormCreate(Sender: TObject);
- begin
- lastx := Left;
- lastY := Top;
- show
- end;
- //------------------------------------------------------------------------------
- procedure TForm1.FormMove;
- var j : ^Rpos;
- begin
- inherited;
- new(j);
- j^.lastx := lastx;
- j^.lasty := lastY;
- j^.x := Left;
- j^.y := Top;
- j^.width := Width;
- j^.heigh := Height;
- postmessage(form2.Handle, wm_user + 1, 0, integer(j));
- lastx := left;
- lasty := top;
- end;
- //------------------------------------------------------------------------------
- end.
-
- Unit2.pas
-
- unit Unit2;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs;
-
- type
- RPos = record lastx, lasty, x, y, width, heigh : integer end;
- TForm2 = class(TForm)
- private
- procedure FormMove(var Msg : TMessage); message wm_user + 1;
- { Private declarations }
- public
- { Public declarations }
- end;
-
- var
- Form2: TForm2;
-
- implementation
- procedure Tform2.FormMove;
- var j : ^RPos;
- begin
- j := pointer(msg.LParam);
- if abs(j^.lastx + j^.width - self.Left) < 5 then begin
- self.left := j^.x + j^.width;//self.left + j^.x - j^.lastx;
- self.top := self.top + j^.y - j^.lasty
- end else if abs(j^.lasty + j^.heigh - self.top) < 5 then begin
- self.left := self.left + j^.x - j^.lastx;
- self.top := j^.y + j^.heigh;// self.top + j^.y - j^.lasty
- end;
- dispose(j)
- end;
-
-
- {$R *.dfm}
-
- end.
 |
Ответ отправил: mvp (статус: 4-ый класс)
Время отправки: 18 мая 2006, 12:33
|
Мини-форум вопроса
Всего сообщений: 0.
31 января 2011, 19:56: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|