怎么让TreeView前面显示CheckBox. 急!在线等! ( 积分: 100 )

  • 主题发起人 主题发起人 czj_earth
  • 开始时间 开始时间
C

czj_earth

Unregistered / Unconfirmed
GUEST, unregistred user!
怎么让TreeView前面显示CheckBox.?
在选中Checkbox时就表示选中对应的 Item项!
 
怎么让TreeView前面显示CheckBox.?
在选中Checkbox时就表示选中对应的 Item项!
 
var ListItem: TListItem;

ListItem := ListView1.Items.Add;
ListItem.Checked := false;
ListItem.Caption := 'gfh';
.......
....
 
to: wzwcn
兄弟,我要的是在[red]TreeView[/red]中显示Checkbox,
如果在ListView中能像 TreeView一样的显示层次结构也可以.
谢谢你的答复!
 
老兄,不要那么费劲了,treeveiw显示选择框,不是使用什么属性,而是用两个显示不同的图片,一个选择,一个非选择,根据数据的状态动态改变。就这么简单
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3120523
这里有你想要的.
 
//用下面这个就行了
const
TVS_CHECKBOXES = $00000100;

procedure SetComCtrlStyle(WinCtrl: TWinControl; Value: Integer; UseStyle: Boolean);
var
Style: Integer;
begin
if WinCtrl.HandleAllocated then
begin
Style := GetWindowLong(WinCtrl.Handle, GWL_STYLE);
if not UseStyle then
Style := Style and not Value
else Style := Style or Value;
SetWindowLong(WinCtrl.Handle, GWL_STYLE, Style);
end;
end;

然后 在 OnCreate 调用:
SetComCtrlStyle(TreeView1, TVS_CHECKBOXES, True);

或者干脆简单点,一句话完事:
SetWindowLong(TreeView1.Handle, GWL_STYLE, GetWindowLong(TreeView1.Handle, GWL_STYLE) or $00000100);
 
看看这个吧,其实你去下载一个1stclass4000里面就有一个很好用的带CHECKBOX的fcTreeView1

可以用变通的手法。
  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;
 
楼上正解,只是不知道怎么限定当前只能选中一个CheckBox,如果多选,怎么判断那些是CheckBox选中的
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3120523
//判断一个节点是否处于Checked状态
//用个循环来判断
function GetNodeChecked(ANode: TTreeNode): Boolean;
var
AItem: TTVITEM;
begin
with AItem do
begin
mask := TVIF_HANDLE or TVIF_STATE;
hItem := ANode.ItemId;
stateMask := TVIS_STATEIMAGEMASK;
end;
TreeView_GetItem(ANode.TreeView.Handle, AItem);
Result := Boolean((AItem.state shr 12) - 1);
end;
 
http://www.delphibbs.com/keylife/images/u196832/TXTreeView20050805.jpg
 
老兄还是用图片吧,系统加上的checkbox样子实在是太难看了。。。。^_^

判断是否被选择,每个treenode节点不是有个object属性吗,你自己写个类型里面放个boolean类型变量判断是否被选择
 
***一句话搞定的事还图片不图片、类不类的,累不累?
SetWindowLong(TreeView1.Handle, GWL_STYLE, GetWindowLong(TreeView1.Handle, GWL_STYLE) or $00000100);
 
vvyang!强!试过了,原来这么简单~~
 
不是累不累啊。。。。用setwindowlong加上的checkbox太难看,而且点了以后节点并不被选择,也没有对应的事件

而且对于某些树有全选和部分选择的区分,setwindowlong就不行了

还是自己画图片顺眼啊
 
强烈推荐TVirtualTreeview,可以作出多种效果,并且开放源代码
http://www.tommstudio.com/ 上有下载.
 
谢谢各位回复,
用三方控件的方式上司的不允许!

我已用加图片(imageindex)的方式做了!

各位提供的其它方式有时间我慢慢试过!

另处请教一个问题:
怎样使用过程类型:
如:
type
TOperatorFun = procedure (const anode: TTreenode; ...);
//等待调用的兼容的函数
TForm1 = class(TForm)
private
FOperatorFun: TOperatorFun;

procedure F1(const anode: TTreenode; ...);
procedure F2(const anode: TTreenode; ...);
...
end;

//我在遍历树的时候,依不同的要求赋给FOperatorFun不同的函数变量,以实现不同的操作.
但是当操作的函数在 TForm类中的时候好像就不行,
而当是全局函数时就可以.
但是,如果操作函数是全局时,又要传入许多不同的参数, 很麻烦.

请问各位大xia有何高招!
 
哎。。。没高招 关注一下~
 
干脆用RZ的那套控件吧,又漂亮,又可以完成任务,如何
 
晕,楼主不是日本鬼子吧——“用三方控件的方式上司的不允许!”
呵呵,开个玩笑。
 

Similar threads

D
回复
0
查看
780
DelphiTeacher的专栏
D
D
回复
0
查看
820
DelphiTeacher的专栏
D
D
回复
0
查看
652
DelphiTeacher的专栏
D
后退
顶部