带CheckBox的TreeView(200分)

  • 主题发起人 主题发起人 logical
  • 开始时间 开始时间
L

logical

Unregistered / Unconfirmed
GUEST, unregistred user!
老板让我制作一个带CheckBox的类TTreeView的控件,因为打算在某系统中
显示所有目录和文件名的同时用CheckBok表示出访问权限。时间很紧,更紧
的是我还在试用期!-----各位大哥救命!(提供方案者给100分,提供……
者200分).
Lgl
 
其实有一个简单的方法,你可以完全利用TTreeView的特点,自己用一些Image来
模拟CheckBox的效果,就是画两个CheckBox的样子的Bitmap,相应TreeView的
OnCustomDraw事件来实现CheckBox的效果,当然可以从TTreeView派生,改造
OnCustomDraw事件从而得到一个新的控件!


 
按照我的意见,我觉得,HANSON的也是可取的不过就无法看到节点前面的小图了。

可以派出另一类使它具有多重选择的属性。我看可能要修改一个TTREEVIEW的内容
了每一个TREENODE都有可能被选中所以如果可能可以用STATE的属性(不知道有没
有这个属性),并作两个图,表示选中与否。如果有STATE属性就应该可放在STATEIMAGE的里面了。这里没有DELPHI,等我回家再试试看。
 
hanson的方法不错,但我认为自绘比用位图好些
 
有个 1stClass 控件中有相应的东西, 我只看它的例子中每个项目前有一个选择

图或RADIO图标, 最具体的就不知道了.
 
TreeNT,
绝对满足要求。很著名的。

到国外的站上去找。
 
嗳呀,这个问题实在是简单加EASY。根本无须寻找其它的控件,或建立什么
新的自定义控件,用Delphi提供的TTreeView本身即可解决问题,可见你未
完全领略该TTreeView的特性。方法如下:
首先,你得在表单中放置一个TTreeView及TImageList控件,然后,为
TImageList控件提供两个或更多个的位图,以表示你的不同的访问级别,而不
仅是CheckBox而已,并将TTreeView的Images属性置为该TImageList控件,
至此你已完成基本设定。(你可以双击此TreeView,并随便加入几个节点,马上
你能看到你的ImageList中的第一个位图显示在主表单的TreeView的相应节点处)
别急,下面讲述如何实现你所说的不同访问级别:
其实你只需在TreeView的MouseDown事件中作类似如下的判定即可:

procedure TForm1.TreeView1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

var
MyHitTest : THitTests;
begin
MyHitTest := TreeView1.GetHitTestInfoAt(X,Y);
if htOnIcon in MyHitTest then
{
现在已测定出是在位图上进行了点击,你可据此实现CheckBox功能,
只需将该节点的ImageIndex属性置为前面TImageList中的相应位图
即可。至于当前节点,可由TreeView.Selected获得,也可由
GetNodeAt(X,Y)获得。
在此,你可根据情况实现更多的级别控制,而非仅是CheckBox而已。
};
end;

我想,到此,你应该理解了吧。这个问题也应该结束了,否则实在太对不起
我的劳动了。
祝你好运,受到老板的赏识。
 
哎呀,我怎么就没想到yanghaijun的办法呢?
不过这办法固然好可惜无法达到既有小图又有checkbox的效果。
我看也就将就吧反正应该要求不是很高。

昨天我看了一下在commctrl.pas中关于listitem & treenode的描述,
觉得两者差不多,如果有高手的话为TREEVIEW增加一个checkbox
功能应该并不困难的。可惜我是低手。:-)
 
我想提醒3h一下,TreeView中的每一个节点均可有两个位图在前面显示,
若你即想有小图又想有Checkbox,你只需为TreeView的Images及StateImages
属性分别指定一个ImageList即可,当然若你喜欢一个也够用了,反正ImageList
中可以装好多个小位图,不管是CheckBox还是其它什么的。
当然,对于上次我提供的源码,若你想检测是否在StateImage位图上进行
了点击,好像应当这样写:
if htOnStateIcon in MyHitTest then
具体信息你可以查看关于TreeView的联机帮助。
 
各位:
谢谢您们的热心!
问题我已解决,方案与yanghaijun的差不多,所以我给的200分是这样分配的:
其他人每人20分,yanghaijun 100分,我不知道这是否合适,但yanghaijun的方案
是最接近我现在所采用的。
事实上,我是参照yanghaijun的方案另做一个组件,效果还算可以,只是在改变State时有闪烁,不知道能否也解决掉(不解决也不妨,因为我另有任务)。我是用
Borland C++ Builder做的。
再次谢谢各位!特别是yanghaijun同仁。
 
各位:
谢谢您们的热心!
问题我已解决,方案与yanghaijun的差不多,所以我给的200分是这样分配的:
其他人每人20分,yanghaijun 100分,我不知道这是否合适,但yanghaijun的方案
是最接近我现在所采用的。
事实上,我是参照yanghaijun的方案另做一个组件,效果还算可以,只是在改变State时有闪烁,不知道能否也解决掉(不解决也不妨,因为我另有任务)。我是用
Borland C++ Builder做的。
再次谢谢各位!特别是yanghaijun同仁。
 

Similar threads

D
回复
0
查看
764
DelphiTeacher的专栏
D
D
回复
0
查看
669
DelphiTeacher的专栏
D
D
回复
0
查看
661
DelphiTeacher的专栏
D
后退
顶部