| 
| 
 | Вопрос # 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;    showend;//------------------------------------------------------------------------------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; implementationprocedure 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) Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |