Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Совместное перемещение форм. [D5, D6, D7, Win95/98, WinXP]


Денис ©   (2004-06-23 01:20:00) 

Товарищи!
Кто нибудь в состоянии спокойно и без понтов объяснить, как наладить совместное перемещение  двух или нескольких форм по экрану при перемещении одной из них.
Вариант с таймером отпадает - слишком банально.
Буду очень признателен, а может быть и полезен.
Денис.


NAlexey   (2004-07-07 09:13:00) [1]

>Денис   (25.06.04 01:23) [3]
>Babay ©   (25.06.04 07:39) [4]
Я считаю что не всегда ваши примеры будут работать. WM_MOVE недостаточно.


Денис   (2004-07-07 04:46:00) [2]

Но ведь мы не можем двигать форму до того как она создана, почему тогда обрабатывается WMMove?


begin...end   (2004-07-02 08:54:00) [3]


> [6] Денис   (02.07.04 08:51)

Если форма не создана, то выходим.
Хотя это не очень правильный вариант.


Денис   (2004-07-02 08:51:00) [4]

Babay, ответь пожалуйста: что значит строка if not assigned(Form2) then exit;Никак не могу понять что это за  assigned такое и почему надо выходить(exit).
Заранее спасибо.


Babay   (2004-06-25 07:44:00) [5]

извиняюсь чето просмотрел
> Денис   (25.06.04 01:23) [3]
собственно это же и предложил :-)


Babay   (2004-06-25 07:39:00) [6]

может вот это подойдет

Для первой формы

TForm1 = class(TForm)
 .......
 procedure WMMove(var Msg: TWMMove); message WM_MOVE;
end;

........

procedure TForm1.WMMove(var Msg: TWMMove);
begin
 if not assigned(Form2) then exit;
// здесь ведем расчет позиции для второй формы
   form2.Top := Form1.Top + Form1.Height;
   form2.Left := Form1.Left;
end;


для второй формы

TForm2 = class(TForm)
 ....
 procedure WMMove(var Msg: TWMMove); message WM_MOVE;
end;

......

procedure TForm2.WMMove(var Msg: TWMMove);
begin
if not assigned(Form1) then exit;
// здесь ведем расчет позиции для 1 формы
form1.Top := Form2.Top - Form1.Height;
form1.Left := Form2.Left;
end;


в данном примере форма 2 находится под первой. Перетаскивание любой формы ведет к перетаскиванию второй за ней


Денис   (2004-06-25 01:23:00) [7]

И на том спасибо.
Мне тут один предложил:
type
TfrmMain = class(TForm)
private
procedure OnMove(var Msg: TWMMove); message WM_MOVE;
end;

procedure TfrmMain.OnMove(var Msg: TWMMove);
begin
inherited;
// здесь твой код, задавай координаты другой формы.
//например
// tnewform.left:=tfrmmain.left-100;
// tnewform.top:=tfrmmain.top-100;

end;

попробуй и ты.


GuAV   (2004-06-23 01:56:00) [8]


> Криво

Не то слово... вариант снимается :(


GuAV   (2004-06-23 01:46:00) [9]

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
var DragForm: TForm;
begin
 DragForm:=TForm.Create(nil);
 DragForm.Visible:=True;
 DragForm.Top:=0;
 DragForm.Left:=0;
 DragForm.ClientHeight:=Screen.Height;
 DragForm.ClientWidth:=Screen.Width;
 Form1.Parent:=DragForm;
 Form2.Parent:=DragForm;
 ReleaseCapture;
 DragForm.Perform(WM_SYSCOMMAND, $F012, 0);
 Form1.Parent:=nil;
 Form2.Parent:=nil;
 DragForm.Release;
end;

Криво, но идея такая: сделать это на Апи - создать прозрачное окно, куда их вставить и таскать это окно.


Наверх

Титульная страница Поиск, карта сайта Написать письмо