- Код: Выделить всё
- 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;
В этом примере мы считаем разницу между координатами мыши и координатами окна ("смещение"), а затем при движении выставляем координаты окна относительно координат мыши на размер "смещения".
Этот пример работает идельно. По крайней мере мне не удалось вылететь на пределы компонента, за который я таскал форму





