我的表单上有一个包含大量项目/节点的TreeView。当我双击一个节点的项目时,我运行一个程序(取决于所点击的项目)。我的问题是我只想在我点击节点的图标(+或 - 符号)时展开/折叠,如果我双击一个项目
答案 0 :(得分:3)
您可以使用OnCollapsing和OnExpanding事件的AllowCollapse和AllowExpand参数来阻止节点折叠或展开。
将其与适当的逻辑相结合,以识别被点击的节点部分。如果生成的点击在图标上,请让操作进度,如果没有,则忽略它(设置AllowXxxxx:= false)
但请注意不要破坏键盘导航。因此,您需要检查事件的来源,如果是键盘事件(光标左/右),请保留操作进度。
要跟踪创建者事件,请捕获OnMouseDown和OnKeyDown事件,并设置收到的最新事件类型的内部指示器,以便检查以后的OnCollapsing和OnExpanding事件过程。
答案 1 :(得分:1)
我知道,这不是一个好的解决方案,但它有效:)。
procedure TForm1.TWDblClick(Sender: TObject);
begin
TW.Items.BeginUpdate;
TW.Selected.Expanded:=not TW.Selected.Expanded;
TW.Items.EndUpdate;
end;
答案 2 :(得分:1)
unit TreeViewNav;
interface
uses
SysUtils, Classes, Controls, ComCtrls, Messages;
type
TNavTreeView = class(TTreeView)
private
procedure WMLButtonDblClk(var Message: TWMLButtonDblClk);
message WM_LBUTTONDBLCLK;
protected
FNoCollapse: Boolean;
function CanCollapse(Node: TTreeNode): Boolean; override;
end;
implementation
{ TNavTreeView }
function TNavTreeView.CanCollapse(Node: TTreeNode): Boolean;
begin
Result := not FNoCollapse and inherited;
FNoCollapse := False;
end;
procedure TNavTreeView.WMLButtonDblClk(var Message: TWMLButtonDblClk);
var
PX, PY: Integer;
HT: THitTests;
begin
with Message do
if (Width > 32768) or (Height > 32768) then
with CalcCursorPos do
begin
PX := X;
PY := Y;
end
else
begin
PX := XPos;
PY := YPos;
end;
HT := GetHitTestInfoAt(PX, PY);
if htOnItem in HT then
begin
FNoCollapse := True;
end;
inherited;
end;
end.
答案 3 :(得分:0)
如果您使用的是VirtalTreeView
TreeOptions.MiscOptions中有一个设置可以控制双击展开
toToggleOnDblClick 双击节点展开状态。