Delphi 是否将OnMouseDown事件处理程序添加到VCL组件?
在Delphi 10.4.2 32位VCL应用程序中,我使用GetIt PackageManager中SVGI图像列表库中的组件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
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渲染器;它可能用于相当简单的图标。对于此类应用程序来说,它可能是一个非常好的库。)关于过滤:测试ifMsg.hwnd=MySvgIconImage.Handle
(假设您只有一个有问题的图标图像)。但修复基础问题可能是一个更好的主意。tagMSG有一个HWND成员。如果有句柄,您可以将其与TSVGIconImage.Handle进行比较。如果没有句柄,则可以检查容器的句柄(TPanel或TForm、TFrame等)并使用lparam成员中的坐标检查它是否与TSVGIconImage相对应。还使用lparam中的坐标查找用户单击的位置。@fpiette:TSVGIconImage
是一个TCustomControl
,因此它是一个窗口。现在您有了解决方案,是否可以根据dreas和我的评论?这样,下一个寻找信息的人就会准备好了。