TVirtualStringTree - 如何在单击所选行的任何区域时启用拖动?

时间:2017-08-10 10:42:26

标签: delphi virtualtreeview tvirtualstringtree

我有一个toFullRowSelect的VST(有几列)。我想启用拖放功能放在节点上。

问题是,只有在节点标题上单击“直接”时,才能开始绘制节点。如果单击是在行选择上而不是在节点标题上,则拖动操作将不会启动,OnDragAllowed不会触发。

MCVE很简单。在表单上删除TVirtualStringTree(将其命名为VST)并为VST添加OnCreateOnDragAllowed

procedure TForm1.FormCreate(Sender: TObject);
begin
  VST.TreeOptions.SelectionOptions := VST.TreeOptions.SelectionOptions + [toFullRowSelect];
  VST.RootNodeCount := 5;
end;

procedure TForm1.VSTDragAllowed(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Column: TColumnIndex; var Allowed: Boolean);
begin
  Allowed := True;
end;

现在,如果单击节点标题,则会开始拖动操作,但如果您尝试拖动所选节点的其他区域则不会。

如何解决这个问题?感谢。

1 个答案:

答案 0 :(得分:3)

MiscOptions 选项集中包含 toFullRowDrag 选项:

procedure TForm1.FormCreate(Sender: TObject);
begin
  VST.TreeOptions.SelectionOptions := VST.TreeOptions.SelectionOptions + [toFullRowSelect];
  VST.TreeOptions.MiscOptions := VST.TreeOptions.MiscOptions + [toFullRowDrag];
  VST.RootNodeCount := 5;
end;

toFullRowDrag 选项位于源代码中:

  

通过单击其中的任意位置来启动节点拖动,而不是仅在   标题或图像。必须与toDisableDrawSelection一起使用。