我正在寻找一个Delphi Firemonkey的拖放示例

时间:2013-10-18 18:51:58

标签: delphi drag-and-drop firemonkey delphi-xe5

我确实在最后找到了一个:

https://forums.embarcadero.com/thread.jspa?messageID=447850

unit Unit1;

interface

uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.Platform;

type
TForm1 = class(TForm)
Panel1: TPanel;
procedure DragDrop(const Data: TDragObject; const Point: TPointF);override;
procedure DragOver(const Data: TDragObject; const Point: TPointF; var Accept: Boolean);override;
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.DragDrop(const Data: TDragObject; const Point: TPointF);
var P: TPointF;
begin
P:= Platform.ScreenToClient(Form1,Point);
TPanel(Data.Source).Position.X:=P.X - TPanel(Data.Source).Width/2;
TPanel(Data.Source).Position.Y:=P.Y - TPanel(Data.Source).Height/2;

end;

procedure TForm1.DragOver(const Data: TDragObject; const Point: TPointF; var Accept: Boolean);
begin
Accept:=true;
end;

end.

但它不想编译。平台标识符是未声明的,这并不奇怪,因为它不会出现在代码中的任何其他位置。

此外,TPointF和TForm1是不兼容的类型。这也不让我感到惊讶。

问题是,我不知道如何解决这些问题。

我不知道平台应该是什么类型。当我猜到TPlatform时,我注意到它只是一个没有ScreenToClient方法的枚举。

第二个问题让我感到困惑。编译器如何知道某个实例的方法的参数类型,该实例的类无法识别,因为该实例未声明?

编辑:

对不起,我应该更清楚我的要求。我正在尝试构建一个移动应用程序,向用户显示产品图像,并允许用户将图像一次拖动到“比较”区域。然后用户点击比较按钮,我们转到一个新屏幕,比较用户拖放图像的产品。

所以真的,我正在寻找的是一个带有两个组件的屏幕。其中一个组件是可拖动的,另一个是目标。我需要能够认识到已经发生了拖放和拖网的身份......

2 个答案:

答案 0 :(得分:3)

从Delphi XE4开始,FMX现在使用Platform services来实现这种方法。在这种情况下,ScreenToClient函数在IFMXWindowService接口中定义,因此您可以使用表单的FWinService字段获取此服务实现的实例。要编译代码,只需将{em> Platform 变量替换为FWinService字段,如此

P:= FWinService.ScreenToClient(Self ,Point);

答案 1 :(得分:2)

以下是使用XE5在Firemonkey桌面(HD)应用程序中生成的拖放示例(因为您未指定要尝试使用的平台):

在表单上放置TPanel,将宽度放大到表单宽度的一半左右,然后在左边缘的面板上放置TLabel。将TLabel.AutoSize属性设置为True

单击表单上的Panel1,然后切换到Object Inspector中的Events选项卡,并为OnDragOverOnDragDrop事件添加以下两个事件:

procedure TForm1.Panel1DragDrop(Sender: TObject; const Data: TDragObject;
  const Point: TPointF);
begin
  Label1.Text := Data.Files[0];
end;

procedure TForm1.Panel1DragOver(Sender: TObject; const Data: TDragObject;
  const Point: TPointF; var Accept: Boolean);
begin
  Accept := Length(Data.Files) > 0;
end;

运行该应用程序,然后从面板上的Windows资源管理器中拖动任何文件并将其删除。