Как передвинуть форму за любой элемент

Модератор: Модераторы

Как передвинуть форму за любой элемент

Сообщение minoshi » 20.10.2009 14:18:29

В интернете полно примеров для delphi, навроде такого:

Код: Выделить всё
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;


В этом примере мы считаем разницу между координатами мыши и координатами окна ("смещение"), а затем при движении выставляем координаты окна относительно координат мыши на размер "смещения".

Этот пример работает идельно. По крайней мере мне не удалось вылететь на пределы компонента, за который я таскал форму
Аватара пользователя
minoshi
постоялец
 
Сообщения: 279
Зарегистрирован: 17.05.2008 21:23:38

Re: Как передвинуть форму за любой элемент

Сообщение v-t-l » 20.10.2009 16:34:17

Код: Выделить всё
procedure LMNCHitTest(var Message: TLMNCHITTEST); message LM_NCHITTEST;

тоже в Lazarus не работает.
v-t-l
энтузиаст
 
Сообщения: 728
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Re: Как передвинуть форму за любой элемент

Сообщение Inferno » 21.10.2009 06:09:17

посмотри designer/designer.pp
Код: Выделить всё
    procedure MouseDownOnControl(Sender: TControl; var TheMessage: TLMMouse);
    procedure MouseMoveOnControl(Sender: TControl; var TheMessage: TLMMouse);
    procedure MouseUpOnControl(Sender: TControl; var TheMessage:TLMMouse);

там оно точно работает :)
Аватара пользователя
Inferno
новенький
 
Сообщения: 78
Зарегистрирован: 20.03.2009 14:40:20
Откуда: Тюмень


Вернуться в Общие вопросы

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6

Рейтинг@Mail.ru
cron