Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Перетаскивание компонентов в FireMonkey: особенности и решения для Delphi

Delphi , Синтаксис , Drag and Drop

Разработка приложений с использованием 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Drag and Drop ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-03-22 18:15:12/0.0033590793609619/0