1

我确实在末尾找到了一个:

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 方法的枚举。

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

编辑:

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

所以真的,我正在寻找的是一个上面有两个组件的屏幕。其中一个组件是可拖动的,另一个是目标。我需要能够识别拖放已经发生以及拖动者的身份......

4

2 回答 2

3

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

P:= FWinService.ScreenToClient(Self ,Point);
于 2013-10-18T19:13:54.797 回答
2

这是一个拖放示例,在 Firemonkey 桌面 (HD) 应用程序中使用 XE5 生成(因为您没有指定要尝试使用的平台):

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

点击Panel1窗体,然后切换到 Object Inspector 中的 Events 选项卡,为OnDragOver和事件添加以下两个OnDragDrop事件:

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 资源管理器拖放到面板上。

于 2013-10-18T19:56:48.137 回答