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

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

Как сделатьмагнит? [D5, Win95/98]


Snake2000 ©   (2001-12-11 13:14:00) 

Интересный вопрос - как при перемещении формы наладить возможность примагничивания ее к краям экрана (как у WinAmp"а)???


Delirium   (2001-12-11 15:20:00) [1]

Я тут поэксперинтировал, думаю стоит самому форму вслед за мышой двигать, тогда всё упрощается:

var oX,oY,i:integer; B:boolean;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
B:=True;
i:=0;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if i=2 then
begin
B:=True;
i:=0;
end;
if (ssLeft in Shift) and B then
begin
B:=False;
SetWindowPos(Form1.Handle,
HWND_TOPMOST,
Form1.Left+X-oX,
Form1.Top+Y-oY,
Form1.Width,
Form1.Height,
SWP_DRAWFRAME);
// Сдвинул, и всё остальное сделал
end;
i:=i+1;
oX:=X;
oY:=Y;
end;


Snake2000   (2001-12-11 15:01:00) [2]

Ничерта не понял.... Объясни, плиз, поподробнее...


Delirium   (2001-12-11 14:49:00) [3]

Естественно - событие-то продолжает работать! Заведи глобальную переменную, которая после "примагничивания" становилась бы False и блокировала бы обработку. А в True можно превращать в OnMouseDown :)


snake2000   (2001-12-11 14:40:00) [4]

Все работает, но только форма мигает при примагничивании, а кусок кода вот:

procedure TForm1.OnMove(var Msg:TMessage);
begin
if Form1.Left <50 then Form1.Left:=0;
if Form1.Top <50 then Form1.Top:=0;

if Form1.Left >Screen.Width-50-Form1.width then
Form1.Left:=Screen.Width-Form1.width;

if Form1.Top >Screen.Height-50-Form1.height then
Form1.Top:=Screen.height- Form1.height;
end;
end;


Delirium   (2001-12-11 14:39:00) [5]

А как это в процессе? Естествено, после каждого минимального премещения.


snake2000   (2001-12-11 14:28:00) [6]

А когда возникает это событие - в процессе движения, или только после его завершения?


Delirium   (2001-12-11 14:23:00) [7]

Ну так отслеживай в том-же событии Top и Left !
Размер экрана: Screen.Height и Screen.Width :)


snake2000   (2001-12-11 14:21:00) [8]

Мне нужно чтобы к краям экрана примагничивалась!!!


Delirium   (2001-12-11 14:12:00) [9]

А сколько надо? Последний пример более грамотный - так и надо делать, можешь прописать это событие во все свои формы :)


snake2000   (2001-12-11 14:09:00) [10]

А почему 2 формы : 1 и 2 ???


Delirium   (2001-12-11 13:57:00) [11]

А если поискать в Help-е, то так :

...
procedure OnMove(var Msg:TMessage); message WM_MOVE;
...
procedure TForm1.OnMove(var Msg:TMessage);
begin
if Form2<>nil then
begin
Form2.Left:=Form1.Left+Form1.Width;
Form2.Top:=Form1.Top;
end;
end;


snake2000   (2001-12-11 13:56:00) [12]

Спасибо.. Сейчас попробую....


Delirium   (2001-12-11 13:50:00) [13]

Попробуй :)

procedure TForm1.Timer1Timer(Sender: TObject);
begin // Interval=1
Form2.Left:=Form1.Left+Form1.Width;
Form2.Top:=Form1.Top;
end;


Наверх

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