我需要带有Check的TreeView控件,像[东方杀毒王 2003]那样的,不知怎样做,或哪有下载最好:-)
解决方案 »
- 如何解决PageContral切换各Tab时的界面闪烁问题,因为各Tab的元素跟控件各不相同且数量不少。
- 有用过kol控件的进来看看
- 请chenquan(嘉威王子)领分!谢谢!
- 用ADO如何实现事务处理
- 文件传输问题
- 如何通过TClientDataSet将本地Access数据提交到服务器上
- Idispatch长什么样
- 在DBGrid中如何判断未存入表中的数据不能为空?
- delphi编的程序不会象vb一样要一大堆的dll吧?
- 如何判断listview控件点击复选框时的事件?
- 请介绍一本好一点的delphi的数据库编程的书籍
- 怎样能屏蔽掉SOCKET连接失败后出现的对话框,而使用户端窗体上的LABEL显示离线?
你可以搜一下,我记得有人回答过相似问题。
TreeView有Images属性不是吗?自己做三张小图片:全选中、部分选中、不选状态(直接拍下CheckBox三种状态的图片在加工一下就可以了),然后在点击事件中根据具体情况设置TTreeNodes的ImageIndex就OK了。
如果嫌麻烦的话就去Down一个控件,其实有些控件也是这样做的,界面上你是看不出来的. :)
**************
Manan Patel <[email protected]>
重载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;