1

私は最後に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.

しかし、コンパイルしたくありません。Platform 識別子は宣言されていませんが、これは驚くべきことではありません。これは、コード内の他の場所には表示されないためです。

また、TPointF と TForm1 は互換性のない型です。これも私を驚かせません。

問題は、これらの問題のいずれかを修正する方法がわからないことです。

プラットフォームのタイプがどうあるべきかわかりません。私が TPlatform を推測したとき、それは ScreenToClient メソッドではなく単に列挙型であることに気付きました。

2 番目の問題は、私を完全に当惑させました。インスタンスが宣言されていないためにクラスを識別できないインスタンスのメソッドのパラメーターの型を、コンパイラーはどのように知ることができますか?

編集:

申し訳ありませんが、要件についてもっと明確にする必要がありました。ユーザーに製品の画像を表示し、ユーザーが一度に 1 つずつ画像を「比較」領域にドラッグできるようにするモバイル アプリを構築しようとしています。次に、ユーザーが比較ボタンをクリックすると、ユーザーが画像をドラッグ アンド ドロップした製品を比較する新しい画面に移動します。

つまり、私が探しているのは、2 つのコンポーネントが表示された画面です。コンポーネントの 1 つはドラッグ可能で、もう 1 つはターゲットです。ドラッグアンドドロップが発生したことと、ドラッグ対象の身元を認識できるようにする必要があります...

4

2 に答える 2

3

Delphi XE4 以降、FMX はプラットフォーム サービスを使用してこの種のメソッドを実装するようになりました。この場合、ScreenToClient関数はインターフェイスで定義されているため、フォームIFMXWindowServiceのフィールドを使用して、このサービスの実装へのインスタンスを取得できます。FWinServiceコードをコンパイルするには、Platform変数を次のFWinServiceようにフィールドに置き換えます。

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