Разработка приложений с использованием FireMonkey (FMX) в Delphi может включать в себя различные задачи, в том числе и перетаскивание компонентов. В отличие от VCL, который используется в классическом Delphi, FireMonkey имеет свои особенности, в том числе и в вопросах перетаскивания. В данной статье мы рассмотрим, как реализовать функционал перетаскивания компонентов на примере изображения, которое можно переместить с одной панели на другую.
Особенности перетаскивания в FireMonkey
Перетаскивание компонентов в FireMonkey осуществляется с помощью событий OnDragOver и OnDragDrop, которые аналогичны событиям из VCL. Однако, стоит отметить, что некоторые события, такие как OnStartDrag, отсутствуют в FireMonkey, и для реализации перетаскивания потребуется использовать другие подходы.
Пример перетаскивания компонента
Для демонстрации перетаскивания используем компонент TRoundRect. Ниже представлен пример кода, который позволяет перетаскивать компонент TRoundRect между панелями с помощью изменения его свойства DragMode.
unit Unit6;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.Objects;
type
TForm1 = class(TForm)
Panel1: TPanel;
Panel2: TPanel;
RoundRect1: TRoundRect;
procedure PanelDragOver(Sender: TObject; const Data: TDragObject; const Point: TPointF; var Accept: Boolean);
procedure PanelDragDrop(Sender: TObject; const Data: TDragObject; const Point: TPointF);
procedure RoundRect1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
private
public
end;
var
Form1: TForm1;
implementation
{$R *.fmx}
procedure TForm1.PanelDragDrop(Sender: TObject; const Data: TDragObject; const Point: TPointF);
begin
if ((data.Source <> nil) and (data.Source is TRoundRect) and (Sender is TPanel)) then
begin
with TRoundRect(data.Source) do
begin
Parent := TPanel(Sender);
Position.X := Point.X - (Width / 2); // Mouse cursor is center on the dragged object
Position.Y := Point.Y - (Height / 2);
DragMode := TDragMode.dmManual; // Disable drag by default
end;
end;
end;
procedure TForm1.PanelDragOver(Sender: TObject; const Data: TDragObject; const Point: TPointF; var Accept: Boolean);
begin
Accept := Data.Source is TRoundRect; // Can be moved
end;
procedure TForm1.RoundRect1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
begin
if Sender is TRoundRect then
begin
with TRoundRect(Sender) do
begin
if Button = TMouseButton.mbRight then
begin
Fill.Color := Fill.Color = claRed ? claBlue : claRed;
end
else
begin
DragMode := TDragMode.dmAutomatic; // Разрешить перетаскивание
end;
end;
end;
end;
end.
Подтвержденный ответ
Для реализации перетаскивания компонентов в FireMonkey необходимо использовать свойство DragMode. По умолчанию, если установить DragMode в dmManual, перетаскивание будет невозможно. Чтобы разрешить перетаскивание, следует установить значение DragMode в dmAutomatic в обработчике события OnMouseDown компонента, который вы хотите перетащить.
Альтернативный ответ
В коде, предоставленном выше, показано, как можно изменить свойство DragMode в зависимости от действий пользователя, например, при нажатии правой кнопки мыши компонент не будет доступен для перетаскивания, а при нажатии левой кнопки — будет.
Заключение
Перетаскивание компонентов в FireMonkey требует понимания особенностей работы с свойством DragMode и использования событий OnDragOver и OnDragDrop для обработки перетаскивания. Примеры кода, представленные в этой статье, помогут вам реализовать данный функционал в ваших проектах на Delphi.
Разработка функционала перетаскивания компонентов в интерфейсах, созданных с использованием FireMonkey в Delphi, и особенности реализации этого функционала.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.