如何只使treeview的叶子节点显示选择框(checkbox功能),而所有的有子节点的父节点均不带选择框。
以下是我的代码,已实现了所有节点均带有选择框,怎样消除父节点的选择框呢,请大家指教。
procedure Tfrm_index.FormCreate(Sender: TObject);
var
node,subnode:TTreeNode;
dw: DWORD;
begin
BuildTree(TreeView1,5);
dw := GetWindowLong( TreeView1.Handle, GWL_STYLE);
dw := dw or TVS_CHECKBOXES;
SetWindowLong(TreeView1.Handle, GWL_STYLE , dw);
end;procedure Tfrm_index.TreeView1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
Node : TTreeNode;
begin
inherited;
Node := TreeView1.GetNodeAt(X, Y);
if Node = nil then exit;
TreeView1.Selected := Node;
end;
function SetTreeViewNodeChecked(ATreeView: TTreeView;
ATreeNode: TTreeNode; Checked: Boolean): Boolean; //设置一个节点的是否被Check
var
tvItem: TTVItem;
begin
tvItem.mask := TVIF_HANDLE or TVIF_STATE;
tvItem.hItem := ATreeNode.ItemId;
tvItem.stateMask := TVIS_STATEIMAGEMASK; (*Image 1 in the tree-view check box image list is the
unchecked box. Image 2 is the checked box.*)
if Checked then
tvItem.state := IndexToStateImageMask(1) else
tvItem.state := IndexToStateImageMask(0);
Result := TreeView_SetItem(ATreeView.Handle, tvItem);
end;
function GetTreeViewNodeChecked(ATreeView: TTreeView;
ATreeNode: TTreeNode): Boolean; //取得一个节点的Check状态
var
tvItem: TTVItem;
begin
tvItem.mask := TVIF_HANDLE or TVIF_STATE;
tvItem.hItem := ATreeNode.ItemId;
tvItem.stateMask := TVIS_STATEIMAGEMASK;
TreeView_GetItem(ATreeView.Handle, tvItem);
Result := Boolean((tvItem.state shr 12) - 1);
end;procedure Tfrm_index.BuildTree(TreeView1: TTreeView;Level:integer=MaxInt);
var
DS :TADODataSet;
ID,PID : string;
Pnode : TTreeNode;
NodeData : PDepart;
begin
DS := TADODataSet.Create(nil); DS.Recordset := DataM.ADOConn_indu.Execute('select id,ziduan,code,F_parentid from T_main ');
TreeView1.Items.Clear;
try
DS.Filtered := false;
DS.Filter := 'id='+ QuotedStr('0') ;
DS.Filtered := true;
except
end; if DS.RecordCount <> 1 then
begin
FreeAndNil(DS);
exit;
end;
PID := DS.FieldByName('F_parentid').AsString;
ID := DS.FieldByName('ID').AsString;
new(NodeData);
NodeData^.ID := ID;
NodeData^.Code:= DS['code'];
TreeView1.Items.AddObject(nil,DS['ziduan'],NodeData); PNode := TreeView1.Items[0]; while (PNode <> nil) do
begin
PID := PDepart(PNode.Data)^.ID;
if PNode.Level < Level-1 then
begin
DS.Filtered := false;
DS.Filter := 'F_parentid='+ QuotedStr(PID);
DS.Filtered := true;
while not DS.Eof do
begin
ID := DS.FieldByName('ID').AsString;
new(NodeData);
NodeData^.ID := ID;
NodeData^.Code:= DS['code'];
TreeView1.Items.AddChildObject(Pnode,DS['ziduan'],NodeData);
DS.Next;
end;
end;
PNode := PNode.GetNext;
end;
freeandnil(DS);
end;
以下是我的代码,已实现了所有节点均带有选择框,怎样消除父节点的选择框呢,请大家指教。
procedure Tfrm_index.FormCreate(Sender: TObject);
var
node,subnode:TTreeNode;
dw: DWORD;
begin
BuildTree(TreeView1,5);
dw := GetWindowLong( TreeView1.Handle, GWL_STYLE);
dw := dw or TVS_CHECKBOXES;
SetWindowLong(TreeView1.Handle, GWL_STYLE , dw);
end;procedure Tfrm_index.TreeView1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
Node : TTreeNode;
begin
inherited;
Node := TreeView1.GetNodeAt(X, Y);
if Node = nil then exit;
TreeView1.Selected := Node;
end;
function SetTreeViewNodeChecked(ATreeView: TTreeView;
ATreeNode: TTreeNode; Checked: Boolean): Boolean; //设置一个节点的是否被Check
var
tvItem: TTVItem;
begin
tvItem.mask := TVIF_HANDLE or TVIF_STATE;
tvItem.hItem := ATreeNode.ItemId;
tvItem.stateMask := TVIS_STATEIMAGEMASK; (*Image 1 in the tree-view check box image list is the
unchecked box. Image 2 is the checked box.*)
if Checked then
tvItem.state := IndexToStateImageMask(1) else
tvItem.state := IndexToStateImageMask(0);
Result := TreeView_SetItem(ATreeView.Handle, tvItem);
end;
function GetTreeViewNodeChecked(ATreeView: TTreeView;
ATreeNode: TTreeNode): Boolean; //取得一个节点的Check状态
var
tvItem: TTVItem;
begin
tvItem.mask := TVIF_HANDLE or TVIF_STATE;
tvItem.hItem := ATreeNode.ItemId;
tvItem.stateMask := TVIS_STATEIMAGEMASK;
TreeView_GetItem(ATreeView.Handle, tvItem);
Result := Boolean((tvItem.state shr 12) - 1);
end;procedure Tfrm_index.BuildTree(TreeView1: TTreeView;Level:integer=MaxInt);
var
DS :TADODataSet;
ID,PID : string;
Pnode : TTreeNode;
NodeData : PDepart;
begin
DS := TADODataSet.Create(nil); DS.Recordset := DataM.ADOConn_indu.Execute('select id,ziduan,code,F_parentid from T_main ');
TreeView1.Items.Clear;
try
DS.Filtered := false;
DS.Filter := 'id='+ QuotedStr('0') ;
DS.Filtered := true;
except
end; if DS.RecordCount <> 1 then
begin
FreeAndNil(DS);
exit;
end;
PID := DS.FieldByName('F_parentid').AsString;
ID := DS.FieldByName('ID').AsString;
new(NodeData);
NodeData^.ID := ID;
NodeData^.Code:= DS['code'];
TreeView1.Items.AddObject(nil,DS['ziduan'],NodeData); PNode := TreeView1.Items[0]; while (PNode <> nil) do
begin
PID := PDepart(PNode.Data)^.ID;
if PNode.Level < Level-1 then
begin
DS.Filtered := false;
DS.Filter := 'F_parentid='+ QuotedStr(PID);
DS.Filtered := true;
while not DS.Eof do
begin
ID := DS.FieldByName('ID').AsString;
new(NodeData);
NodeData^.ID := ID;
NodeData^.Code:= DS['code'];
TreeView1.Items.AddChildObject(Pnode,DS['ziduan'],NodeData);
DS.Next;
end;
end;
PNode := PNode.GetNext;
end;
freeandnil(DS);
end;
解决方案 »
- DELPHI 配合 什么数据库做开发比较好?
- fastreport报表问题
- 请教高手MDI子窗体中的Coolbar怎样覆盖主窗体的coolbar?
- DCOMContion 连接 win组件服务 问题,已连通,但无法调用组件提供的方法 加急!!!!
- 小弟用delphi下的InstallShield打包,我的程序才0.99m,打包出来,有4m多,请问为什么会这么大呢?有没有办法打包打的很小呢?
- 我想新建一个有固定名称和属性的拔号网络连接,所以没办法用RasCreatePhonebookEntry这个API函数,请教有什么办法吗?
- ACCESS数据库中想查询sql语句的问题.请进!!!!
- Access数据库的查询?
- 这种样式的控件在哪里找?
- 请问如何获取文件默认打开方式的小图标?
- 请问一个关于ClientDataSet的参数问题
- 哪里有取系统信息的VCL?比如取CPU主频,内存及硬盘参数等
你的想法很好,可怎么实现呀
用1stClass,它里面正好有个treeView符合你的要求