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

xoshrz7s  于 2023-03-29  发布在  其他
关注(0)|答案(2)|浏览(86)

使用TTreeView设置DragModedmAutomatic,我可以使用OnDragDropOnDragOver事件来处理拖放。但我不希望树中的特定TTreeNode能够被拖动。我想我需要使用dmManual,但我还没有找到如何做到这一点的示例,不知道这是否是必需的?
所以基本的问题是,如何防止特定的TTreeNode项被拖动(它可以是一个放置目标)?如果是dmManual,如何使用该模式?
TIA!

iq3niunx

iq3niunx1#

如果你想完全排除拖动启动,你必须使用dmManual模式,就像你写的那样,并在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值(如果你需要点击)

3wabscal

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;

相关问题