【发布时间】:2011-10-02 20:00:49
【问题描述】:
我正在尝试编写一个简单的 firemonkey 测试应用程序。
我有一个带有面板的表单 (align:= alClient)。
表格上有 2 个TCircle。
我已经设置了 TCircle.Dragmode:= dmAutomatic。
我想拖动圆圈并在圆圈重叠时发生一些事情。
问题是:我在 TCircle 中没有看到任何称为重叠的方法,也没有看到称为重叠的事件。我已经尝试了所有 xxxxDrag 事件,但这对我的命中测试没有帮助。
如何查看被拖动的形状何时与另一个形状重叠?
我期待DragOver、DragEnter 事件之一为我检测到这一点,但似乎并非如此。
在 Firemonkey 中肯定有一些标准的方法吗?
现在 pas 文件看起来像:
implementation
{$R *.fmx}
procedure TForm8.Circle1DragEnter(Sender: TObject; const Data: TDragObject;
const Point: TPointF);
begin
if Data.Source = Circle1 then Button1.Text:= 'DragEnter';
end;
procedure TForm8.Circle1DragOver(Sender: TObject; const Data: TDragObject;
const Point: TPointF; var Accept: Boolean);
begin
if (Data.Source = Circle2) then Button1.Text:= 'Circle2 drag';
end;
procedure TForm8.Circle2DragEnd(Sender: TObject);
begin
Button1.Text:= 'DragEnd';
end;
procedure TForm8.Circle2DragEnter(Sender: TObject; const Data: TDragObject;
const Point: TPointF);
begin
Button1.Text:= 'DragEnter';
end;
procedure TForm8.Circle2DragLeave(Sender: TObject);
begin
Button1.Text:= 'DragLeave';
end;
procedure TForm8.Circle2DragOver(Sender: TObject; const Data: TDragObject;
const Point: TPointF; var Accept: Boolean);
begin
if Data.Source = Circle2 then begin
Button1.Text:= 'DragOver';
Accept:= true;
end;
end;
dfm 看起来像这样:
object Form8: TForm8
Left = 0
Top = 0
BiDiMode = bdLeftToRight
Caption = 'Form8'
ClientHeight = 603
ClientWidth = 821
Transparency = False
Visible = False
StyleLookup = 'backgroundstyle'
object Panel1: TPanel
Align = alClient
Width = 821.000000000000000000
Height = 603.000000000000000000
TabOrder = 1
object Button1: TButton
Position.Point = '(16,16)'
Width = 80.000000000000000000
Height = 22.000000000000000000
TabOrder = 1
StaysPressed = False
IsPressed = False
Text = 'Button1'
end
object Circle1: TCircle
DragMode = dmAutomatic
Position.Point = '(248,120)'
Width = 97.000000000000000000
Height = 105.000000000000000000
OnDragEnter = Circle1DragEnter
OnDragOver = Circle1DragOver
end
object Circle2: TCircle
DragMode = dmAutomatic
Position.Point = '(168,280)'
Width = 81.000000000000000000
Height = 65.000000000000000000
OnDragEnter = Circle2DragEnter
OnDragLeave = Circle2DragLeave
OnDragOver = Circle2DragOver
OnDragEnd = Circle2DragEnd
end
end
end
【问题讨论】:
-
是否允许使用像 CombineRgn 这样的 windows 函数,因为您的问题被标记为 firemonkey,这意味着您正在寻找独立于 windows 的解决方案?
-
您对哪种形状感兴趣?只有圆形、矩形、圆形矩形、椭圆和饼形,还是更多?
-
回应赏金的注释:鉴于问题的复杂性,FireMonkey 似乎不太可能提供比最基本和基本的命中测试更多的功能 - 如果有的话!寻找第三方游戏库可能会更好。
-
@CraigYoung,鉴于目标市场,firemonkey 支持这一点是有道理的,但我明白你的意思。
标签: delphi hittest delphi-xe2 firemonkey