Форум: "Основная";
Текущий архив: 2005.09.18;
Скачать: [xml.tar.bz2];
Вниз
Как перемещать две формы ОДНОВРЕМЕННО? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.014 c