急!求带CHECKBOX的TREEVIEW控件! 其实这个可以自己做的,就是处理每个节点的ImageIndex就行了,你画表示三种状态的图标,然后判断当前节点的状态,切换到对应的ImageIndex就好了阿。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 自己写下面是个例子 TTreeView的结点如何具有CheckBox?TreeView有个Images属性,做三张小图片:全选中、部分选中、不选状态(直接拍下CheckBox三种状态的图片在加工一下就可以了),然后在点击事件中根据具体情况设置TTreeNodes的ImageIndex就OK了。重载TreeView的CreateParams:type TCheckBoxTreeView = class(TTreeView) protected procedure CreateParams(var Params: TCreateParams); override; end;procedure TCheckBoxTreeView.CreateParams(var Params: TCreateParams);begin inherited; Params.Style:=Params.Style or TVS_CHECKBOXES; { TVS_CHECKBOXES declared in CommCtrl }end;如果要Check这个CheckBox,可以用下面的代码:function IsNodeChecked(Node :TTreeNode) :Boolean;const TVIS_CHECKED = $2000;var TvItem :TTVItem;begin TvItem.Mask := TVIF_STATE; TvItem.hItem := Node.ItemId; TreeView_GetItem(Node.TreeView.Handle, TvItem); Result := (TvItem.State and TVIS_CHECKED) = TVIS_CHECKED;end;procedure SetNodeChecked(Node :TTreeNode; Checked :Boolean);const TVIS_CHECKED = $2000;var TvItem :TTVItem;begin FillChar(TvItem, SizeOf(TvItem), 0); with TvItem do begin hItem := Node.ItemId; Mask := TVIF_STATE; StateMask := TVIS_STATEIMAGEMASK; if Checked then TvItem.State :=TVIS_CHECKED else TvItem.State :=TVIS_CHECKED shr 1; TreeView_SetItem(Node.TreeView.Handle, TvItem); end;end;可以做成事件和封装成一个类:private OldState :Boolean;procedure Change(Node: TTreeNode); override;begin inherited Change(Node); OldState := IsNodeChecked(Node);end;procedure Click; override;var NewState :Boolean;begin inherited Click; NewState := IsNodeChecked(Self.Selected); if NewState = OldState then Exit; if (NewState) and Assigned(OnNodeChecked) then OnNodeChecked() else if (not NewState) and Assigned(OnNodeUnChecked) then OnNodeUnChecked()// OnNodeChecked & OnNodeUnchecked will be events that you declareend; DELPHI查找PDF文件的内容 根据窗口句柄,如何对组件进行编程?高手作答!!!老急了!!!!!!!!! 求汉字转换成UTF8编码的方法(送50分)!!! 请教使用TADODataset的命令实现Master/Detail关系时出现的问题(更新方式为批次更新) 能解决问题者有分: 如何解决给字段付值或将字段值导出的繁琐性!!!!!!! 求助! 关于listbox的问题? 给分 有关日期显示问题,请各位高手帮助!谢谢!! 如何在delphi中编写adsi的程序 关于键盘钩子的问题,请高手们不吝赐教...... 拜师! (Delphi or BCB) +sql server 2000。
下面是个例子
TTreeView的结点如何具有CheckBox?
TreeView有个Images属性,做三张小图片:
全选中、部分选中、不选状态(直接拍下CheckBox三种状态的图片在加工一下就可以了),然后在点击事件中根据具体情况设置TTreeNodes的ImageIndex就OK了。
重载TreeView的CreateParams:
type
TCheckBoxTreeView = class(TTreeView)
protected
procedure CreateParams(var Params: TCreateParams); override;
end;procedure TCheckBoxTreeView.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.Style:=Params.Style or TVS_CHECKBOXES;
{ TVS_CHECKBOXES declared in CommCtrl }
end;如果要Check这个CheckBox,可以用下面的代码:
function IsNodeChecked(Node :TTreeNode) :Boolean;
const
TVIS_CHECKED = $2000;
var
TvItem :TTVItem;
begin
TvItem.Mask := TVIF_STATE;
TvItem.hItem := Node.ItemId;
TreeView_GetItem(Node.TreeView.Handle, TvItem);
Result := (TvItem.State and TVIS_CHECKED) = TVIS_CHECKED;
end;procedure SetNodeChecked(Node :TTreeNode; Checked :Boolean);
const
TVIS_CHECKED = $2000;
var
TvItem :TTVItem;
begin
FillChar(TvItem, SizeOf(TvItem), 0);
with TvItem do begin
hItem := Node.ItemId;
Mask := TVIF_STATE;
StateMask := TVIS_STATEIMAGEMASK;
if Checked then
TvItem.State :=TVIS_CHECKED
else
TvItem.State :=TVIS_CHECKED shr 1;
TreeView_SetItem(Node.TreeView.Handle, TvItem);
end;
end;
可以做成事件和封装成一个类:
private OldState :Boolean;procedure Change(Node: TTreeNode); override;
begin
inherited Change(Node);
OldState := IsNodeChecked(Node);
end;procedure Click; override;
var
NewState :Boolean;
begin
inherited Click;
NewState := IsNodeChecked(Self.Selected);
if NewState = OldState then Exit;
if (NewState) and Assigned(OnNodeChecked) then OnNodeChecked()
else if (not NewState) and Assigned(OnNodeUnChecked) then
OnNodeUnChecked()// OnNodeChecked & OnNodeUnchecked will be events that you declare
end;