Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 是否将OnMouseDown事件处理程序添加到VCL组件?_Delphi_Events_Notifications_Delphi 10.4 Sydney - Fatal编程技术网

Delphi 是否将OnMouseDown事件处理程序添加到VCL组件?

Delphi 是否将OnMouseDown事件处理程序添加到VCL组件?,delphi,events,notifications,delphi-10.4-sydney,Delphi,Events,Notifications,Delphi 10.4 Sydney,在Delphi 10.4.2 32位VCL应用程序中,我使用GetIt PackageManager中SVGI图像列表库中的组件TSVGIconImage 尽管组件支持OnDblClick事件处理程序,但它不支持OnMouseDown事件处理程序!也就是说,我可以通过双击对象检查器中的OnMouseDown事件来添加OnMouseDown事件处理程序,但是在运行时从未调用该事件处理程序: procedure TformMain.SVGIconImage1MouseDown(Sender: TOb

在Delphi 10.4.2 32位VCL应用程序中,我使用GetIt PackageManager中SVGI图像列表库中的组件
TSVGIconImage

尽管组件支持
OnDblClick
事件处理程序,但它不支持
OnMouseDown
事件处理程序!也就是说,我可以通过双击对象检查器中的
OnMouseDown
事件来添加
OnMouseDown
事件处理程序,但是在运行时从未调用该事件处理程序:

procedure TformMain.SVGIconImage1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  CodeSite.Send('called!'); // never called!
end;
TSVGIconImage
组件在
SVGIconImage.pas
中声明为:

TSVGIconImage=class(TCustomControl)

那么
TSVGIconImage
组件不应该从
TCustomControl
继承它的
OnMouseDown
事件吗

无论如何,如何在应用程序的代码中为
TSVGIconImage
添加一个工作
OnMouseDown
事件

编辑:在单独的VCL应用程序中测试后,我发现
TSVGIconImage
OnMouseDown事件处理程序在运行时正在那里工作。因此,在我的应用程序中阻止
TSVGIconImage
OnMouseDown事件处理程序的肯定是其他东西。我还需要找出原因。

A)在表单上放置一个
t应用程序事件
组件

B) 双击对象检查器中的
ApplicationEvents.OnMessage
事件,创建
OnMessage
事件处理程序,并为
WM\u LBUTTONDOWN
编写案例过滤器:

procedure TForm1.AppEvents1Message(var Msg: tagMSG; var Handled: Boolean);
begin
  case Msg.message of
    WM_LBUTTONDOWN:
      begin
        if Msg.hwnd = SVGIconImag1.Handle then
          DoSomething;
      end;
  end;
end;

感谢@AndreasRejbrand和@fpiette的建设性和有益的投入

您可以向开发人员报告这个问题,我已经报告过了:但是在我的应用程序代码中添加一个有效的
OnMouseDown
事件处理程序难道不可能吗?我查看了存储库,真的找不到任何奇怪的
TCustomControl
,这可以解释为什么
OnMouseDown
不起作用。因此,我有点不情愿地使用GetIt下载了这个库。在出现了很多错误之后(比如由于找不到发布的属性而导致演示项目无法运行),我使用
TSVGIconImage
制作了一个小的演示应用程序。我的第一印象是,这不是一个非常好的SVG渲染器:它是迄今为止我见过的最慢的SVG渲染器,并且它不能正确地渲染我的数学图。不过,
OnMouseDown
处理程序对我来说仍然有效!证据:(嗯,公平地说,该库可能不是100%兼容的高性能SVG 1.1渲染器;它可能用于相当简单的图标。对于此类应用程序来说,它可能是一个非常好的库。)关于过滤:测试if
Msg.hwnd=MySvgIconImage.Handle
(假设您只有一个有问题的图标图像)。但修复基础问题可能是一个更好的主意。tagMSG有一个HWND成员。如果有句柄,您可以将其与TSVGIconImage.Handle进行比较。如果没有句柄,则可以检查容器的句柄(TPanel或TForm、TFrame等)并使用lparam成员中的坐标检查它是否与TSVGIconImage相对应。还使用lparam中的坐标查找用户单击的位置。@fpiette:
TSVGIconImage
是一个
TCustomControl
,因此它是一个窗口。现在您有了解决方案,是否可以根据dreas和我的评论?这样,下一个寻找信息的人就会准备好了。