TreeView问题(继续) ( 积分: 50 )

  • 主题发起人 主题发起人 simonlyr
  • 开始时间 开始时间
S

simonlyr

Unregistered / Unconfirmed
GUEST, unregistred user!
kk2000富翁已经回答了我的TreeView关于CheckBox的问题。但我递归显示父节点对应下面的子节点联动问题,却不能实现。郁闷啦!问题是:父节点选中,其子节点完全被选中;相反完全取消。同样的,子节点全部选中,其父节点选中;相反,子节点全部取消,其父节点取消。怎么实现?我这方面研究不多,谢谢回复
谢谢各位高手继续出招,kk2000不要笑话哦,我这几天思路短路,敬请谅解!
 
//下面是全部选中的当前节点的包含的所有节点, 会做这个其他的要求就基本上了
procedure TForm1.AllCheckNode(ANode: TTreeNode);
var
vNode: TTreeNode;
begin
while ANode <> nil do
begin
ANode.StateIndex := 1; //图片索引是1 是选中
vNode := ANode.getFirstChild;
AllCheckNode(vNode); //递归调用
vNode := ANode.getNextSibling; //获取下一个兄弟节点
end;
end;
 
好像是死循环呀,我再试试
 
但是:我TreeView启动时我显示CheckBox的,代码如下:
procedure TForm1.SetComCtrlStyle(WinCtrl: TWinControl; Value: Integer;
UseStyle: Boolean);
var
Style: Integer;
begin
if WinCtrl.HandleAllocated then
begin
Style := GetWindowLong(WinCtrl.Handle, GWL_STYLE);
if not UseStyle then
Style := Style and not Value
else Style := Style or Value;
SetWindowLong(WinCtrl.Handle, GWL_STYLE, Style);
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
SetComCtrlStyle(TreeView1, TVS_CHECKBOXES, True);
end;
这样你的代码:
procedure TForm1.AllCheckNode(ANode: TTreeNode);
var
vNode: TTreeNode;
begin
while ANode <> nil do
begin
ANode.StateIndex := 1; //图片索引是1 是选中
vNode := ANode.getFirstChild;
AllCheckNode(vNode); //递归调用
vNode := ANode.getNextSibling; //获取下一个兄弟节点
ANode :=vNode;//新增加的一行
end;
end;
就没有作用了。ANode.StateIndex := 1; //图片索引是1 是选中---没有作用
 
没有人回答吗?
 
//你使用下面这个函数设置选中与不选中看看! 其中Check : true 是选中, 反之取消
const
TVS_CHECK = $2000;
procedure TXTreeView.SetNodeState(Node: TTreeNode; Check: Boolean);
var
TvItem: TTVItem;
begin
if Node = nil then Exit;
FillChar(TvItem, Sizeof(TvItem), 0);
TvItem.hItem := Node.ItemId;
TvItem.mask := TVIF_STATE;
TvItem.stateMask := TVIS_STATEIMAGEMASK ;
if Check then
TvItem.state := TVS_CHECK
else
TvItem.state := TVS_CHECK shr 1;
TreeView_SetItem(Node.TreeView.Handle, TvItem);
end;
 
kk2000:经过修改,基本上可以了。完整代码:
procedure TForm1.SetNodeState(Node: TTreeNode; Check: Boolean);
var
ParentNode,
ParentNode_First,
vNode: TTreeNode;
TvItem: TTVItem;
begin
if Node = nil then Exit;
TreeView_Sum :=TreeView_Sum + 1;
while Node <> nil do
begin
ParentNode :=Node.Parent ;
if isParent = false then
begin
if (TreeView_Sum = 1) and
(ParentNode = nil) //选择的是顶级节点
then
isParent :=true
else
begin
if (TreeView_Sum = 1) and
(ParentNode <> nil) //选择的不是顶级节点
then
begin
isParent :=true;
ParentNode_First :=Node.Parent;
end
else
isParent :=false;
end;
end;
//开始递归循环
vNode := Node.getFirstChild;
FillChar(TvItem, Sizeof(TvItem), 0);
TvItem.hItem := Node.ItemId;
TvItem.mask := TVIF_STATE;
TvItem.stateMask := TVIS_STATEIMAGEMASK ;
if Check then
TvItem.state := TVS_CHECK
else
TvItem.state := TVS_CHECK shr 1;
TreeView_SetItem(Node.TreeView.Handle, TvItem);
SetNodeState(vNode, Check);
vNode := Node.getNextSibling; //获取下一个兄弟节点

if vNode <> nil then
begin
Node :=vNode;
if vNode.Parent =ParentNode_First then
exit;
end
else
exit;

if isParent = false then
begin
if (ParentNode <> nil) and
(ParentNode = vNode.Parent)
then //是同级别兄弟节点
exit;
end;

end;
end;
再次谢谢kk2000,加分了!
 
后退
顶部