Показать сообщение отдельно
  #9  
Старый 07.06.2013, 04:48
Аватар для seeman_tm
seeman_tm seeman_tm вне форума
Новичок
 
Регистрация: 03.02.2011
Сообщения: 79
Репутация: -2306
По умолчанию

Цитата:
Сообщение от Alegun
Надеюсь, ТС соизволит всё же показать, хоть на пальцах, что в итоге должно быть
Не соответствуешь подписи.

Что касательно убегающей кнопки.
Её всё же можно зажать в углу и кликнуть по ней, но это уже не важно.
Вот код.
Код:
procedure TForm3.btn17MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
FormMouseMove2(btn17.Left + X, btn17.Top + Y);
end;

procedure TForm3.FormMouseMove2(X,Y: Integer);
Var XButtonCenter, YButtonCenter: Integer;
Var XButtonLeft, YButtonLeft: Integer;
Var XButtonRight, YButtonRight: Integer;
Var XButtonTop, YButtonTop: Integer;
Var XButtonDown, YButtonDown: Integer;
begin
  XButtonCenter := btn17.Left + (Btn17.Width div 2);
  YButtonCenter := btn17.Top + (Btn17.Height div 2);
  XButtonLeft := btn17.Left;
  YButtonLeft := YButtonCenter;
  XButtonRight := btn17.Left + Btn17.Width;
  YButtonRight := YButtonCenter;
  XButtonTop :=  XButtonCenter;
  YButtonTop := btn17.Top;
  XButtonDown := XButtonCenter;
  YButtonDown := btn17.Top + Btn17.Height;

      // Если мышка ближе к правой стороне
      if (X - XButtonLeft) > (XButtonRight - X) then
          // Кнопка убегает в лево
          Begin
            // Если кнопка не подошла к левому краю формы
            if XButtonLeft > 1 then
                //  Смещаем кнопку в лево
                Begin
                  btn17.Left := btn17.Left - 1;
                End;
          End
            // Иначе убегает в право
            Else
              Begin
                // Если кнопка не подошла к левому краю формы
                if XButtonRight < (Form3.Width-16) then {Пометка: -16 взято для учёта кантика формы}
                  //  Смещаем кнопку в право
                  Begin
                  btn17.Left := btn17.Left + 1;
                  End;
              End;

        // Если мышка ближе к нижней стороне
        if (Y - YButtonTop) > (YButtonDown - Y) then
            // Кнопка убегает в верх
            Begin
              // Если кнопка не подошла к верхнему краю формы
              if YButtonTop > 1 then
                  //  Смещаем кнопку в верх
                  Begin
                    btn17.Top := btn17.Top - 1;
                  End;
            End
              // Иначе убегает в низ
              Else
                Begin
                    // Если кнопка не подошла к нижнему краю формы
                    if YButtonDown < (Form3.Height-38) then {Пометка: -38 взято для учёта кантика формы}
                        //  Смещаем кнопку в низ
                        Begin
                            btn17.Top := btn17.Top + 1;
                        End;
                  End;

  Form3.Caption := 'mx:= '+IntToStr(X)+'  my:= '+ IntToStr(Y)+ '  bx:= '+IntToStr(btn17.left)+'  by:= '+ IntToStr(btn17.Top);
end;

К стати, обрабатывать перемещение мыши надо не от формы, а кнопки.
Потому что когда мышка попадает на кнопку, форма больше не может отследить перемещение курсора.

Это не самый эффективный код, так как в нём всё ещё имеется мусор (Сложно-читаемые выражения и большие значения переменных), возникший из-за привязки к форме в самом начале.

ХМ. А хотя нет, всё верно, иначе ни как.
Ответить с цитированием