如何让TreeView二级子节点带CheckBox?

bcghb 2003-08-04 01:32:45
如何让TreeView二级子节点带CheckBox?
...全文
87 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
上海老李 2003-08-04
  • 打赏
  • 举报
回复
自定义一个结构体,表示是否选中,比如说:你这出现了一个小的方框表示未选中,然后当点击当前项时,就对以前的值取反,再按值列图片
CeleronII 2003-08-04
  • 打赏
  • 举报
回复
使用ImageIndex属性,来回切换几张自己做的小图片来模仿CHECKBOX。很简单
CeleronII 2003-08-04
  • 打赏
  • 举报
回复
设置它的ImageiIndex属性就可以了,切换几张小图片就OK了,很简单
bcghb 2003-08-04
  • 打赏
  • 举报
回复
好象可以直接加的,上面的方法不太现实吧!
zyly2 2003-08-04
  • 打赏
  • 举报
回复
可以用变通的手法。
  TreeView有Images属性不是吗?自己做三张小图片:全选中、部分选中、不选状态(直接拍下CheckBox三种状态的图片在加工一下就可以了),然后在点击事件中根据具体情况设置TTreeNodes的ImageIndex就OK了。
  如果嫌麻烦的话就去Down一个控件,其实有些控件也是这样做的,界面上你是看不出来的. :)
**************
Manan Patel <mpatel@siemens-hearing.com>
重载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;

bcghb 2003-08-04
  • 打赏
  • 举报
回复
高手在啊里?

5,388

社区成员

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

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