我的控件是treeview 的扩展版 checktree ,就是treeview带复选框;
目的:
1、如何找出树叶子结点?
2、如果某结点的子结点有被选结点但未全选,如何选其为“实心”状态,同时,如果全选,则其为“被选”状态?
目的:
1、如何找出树叶子结点?
2、如果某结点的子结点有被选结点但未全选,如何选其为“实心”状态,同时,如果全选,则其为“被选”状态?
解决方案 »
- Dll子窗体的快捷键了全部失灵了,如何处理的
- 请教算法大师:取这样的字符串,有何好方法
- 服务器windows 2003 server SQL数据库连接问题
- 全屏显示问题:使form中的控件(如Edit、StringGrid)随form大小的变化而变化?
- 紧急求援:Delphi7.0的安装sn和key
- 菜鸟请问TDataSet问题。
- 一个简单的问题,但是我没有尝试出来
- 关于图片字节压缩的问题,救命啊!!!
- 求助:用VerQueryValue 获得文件版本英语(美国)语言代码为040904E4,其他的呢?
- 一个关于数据库的问题??????????????????????????
- 这个想法不知道能不能实现?function问题...
- 菜鸟提问:服务程序定时执行的问题!(多谢帮忙,解决后马上给分!)
或:TTreeNode.HasChildren也可以判断当前节点有没有子点节.
2.自己画或是设置其节点状态;
var
vTVItem: TTVItem;
begin
Result := False;
if not Assigned(mTreeNode) or not Assigned(mTreeNode.TreeView) then Exit;
vTVItem.mask := TVIF_STATE;
vTVItem.hItem := mTreeNode.ItemId;
if TreeView_GetItem(mTreeNode.TreeView.Handle, vTVItem) then
Result := (vTVItem.State and IndexToStateImageMask(2)) > 0; //0: None 1: False 2: True
end; { TreeNodeGetChecked }function TreeNodeSetChecked(mTreeNode: TTreeNode; mChecked: Boolean): Boolean;
var
vTVItem: TTVItem;
begin
Result := False;
if not Assigned(mTreeNode) or not Assigned(mTreeNode.TreeView) then Exit; vTVItem.mask := TVIF_STATE;
vTVItem.hItem := mTreeNode.ItemId;
TreeView_GetItem(mTreeNode.TreeView.Handle, vTVItem);
if not TreeView_GetItem(mTreeNode.TreeView.Handle, vTVItem) then Exit;
vTVItem.stateMask := TVIS_STATEIMAGEMASK;
vTVItem.state := IndexToStateImageMask(Succ(Ord(mChecked)));
Result := TreeView_SetItem(mTreeNode.TreeView.Handle, vTVItem);
end; { TreeNodeSetChecked }procedure TForm1.FormCreate(Sender: TObject);
begin
SetWindowLong(TreeView1.Handle, GWL_STYLE,
GetWindowLong(TreeView1.Handle, GWL_STYLE) or TVS_CHECKBOXES);
end;procedure TForm1.TreeView1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure pSelect(mTreeNode: TTreeNode; mChecked: Boolean);
var
I: Integer;
begin
TreeNodeSetChecked(mTreeNode, mChecked);
for I := 0 to mTreeNode.Count - 1 do pSelect(mTreeNode[I], mChecked);
end; procedure pSelectYes(mTreeNode: TTreeNode);
begin
while Assigned(mTreeNode.Parent) and
not TreeNodeGetChecked(mTreeNode.Parent) do
begin
TreeNodeSetChecked(mTreeNode.Parent, True);
mTreeNode := mTreeNode.Parent;
end;
end; procedure pSelectNo(mTreeNode: TTreeNode);
var
I: Integer;
begin
if Assigned(mTreeNode.Parent) and TreeNodeGetChecked(mTreeNode.Parent) then
begin
for I := 0 to mTreeNode.Parent.Count - 1 do
if TreeNodeGetChecked(mTreeNode.Parent[I]) then Exit;
TreeNodeSetChecked(mTreeNode.Parent, False);
pSelectNo(mTreeNode.Parent);
end;
end;var
vTreeNode: TTreeNode;
begin
if not (htOnStateIcon in TTreeView(Sender).GetHitTestInfoAt(X, Y)) then Exit;
vTreeNode := TTreeView(Sender).GetNodeAt(X, Y);
pSelect(vTreeNode, TreeNodeGetChecked(vTreeNode));
if not TreeNodeGetChecked(vTreeNode) then
pSelectNo(vTreeNode)
else pSelectYes(vTreeNode);
end;
procedure TForm1.TvUserListToggleCheckbox(
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;
zswang(伴水清清)(专家门诊清洁工) (
也许是我太笨了把,你的代码我看的很费劲,觉得挺深的!关键是没有注释,不太好看,不过也谢谢了!To
hongqi162(失踪的月亮)
谢谢你的代码!我比较笨,一直到现在才弄出来!当然也谢谢你的注释!!注释太有用了!