Как передвинуть форму за любой элемент
Добавлено: 20.10.2009 14:18:29
В интернете полно примеров для delphi, навроде такого:
Однако, как это заставить работать в лазарусе лично я не придумал, до особо и не копал.
Другой очень распространенные пример (в примере двигаем за Timage) :
В примере запоминаются начальные координаты мыши, затем при движении формы считается на сколько сместилась мышь и настолько же смещается форма.
Этот пример в лазарусе работает, НО, если очень активно подвигать мышкой, то на мышь может "вылететь" на пределы timage (особенно если он маленький) и тогда отработать событие Image1MouseUp у вас не получится. Клавиша давно отпущена, а форма по-прежнему двигается.
Что делать?
Ответ прост до безобразия, а вот гугл такого не нашел. Для примера подвигаем форму за timage.
кинем на форму timage, timer1, выставляем свойство enabled = false, интервал примерно 50
событие ontimer = Timer1Timer.
У Timage событие onmousedown = imageMouseDown
событие onmouseup = imageMouseUp
прописываем глобальные переменные
заполняем :
В этом примере мы считаем разницу между координатами мыши и координатами окна ("смещение"), а затем при движении выставляем координаты окна относительно координат мыши на размер "смещения".
Этот пример работает идельно. По крайней мере мне не удалось вылететь на пределы компонента, за который я таскал форму
- Код: Выделить всё
procedure tform1.label1mousedown(sender: tobject; button: tmousebutton;
shift: tshiftstate; x, y: integer);
const sc_dragmove = $f012;
begin
releasecapture;
form1.perform(wm_syscommand, sc_dragmove, 0);
end;
Однако, как это заставить работать в лазарусе лично я не придумал, до особо и не копал.
Другой очень распространенные пример (в примере двигаем за Timage) :
- Код: Выделить всё
implementation
var x0,y0:integer;
move:boolean;
....
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
begin
move:=true;
x0:=x; //запоминаем начальные координаты
y0:=y; //запоминаем начальные координаты
end;
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
begin
if move then begin
image1.Left:=image1.Left+x-x0; // Изменяем позицию левого края
image1.Top:=image1.Top+y-y0; // Изменяем позицию верхнего края
end;
end;
procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
begin
move:=false;
end;
В примере запоминаются начальные координаты мыши, затем при движении формы считается на сколько сместилась мышь и настолько же смещается форма.
Этот пример в лазарусе работает, НО, если очень активно подвигать мышкой, то на мышь может "вылететь" на пределы timage (особенно если он маленький) и тогда отработать событие Image1MouseUp у вас не получится. Клавиша давно отпущена, а форма по-прежнему двигается.
Что делать?
Ответ прост до безобразия, а вот гугл такого не нашел. Для примера подвигаем форму за timage.
кинем на форму timage, timer1, выставляем свойство enabled = false, интервал примерно 50
событие ontimer = Timer1Timer.
У Timage событие onmousedown = imageMouseDown
событие onmouseup = imageMouseUp
прописываем глобальные переменные
- Код: Выделить всё
var
lcoor, tcoor : integer;
MyMouse: TMouse;
....
заполняем :
- Код: Выделить всё
procedure Tform1.imageMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
lcoor := MyMouse.CursorPos.x - left;
tcoor := MyMouse.CursorPos.y - top;
timer1.Enabled:= true;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if timer1.Enabled then
begin
left := MyMouse.CursorPos.x - lcoor;
top := MyMouse.CursorPos.y - tcoor;
end;
end;
procedure Tform1.imageMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
timer1.Enabled:= false;
end;
В этом примере мы считаем разницу между координатами мыши и координатами окна ("смещение"), а затем при движении выставляем координаты окна относительно координат мыши на размер "смещения".
Этот пример работает идельно. По крайней мере мне не удалось вылететь на пределы компонента, за который я таскал форму