Delphi TreeView CheckBox的控制問題!

grjs2004 2008-07-06 10:40:56
我在網上找到了TreeView顯示Chekbox的代碼
SetWindowLong(TreeView1.Handle, GWL_STYLE, GetWindowLong(TreeView1.Handle, GWL_STYLE) or $00000100);

現在想對TreeView1的沒有個樹節點進行一些控制:
1、子節點與其父節點勾選的狀態一致;
2、其中一個子節點取消勾選,其父節點也取消勾選,其他子節點不受影響;
3、保存樹的節點狀態.

最好寫成一個公用類,方便調用。

在網上找了很久,都沒有滿意的例子。
我相信有人已經解決了以上問題,在很多論壇裡,很多人都說很容易,但是就是不肯寫出具體的例程。

現在隻有開貼求答了!
請高手們不吝賜教!謝謝!
...全文
864 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
wywry 2008-07-07
  • 打赏
  • 举报
回复
如果复杂一些的话,可以下载一个:

http://www.2ccc.com/article.asp?articleid=4247

http://bbs.yd153.com
hongqi162 2008-07-07
  • 打赏
  • 举报
回复

你可以不用第三方控件,但是你可以参考里面的代码啊,你可以下载一下看看里面的源码是怎么实现的,下面是这个控件的父子节点互动的例子。


procedure TFormMain.tvToggleCheckbox(TreeView: TfcCustomTreeView;
Node: TfcTreeNode);
var CurNode, ParentNode, GrandSonNode: TfcTreeNode;
flg1: boolean;
begin
inherited;
if Node.CheckboxType<>tvctCheckbox then Exit;
with TreeView do begin
if Node.Checked then //判断父是否为灰
begin
ParentNode:= Node.Parent; //父;
if ParentNode<>nil then
begin
GrandSonNode := ParentNode.GetFirstChild; //遍历子树;
flg1 := false;
while GrandSonNode<>nil do
begin
if (not GrandSonNode.Checked) or (GrandSonNode.Grayed) then //true,有未选中
flg1 := true;
if flg1 then //已有、退出loop;
GrandSonNode := nil
else
GrandSonNode := GrandSonNode.GetNextSibling;
end;
if flg1 then
ParentNode.Grayed := true
else
ParentNode.Grayed := false;
ParentNode.Checked := true; //return;
end;
end;
if Node.checked and (not Node.Grayed) then //选中/不灰,子全选
begin
CurNode := Node.GetFirstChild; //子全选;
while CurNode<>nil do
begin
CurNode.Checked := true; //return;
CurNode := CurNode.GetNextSibling;
end;
end;
if not Node.Checked then //未选中
begin
CurNode := Node.GetFirstChild;
while CurNode<>nil do
begin
CurNode.Checked := false;
CurNode := CurNode.GetNextSibling;
end;
end;
if not Node.Checked then //判断父是否为灰
begin
ParentNode := Node.Parent; //父;
if ParentNode<>nil then
begin
GrandSonNode := ParentNode.GetFirstChild; //遍历子树;
flg1 := false;
while GrandSonNode<>nil do
begin
if (GrandSonNode.Checked) or (GrandSonNode.Grayed) then //true,有选中
flg1 := true;
if flg1 then //已有、退出loop;
GrandSonNode := nil
else
GrandSonNode := GrandSonNode.GetNextSibling;
end;
if flg1 then
begin
ParentNode.Grayed := true;
ParentNode.Checked := true; //return;
end
else
begin
ParentNode.Grayed := false;
ParentNode.Checked := false; //return;
end;
end;
end;
end;
end;
nhconch 2008-07-07
  • 打赏
  • 举报
回复
2、其中一個子節點取消勾選,其父節點也取消勾選,其他子節點不受影響;
可以通过for i := Item.Index-1 downto 0 do反向查找父节点,再
CheckSubItems,代码不写了。
3、保存樹的節點狀態.
不知道你要保存到哪,TreeView本来就有Chekbox和Checked状态。
nhconch 2008-07-07
  • 打赏
  • 举报
回复
是不复杂,只需要额外加点标记就行。我是用ListView1.Items[].Data保存级别,你自己看着办吧。

//将Item自身的Checked状态应用到下级子项目
procedure CheckSubItems(Item: TListItem);
var
i: Integer;
begin
for i := Item.Index+1 to ListView1.Items.Count-1 do
if Integer(ListView1.Items[i].Data) > integer(Item.Data) then
ListView1.Items[i].Checked := Item.Checked
else
Break;
end;
grjs2004 2008-07-07
  • 打赏
  • 举报
回复
谢谢以上各位的回帖!

我自己花了一个下午把这个问题解决了。

不过还是要感谢各位的帮助。

揭贴按回帖的质量来给分!

grjs2004 2008-07-06
  • 打赏
  • 举报
回复
谢谢楼上几位的回帖。

我已经说得很明白了。
to yangkunjie :
就是说父节点要影响所有其子节点,任何一个子节点取消时影响父节点,
子节点之间不相互影响。

to hongqi162:
已经在补充的时候说了:不使用任何的第三方控件


mdejtod 2008-07-06
  • 打赏
  • 举报
回复
个人觉得,关键是为每个树节点保存信息,主要是对信息进行修改,再判断....
你可以参考一下
http://topic.csdn.net/u/20080703/17/e6cbf9be-dccf-448b-bb4c-a41ca1c48eae.html
这个,树节点的信息结构....
hongqi162 2008-07-06
  • 打赏
  • 举报
回复
1stclass里面有个fctreeview,这个组件直接带checkbox

http://gzu.3322.org/list.asp?id=880
yangkunjie 2008-07-06
  • 打赏
  • 举报
回复
2、其中一個子節點取消勾選,其父節點也取消勾選,其他子節點不受影響;
-----------------------------------------------------------
一个取消,父节点就取消?
grjs2004 2008-07-06
  • 打赏
  • 举报
回复
現在要補充幾個條件:1、不用任何第三方控件;2、不用畫圖片的或添加圖片來處理的方法。
解決了一定結貼給分,
如果沒有得到滿意的答案,絕不給分。
以前提出的很多問題,都沒有得到答案,基本上是靠自己摸索出來的,浪費了很多分,所以現在不能隨便給分了。

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧