【问题标题】:Identify Component under mouse cursor does not work with TImage Control鼠标光标下的识别组件不适用于 TImage 控件
【发布时间】:2018-01-13 21:57:12
【问题描述】:

我正在使用以下过程来识别 Delphi XE3 中鼠标下的控件。对于vcl.contols,一切正常。但是,当鼠标悬停在 TImage 上时,不会返回控件名称。

procedure TMainForm.ApplicationEvents1Idle(Sender: TObject; var Done: oolean);    
var
  ctrl : TWinControl;
begin    
  ctrl := FindVCLWindow(Mouse.CursorPos);     
  if ctrl <> nil then begin    
    Label2.caption := ctrl.Name;    
    //do something if mouse is over TLabeledEdit    
    if ctrl is TLabeledEdit the begin    
      Caption := TLabeledEdit(ctrl).Text;    
    end;
  end;
end;

有没有一种简单的方法可以访问 TImage 的名称 - 我错过了一些非常简单的东西吗?

【问题讨论】:

  • 我找了一个例子使用 - FindDragTarget(const Pos: TPoint; AllowDisabled: Boolean): TControl
  • 我已经寻找了一个使用的例子 - FindDragTarget(const Pos: TPoint; AllowDisabled: Boolean): TControl 但是一直没能找到一个:(谁能指出我正确的方向或提供例子包括必须添加到“使用”部分的任何对象/项目?
  • 我的友好建议是停止成为“复制粘贴程序员”。通过阅读文档和自己思考来学习。您已被告知为什么 FindVCLWindow() 对您不起作用以及要使用什么功能。您还知道函数返回什么,将ctrl 变量更改为该类型。看帮助,如果你猜不出来,额外的AllowDisabled参数是什么意思。

标签: delphi vcl delphi-xe3


【解决方案1】:

FindVCLWindow 查找 TWinControl 的后代。由于TImage 不是窗口控件并且它不是从TWinControl 继承的,所以FindVCLWindow 将无法找到它。就像它无法在其祖先中找到任何其他没有 TWinControl 类的控件一样。

但是,有一个类似的函数FindDragTarget 将返回任何 VCL 控件,包括非窗口控件。

这个函数也在Vcl.Controls中声明,就像FindVCLWindow一样

function FindDragTarget(const Pos: TPoint; AllowDisabled: Boolean): TControl;

它有额外的参数 - AllowDisabled 控制它是否会返回禁用的控件。

你应该重写你的方法如下 - 注意ctrl必须被重新声明为TControl

procedure TMainForm.ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);
var
  ctrl : TControl;
begin
  ctrl := FindDragTarget(Mouse.CursorPos, true);
  if ctrl <> nil then
    begin
      Label2.caption := ctrl.Name;
      ...
    end;
end;

【讨论】:

  • 非常感谢 Dalija - 我的问题已解决 - 你是明星 ;)
  • 这是一颗宝石。谢谢。
猜你喜欢
  • 2022-11-26
  • 2019-03-22
  • 2012-09-28
  • 2018-10-08
  • 2021-05-17
  • 2013-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多