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

Вниз

Как сделатьмагнит?   Найти похожие ветки 

 
Snake2000   (2001-12-11 13:14) [0]

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


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

Попробуй :)

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


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

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


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

А если поискать в 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 14:09) [4]

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


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

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


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

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


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

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


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

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


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

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


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

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

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:49) [11]

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


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

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


 
Delirium ©   (2001-12-11 15:20) [13]

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

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;




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

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

Наверх




Память: 0.49 MB
Время: 0.014 c
7-18999
Alexx
2001-10-31 08:40
2002.02.07
Работа с сетевой картой


3-18712
Bura
2002-01-10 00:44
2002.02.07
IB


1-18878
tovSuhov
2002-01-23 12:28
2002.02.07
Доэкспериментировался...


7-19010
@andrew
2001-10-30 10:25
2002.02.07
Привет Всем! Посоветуйте!


1-18825
vrRaven
2002-01-25 16:15
2002.02.07
Проблема с Copy()