TRzShellTree.OnDragOver 在将文件拖到其中一个节点上时从不调用
TRzShellTree.OnDragOver is never called when dragging a file over one of the nodes
在 Windows 10 in Delphi 11 Alexandria 的 32 位 VCL 应用程序中,我有一个 TRzShellTree
(来自 GetIt 中提供的 Konopka Signature VCL Controls 7.0):
object RzShellTree1: TRzShellTree
Left = 0
Top = 41
Width = 201
Height = 428
Align = alLeft
BaseFolder.Pidl = {
004301000014001F50E04FD020EA3A6910A2D808002B30309D19002F433A5C00
00000000000000000000000000000000000054003100000000003D5465581100
44454C50484900003E0009000400EFBE1423F90E42549B502E00000000930F00
000001000000000000000000000000000000DFED4800440045004C0050004800
4900000016005A0031000000000042546956100053757065724D525500004200
09000400EFBE2154F655425469562E000000210A000000004B00000000000000
0000000000000000C43CDA00530075007000650072004D005200550000001800
660031000000000042546F56100050524F4A45437E3100004E0009000400EFBE
4254695642546F562E00000043EB0A0000000B00000000000000000000000000
000008E22E00500052004F004A004500430054002000470052004F0055005000
5300000018000000}
Indent = 19
ReadOnly = True
SelectionPen.Color = clBtnShadow
TabOrder = 0
OnDragOver = RzShellTree1DragOver
end
...我尝试获取有关从 Windows 文件资源管理器拖动到 OnDragOver
事件处理程序中的节点之一的文件的信息:
procedure TForm1.RzShellTree1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
begin
CodeSite.Send('TForm1.RzShellTree1DragOver: Source.ClassName', Source.ClassName);
end;
具体来说,我需要获取拖到节点上的文件的文件路径。如果文件是特定类型(例如.DPROJ),我会设置var参数Accept = True
,然后进一步处理文件路径。
但不幸的是,当我将文件拖到其中一个节点上时,OnDragOver
事件处理程序从未被调用!
但我只需要接受特定的文件类型并将其显示给用户。我该怎么做?
如上评论所述,OnDragDrop 和 OnDragOver 事件专门用于 VCL 内部拖放,不参与 TRzShellTree 实现的 OLE Drag-and-drop 处理。更复杂的是,在 TRzShellTree 的 OLE Drag-and-drop 处理中没有出现任何事件。处理拖动功能的方法是虚拟的,但我认为这不会导致您想要的结果。
另一种选择是在选项 属性 中关闭 OleDrag 和 OleDrop 设置,并使用 DropMaster 组件来处理 Drag-and-Drop 功能。使用 DropMaster 可以更好地控制拖动操作。
在 Windows 10 in Delphi 11 Alexandria 的 32 位 VCL 应用程序中,我有一个 TRzShellTree
(来自 GetIt 中提供的 Konopka Signature VCL Controls 7.0):
object RzShellTree1: TRzShellTree
Left = 0
Top = 41
Width = 201
Height = 428
Align = alLeft
BaseFolder.Pidl = {
004301000014001F50E04FD020EA3A6910A2D808002B30309D19002F433A5C00
00000000000000000000000000000000000054003100000000003D5465581100
44454C50484900003E0009000400EFBE1423F90E42549B502E00000000930F00
000001000000000000000000000000000000DFED4800440045004C0050004800
4900000016005A0031000000000042546956100053757065724D525500004200
09000400EFBE2154F655425469562E000000210A000000004B00000000000000
0000000000000000C43CDA00530075007000650072004D005200550000001800
660031000000000042546F56100050524F4A45437E3100004E0009000400EFBE
4254695642546F562E00000043EB0A0000000B00000000000000000000000000
000008E22E00500052004F004A004500430054002000470052004F0055005000
5300000018000000}
Indent = 19
ReadOnly = True
SelectionPen.Color = clBtnShadow
TabOrder = 0
OnDragOver = RzShellTree1DragOver
end
...我尝试获取有关从 Windows 文件资源管理器拖动到 OnDragOver
事件处理程序中的节点之一的文件的信息:
procedure TForm1.RzShellTree1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
begin
CodeSite.Send('TForm1.RzShellTree1DragOver: Source.ClassName', Source.ClassName);
end;
具体来说,我需要获取拖到节点上的文件的文件路径。如果文件是特定类型(例如.DPROJ),我会设置var参数Accept = True
,然后进一步处理文件路径。
但不幸的是,当我将文件拖到其中一个节点上时,OnDragOver
事件处理程序从未被调用!
但我只需要接受特定的文件类型并将其显示给用户。我该怎么做?
如上评论所述,OnDragDrop 和 OnDragOver 事件专门用于 VCL 内部拖放,不参与 TRzShellTree 实现的 OLE Drag-and-drop 处理。更复杂的是,在 TRzShellTree 的 OLE Drag-and-drop 处理中没有出现任何事件。处理拖动功能的方法是虚拟的,但我认为这不会导致您想要的结果。
另一种选择是在选项 属性 中关闭 OleDrag 和 OleDrop 设置,并使用 DropMaster 组件来处理 Drag-and-Drop 功能。使用 DropMaster 可以更好地控制拖动操作。