Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.09.18;
Скачать: CL | DM;

Вниз

Как перемещать две формы ОДНОВРЕМЕННО?   Найти похожие ветки 

 
Sidex   (2005-08-24 16:27) [0]

Допустим, есть две формы. Необходимо при перемещении первой формы переместить вторую по тому же вектору перемещения (грубо говоря на то же расстояние по вертикали и горизонтали).
Пример: окна winamp"а (при перемещении плеера окно плейлиста перемещается вместе с ним).


 
Суслик ©   (2005-08-24 18:30) [1]

1. Если тебе нужно реализовать совместное перемещение форм в случае если курсор мышки нажат внутри формы, то это просто - нужно использовать события формы OnMouseDown, OnMouseMove, OnMouseUp

2. Если двигаешь форму за заголовок, то я НЕ знаю как сделать просто. Но вот этот код работает

unit Unit2;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs;

type
 TForm2 = class(TForm)
 private
    fX,fY: integer;
    fAnotherFormX,fAnotherFormY: integer;
    fDrugging: Boolean;
    procedure WMMove(var Message: TWMMove); message WM_MOVE;
    procedure WMSysCommand(var Message: TWMSysCommand); message WM_SYSCOMMAND;
    procedure WMExitSizeMove(var Message: TMessage); message WM_EXITSIZEMOVE;
 end;

var
 Form2: TForm2;

implementation

uses Unit3, Types;

{$R *.dfm}

procedure TForm2.WMMove(var Message: TWMMove);
begin
  if fDrugging then
  begin
     Form3.Left := fAnotherFormX + Mouse.CursorPos.X - fX;
     Form3.Top := fAnotherFormY + Mouse.CursorPos.Y - fY;
  end;
  inherited;
end;

procedure TForm2.WMSysCommand(var Message: TWMSysCommand);
begin
  if Message.CmdType = 61458 then
  begin
     fX := Message.XPos;
     fY := Message.YPos;
     fAnotherFormX := form3.left; // form3 - это переменная, содержащая форму,
                                  // которую двигаем вместе с текущей формой
     fAnotherFormY := form3.top;
     fDrugging := True;
  end;
  inherited;
end;

procedure TForm2.WMExitSizeMove(var Message: TMessage);
begin
  fDrugging := False;
  inherited;
end;

end.


 
Суслик ©   (2005-08-24 18:47) [2]

Тут поправочка по советам бывалых назрела

procedure TForm2.WMSysCommand(var Message: TWMSysCommand);
begin
  if Message.CmdType and $FFF0 = SC_MOVE then
  begin
     fX := Message.XPos;
     fY := Message.YPos;
     fAnotherFormX := form3.left;      
     fAnotherFormY := form3.top;
     fDrugging := True;
  end;
  inherited;
end;

procedure TForm2.WMExitSizeMove(var Message: TMessage);
begin
  fDrugging := False;
  Message.Result := 0;  
  inherited;
end;


 
Суслик ©   (2005-08-24 19:06) [3]

Бывалые товарищи дали свой код. См. здесь, если интересно http://delphimaster.net/view/4-1124894011/


 
Игорь Шевченко ©   (2005-08-24 19:09) [4]


>  fDrugging := False;


fDragging.

Drugging - это несколько из другой оперы ;)


 
Суслик ©   (2005-08-24 19:14) [5]


>  [4] Игорь Шевченко ©   (24.08.05 19:09)
>
> >  fDrugging := False;
> fDragging.
> Drugging - это несколько из другой оперы ;)


Согласен. Неточный термин.


 
Sidex   (2005-08-24 22:26) [6]

Всем спасибо.
Суслик, использовал твой способ. Дело в том, что мне как раз нужно было отследить начало перемещения окна, так как второе окно перемещается вместе с первым по конкретному условию (которое изменяется, стоит сдвинуть первое окно с места). А у тебя очень удобно применяется следующая конструкция:
вместо fDragging:=True ставлю if [условие] then fDragging:=True.



Страницы: 1 вся ветка

Текущий архив: 2005.09.18;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.038 c
1-1125071682
Andrej
2005-08-26 19:54
2005.09.18
Delphi 2005


2-1123734834
Patrick
2005-08-11 08:33
2005.09.18
Проблема с TStrings


14-1124697571
alles
2005-08-22 11:59
2005.09.18
Нужна утилитка


6-1117186897
Ильичев С.А.
2005-05-27 13:41
2005.09.18
Status Bar Internet Explorer


1-1125301876
chili
2005-08-29 11:51
2005.09.18
Подскажите как сделать PopupMenu (менюшку с большими значками)