防止在 TTreeView 中的特定 TTreeNode 上拖动?

问题描述 投票:0回答:2

使用

TTreeView
设置
DragMode
dmAutomatic
我可以使用
OnDragDrop
OnDragOver
事件来处理拖放。但我不希望树中的特定
TTreeNode
能够被拖动。我想我需要使用
dmManual
,但我还没有找到如何做到这一点的例子,想知道这是否是必需的?

所以基本问题是,如何防止特定的

TTreeNode
项目被拖动(它可以是放置目标)?如果
dmManual
,你如何使用那个模式?

TIA!!

delphi c++builder
2个回答
0
投票

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;

0
投票

如果你想完全排除拖动开始,你必须使用

dmManual
模式,如你所写,并在
BeginDrag
中设置
OnMouseDown

if (Button = mbLeft) and 
   (Treeview1.Selected <> nil) and 
   (Treeview1.Selected.Text > 'b') then
        TreeView1.BeginDrag(True);

在此示例中,带有

text='aa'
的节点未被拖动,而
node 'cc'
被拖动。

也许有时您还需要将

Immediate
更改为
False
并应用
Threshold
值(如果您需要点击)

© www.soinside.com 2019 - 2024. All rights reserved.