【发布时间】:2010-01-01 18:33:40
【问题描述】:
我的表单上有一个包含大量项目/节点的 TreeView。当我双击节点的一个项目时,我运行一个过程(取决于单击的项目)。我的问题是我希望它仅在我单击节点的图标(+ 或 - 符号)时展开/折叠,如果我双击一个项目,则不会
【问题讨论】:
-
如果你不遵循该控件的约定,你会迷惑用户。
标签: delphi
我的表单上有一个包含大量项目/节点的 TreeView。当我双击节点的一个项目时,我运行一个过程(取决于单击的项目)。我的问题是我希望它仅在我单击节点的图标(+ 或 - 符号)时展开/折叠,如果我双击一个项目,则不会
【问题讨论】:
标签: delphi
您可以使用 OnCollapsing 和 OnExpanding 事件的 AllowCollapse 和 AllowExpand 参数来防止节点被折叠或展开。
将其与适当的逻辑相结合,以识别被点击的节点部分。如果生成的点击是在图标上,让动作继续进行,如果不是,则忽略它(设置 AllowXxxxx:=false)
但请注意不要破坏键盘导航。因此,您需要检查事件的来源,并在键盘事件(左/右光标)的情况下离开操作进度。
要跟踪发起者事件,捕获 OnMouseDown 和 OnKeyDown 事件,并设置一个内部指示符来指示最近收到的事件的类型,以便您检查以后的 OnCollapsing 和 OnExpanding 事件过程。
【讨论】:
我知道,这不是一个好的解决方案,但它有效:)。
procedure TForm1.TWDblClick(Sender: TObject);
begin
TW.Items.BeginUpdate;
TW.Selected.Expanded:=not TW.Selected.Expanded;
TW.Items.EndUpdate;
end;
【讨论】:
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.
【讨论】:
如果您使用的是 VirtalTreeView
TreeOptions.MiscOptions中有一个控制双击展开的设置
toToggleOnDblClick 双击时切换节点展开状态。
【讨论】: