Как перемещать круг с помощью мыши в delphi?

Как перемещать круг с помощью мыши в delphi?

circle:Shape;

person klaawz    schedule 04.03.2010    source источник
comment
Сколько у вас на данный момент? Представлен ли круг TShape компонентом или это что-то, что вы рисуете для себя на более крупном объекте холста?   -  person Rob Kennedy    schedule 05.03.2010
comment
Это TShape. Я не знаю, какое событие выбрать, чтобы круг двигался мышью.   -  person klaawz    schedule 05.03.2010


Ответы (3)


Обязательно конвертируйте клиентские координаты Mouse X, Y, которые вы получаете от MouseMove на вашем Control, в родительский клиент, используя ClientToScreen и ScreenToClient.

Следующая процедура перемещает центр Control в точку (X, Y) в его клиентских координатах:

procedure MoveControl(AControl: TControl; const X, Y: Integer);
var
  lPoint: TPoint;
begin
  lPoint := AControl.Parent.ScreenToClient(AControl.ClientToScreen(Point(X, Y)));
  AControl.Left := lPoint.X - AControl.Width div 2;
  AControl.Top := lPoint.Y - AControl.Height div 2;
end;

Теперь, чтобы переместить TShape при щелчке по нему, вы должны предоставить следующий обработчик событий MouseMove:

procedure TForm1.ShapeToMoveMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  if ssLeft in Shift then // only move it when Left-click is down
    MoveControl(Sender as TControl, X, Y);
end;

И чтобы проверить это, поместите в форму кнопку с таким кодом:

procedure TForm1.ButtonTestClick(Sender: TObject);
begin
  with TShape.Create(nil) do
  begin
    Name := Format('ShapeToMove%d',[Self.ControlCount + 1]);
    Parent := Self; // Parent will free it
    Shape := stCircle;
    Width := 65;
    Height := 65;
    OnMouseMove := ShapeToMoveMouseMove;
  end;
end;

Это минималистичный пример, но он должен помочь вам начать работу.
Для удовольствия просто подключите другие элементы управления с помощью этого обработчика событий MouseMove ... :-)

person Francesca    schedule 05.03.2010
comment
Я думал, что «владелец» освободил его, родитель передает сообщения, например, wm_paint. Я бы изменил конструктор на create (self) - person James Barrass; 05.03.2010
comment
Освободит его владелец или родитель, кто стреляет первым. Если это чисто визуально, вы можете оставить работу родителю, это его роль. - person Francesca; 05.03.2010

Если вы перейдете на мою веб-страницу, вы можете найти несколько примеров (все с включенным кодом), которые могут помочь вам в этом вопросе. «Образец для наглядной работы с фигурами и планами»; Используйте два компонента для визуального управления, перемещения, изменения размера и сохранения элементов; Один для выбора, перемещения, изменения размера ... (TSeleccOnRuntime) и другой (TSaveComps) для сохранения состояния (положение, размер, ...). http://neftali-mirror.site11.com/images/imagen_ej_restaurante.png

Выбрать фигуры визуально; Пример для объяснения двух режимов для визуального выбора форм и изображений.

Создавать, перемещать и повторно загружать элементы управления в среде выполнения (например, в IDE); Еще один образец компонента TSeleccOnRuntime. Моделируйте и IDE.

http://neftali-mirror.site11.com/images/image_ej_form_designer.png

И, наконец, еще один пример для Создание / уничтожение компонентов во время выполнения и перемещение с помощью мыши; Этот образец сделан без комплектующих. Весь код на образце.

http://neftali-mirror.site11.com/images/imagen_ej_mover_mouse.png

Я надеюсь, что это будет полезно для вас.
С уважением

П.Д .: Извините за мой плохой английский.

person Germán Estévez -Neftalí-    schedule 05.03.2010
comment
На вашем сайте есть ОЧЕНЬ хорошие компоненты. Компонент WMI работает отлично. Брайан. - person Brian Frost; 05.03.2010
comment
@Neftali: Не могли бы вы взглянуть на мой вопрос ниже? stackoverflow.com/questions/2386169/ - person Brian Frost; 05.03.2010

Что ж, у меня не так много подробностей, но если что-то движется, чтобы следовать за мышью, обычно работает следующим образом:

Имейте где-нибудь флаг "IsFollowingMouse". Включите его, когда вы должны следовать за мышью. В событии MouseMove формы сделайте что-то вроде этого:

procedure TMyForm.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if FIsFollowingMouse then
  begin
    myCircle.left := x + fShapeOffsetX;
    myCircle.top := y + fShapeOffsetY;
  end;
end;

Смещения - это переменные, которые вы используете, которые определяют разницу между положением указателя мыши и верхним левым углом TShape.

person Mason Wheeler    schedule 04.03.2010