В вопросе пользователя рассматривается задача создания кнопки, которую можно перемещать по форме с помощью функции drag-and-drop. Для реализации такой возможности необходимо обработать события мыши, связанные с перемещением объекта.
Подготовка кнопки к перемещению
Сначала создадим кнопку, которая будет перемещаться. Для этого добавим обработчики событий OnMouseDown, OnMouseMove и OnMouseUp к кнопке. Эти события позволят пользователю захватывать кнопку и перемещать её по форме.
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure TableButtonMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure TableButtonMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure TableButtonMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
FTableButton: TButton;
FTableButtonDragging: boolean;
FMouseDownLocation: TPoint;
FButtonStartingLocation: TPoint;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
if not Assigned(FTableButton) then
begin
FTableButton := TButton.Create(nil);
FTableButton.Parent := Self;
FTableButton.Caption := 'Перетащи меня';
with FTableButton do
begin
Left := Random(Self.Width - Width);
Top := Random(Self.Height - Height);
OnMouseDown := @TableButtonMouseDown;
OnMouseMove := @TableButtonMouseMove;
OnMouseUp := @TableButtonMouseUp;
end;
end;
end;
procedure TForm1.TableButtonMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
FTableButtonDragging := True;
FMouseDownLocation.X := X;
FMouseDownLocation.Y := Y;
FButtonStartingLocation.X := FTableButton.Left;
FButtonStartingLocation.Y := FTableButton.Top;
end;
procedure TForm1.TableButtonMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if FTableButtonDragging then
begin
FTableButton.Left := FButtonStartingLocation.X + (X - FMouseDownLocation.X);
FTableButton.Top := FButtonStartingLocation.Y + (Y - FMouseDownLocation.Y);
FTableButton.Repaint;
end;
end;
procedure TForm1.TableButtonMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
FTableButtonDragging := False;
end;
end.
Обработка событий мыши
При нажатии на кнопку мыши (OnMouseDown) устанавливаем флаг FTableButtonDragging в True и запоминаем начальное положение мыши и кнопки. В обработчике OnMouseMove проверяем, идет ли в данный момент перетаскивание, и если да, то перемещаем кнопку на соответствующее расстояние. При отпускании кнопки мыши (OnMouseUp) сбрасываем флаг FTableButtonDragging.
Заключение
Таким образом, мы реализовали функцию перемещения кнопки по форме с помощью drag-and-drop. Это базовый пример, который можно расширить и улучшить, добавив дополнительные функции, такие как сохранение положения кнопки, ограничение области перемещения и т.д.
Создание кнопки в среде разработки Delphi, которая может быть перемещена по форме с использованием функции drag-and-drop.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.