使用TTreeView设置DragModedmAutomatic,我可以使用OnDragDrop和OnDragOver事件来处理拖放。但我不希望树中的特定TTreeNode能够被拖动。我想我需要使用dmManual,但我还没有找到如何做到这一点的示例,不知道这是否是必需的?所以基本的问题是,如何防止特定的TTreeNode项被拖动(它可以是一个放置目标)?如果是dmManual,如何使用该模式?TIA!
TTreeView
DragMode
dmAutomatic
OnDragDrop
OnDragOver
TTreeNode
dmManual
iq3niunx1#
如果你想完全排除拖动启动,你必须使用dmManual模式,就像你写的那样,并在OnMouseDown中设置BeginDrag:
OnMouseDown
BeginDrag
if (Button = mbLeft) and (Treeview1.Selected <> nil) and (Treeview1.Selected.Text > 'b') then TreeView1.BeginDrag(True);
在本例中,不拖动text='aa'节点,而拖动node 'cc'节点。也许有时你还需要将Immediate改为False并应用Threshold值(如果你需要点击)
text='aa'
node 'cc'
Immediate
False
Threshold
3wabscal2#
在OnDragOver事件中,您可以测试所选的TTreeNode是否是您不希望拖动的节点,如果是,则可以拒绝拖动。例如:
procedure TMyForm.TreeView1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); var Node: TTreeNode; begin Accept := False; if Source = TreeView1 then begin Node := TreeView1.Selected; Accept := (Node <> nil) and (Node <> ANodeThatShouldNotBeDragged); end; end;
2条答案
按热度按时间iq3niunx1#
如果你想完全排除拖动启动,你必须使用
dmManual
模式,就像你写的那样,并在OnMouseDown
中设置BeginDrag
:在本例中,不拖动
text='aa'
节点,而拖动node 'cc'
节点。也许有时你还需要将
Immediate
改为False
并应用Threshold
值(如果你需要点击)3wabscal2#
在
OnDragOver
事件中,您可以测试所选的TTreeNode
是否是您不希望拖动的节点,如果是,则可以拒绝拖动。例如: