50分求树控件的使用,万分感谢! ( 积分: 50 )

  • 主题发起人 主题发起人 zpselect
  • 开始时间 开始时间
Z

zpselect

Unregistered / Unconfirmed
GUEST, unregistred user!
功能要求如下:
1:初始化时,将TreeView.FullExpand之后,将光标位置定位在根结点于, 背景颜色如下
第三点所描述。
2:要求在item的左边加一CheckBox选框,根结点不能有CheckBox,但所有的Items只能选怿一个,像RadioButton一
一样
3:当我选怿某个items时,其item有背景颜色变为红色,当我进行别的操作时,如:在窗体
的Edit1处输入值,前所选怿的Item的背景颜色不变,仍为红色,只有当我选怿下一个
Item时,前面选怿的Item的背景颜色变为原有的白色,那么当前所选的Item的背景颜色
又变为红色,以此类推。。。
 
顶一个!!!
 
给我吧,我给你几个例子
http://www.2ccc.com/search.asp?KeyWord=treeview&Submit=%BF%EC%CB%D9%CB%D1%CB%F7

里面有几个经典的例子,看完了就会用了
 
最经典的
http://www.2ccc.com/article.asp?articleid=875

http://www.2ccc.com/article.asp?articleid=798

这两个就差不多了
 
还要下啊,就在TreeView中不可以实现吗?
 
....

扔个listimage,0位置图片是不选择的,1是选择的
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, ImgList;

type
TForm1 = class(TForm)
tv: TTreeView;
ImageList1: TImageList;
procedure FormShow(Sender: TObject);
procedure tvCustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode;
State: TCustomDrawState; var DefaultDraw: Boolean);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormShow(Sender: TObject);
begin
tv.ShowRoot:=false;
tv.FullExpand;
if tv.Items.Count>0 then
tv.Selected:=tv.Items[0];
end;

procedure TForm1.tvCustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode;
State: TCustomDrawState; var DefaultDraw: Boolean);
var
arect:trect;
bmp:tbitmap;
x,m:integer;
begin
DefaultDraw:=false;
if node.Selected then
sender.Canvas.Brush.Color:=clred
else
sender.Canvas.Brush.Color:=clwindow;
arect:=node.DisplayRect(true);
x:=arect.Left+2;
m:=arect.Bottom-arect.Top;
if node.Level>0 then
begin
arect.Right:=arect.Right+m;
sender.Canvas.FillRect(arect);
bmp:=tbitmap.Create;
imagelist1.GetBitmap(integer(node.Selected),bmp);
sender.Canvas.CopyRect(rect(arect.Left,arect.Top,arect.Left+m,arect.Bottom),
bmp.Canvas,rect(0,0,bmp.Width,bmp.Height));
x:=arect.Left+bmp.Width+2;
bmp.Free;
end;
sender.Canvas.TextOut(x,arect.Top+2,node.Text);
end;

end.
 
真的太谢谢你了hs-kill,
不过有点问题,就是为什么结点之间的连线没有了?没加这段代代码之前是有的!
 
请hs_kill指点一下问题
treeview在初始化时我运态设置其根结点的imageindex值为0;所有的子结点的imageindex值为12;为什么当我选怿某个子结点时其imageindex值又为根结点的imageindex值,即为:0!
var
ChildNode, Rootnode: TTreeNode;
p: pchar;
str: string;
query: TADOQuery;
begin
NoteBook1.PageIndex := 0;
query := DM.CreateAdoQuery;
query.SQL.Text := 'SELECT RKEY,DEPT_NAME FROM '
+ ' DATA0034 WHERE TTYPE IN (4,5)';
query.Open;
tv.Items.Clear;
Rootnode := TV.Items.Add(nil, '部门名称');
RootNode.ImageIndex := 0;
query.First;
while not query.Eof do
begin
str := Query.Fieldbyname('RKEY').AsString;
getmem(p, length(str));
strpcopy(p, str);
ChildNode := TV.Items.AddchildObject(Rootnode, query.Fields[1].text, P);
ChildNode.ImageIndex := 12;
query.Next;
end;
tv.FullExpand;
 
这个.....因为我设置了DefaultDraw:=false;,所以连线还有那个加减号的图标都没有了,暂时我还没找到怎么画出来-_-
如果不设置DefaultDraw:=false;显示会有冲突

那个imageindex的问题是对的,因为你在选择一个节点后,显示的图片就不是根据imageindex了,而是根据SelectedIndex这个值显示的

你加一句话就OK了
while not query.Eof do
begin
str := Query.Fieldbyname('RKEY').AsString;
getmem(p, length(str));
strpcopy(p, str);
ChildNode := TV.Items.AddchildObject(Rootnode, query.Fields[1].text, P);
ChildNode.ImageIndex := 12;
ChildNode.SelectedIndex:=12; {加上这句,选的时候就不会变了}
query.Next;
end;
 
谢谢你hs_kill,我加了ChildNode.ImageIndex := 12;这段代码之后,选怿某个节点时其imageindex不变发生变化!
如果加了
procedure TForm1.tvCustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode;
State: TCustomDrawState; var DefaultDraw: Boolean);
中的代码之后,图片和连线都没有了!
 
我将DefaultDraw:=false;这一句去掉,但是现在出现新的问题
1:字体变大了
2:当我选怿某个节点时会出现一根竖线
 
人家DEV公司有专门开发出这个软件。
你还在这浪费时间。
直截了当的拿来使用就得了。
 
tvCustomDrawItem中的代码,我是自己画的
所以连线会没有,至于图片,因为是自己画,我只读了imageindex,所以要判断节点是否被选择,如果选择就现实selectedindex的图片,否则显示imageindex的图片,稍微改动下:
procedure TForm1.tvCustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode;
State: TCustomDrawState; var DefaultDraw: Boolean);
var
arect:trect;
bmp:tbitmap;
x,m:integer;
begin
DefaultDraw:=false;
if node.Selected then
sender.Canvas.Brush.Color:=clred
else
sender.Canvas.Brush.Color:=clwindow;
arect:=node.DisplayRect(true);
x:=arect.Left+2;
m:=arect.Bottom-arect.Top;
if node.Level>0 then
begin
arect.Right:=arect.Right+m;
sender.Canvas.FillRect(arect);
bmp:=tbitmap.Create;
[red] if node.selected then
imagelist1.GetBitmap(node.SelectedIndex,bmp)
else
imagelist1.GetBitmap(node.ImageIndex,bmp);[/red]
sender.Canvas.CopyRect(rect(arect.Left,arect.Top,arect.Left+m,arect.Bottom),
bmp.Canvas,rect(0,0,bmp.Width,bmp.Height));
x:=arect.Left+bmp.Width+2;
bmp.Free;
end;
sender.Canvas.TextOut(x,arect.Top+2,node.Text);
end;
 
我说了DefaultDraw:=false;去掉后会出现显示冲突....-_-
 
没有办法吗?
 
-_- 能力所限.......我不知道该怎么做了,我觉得应该是查找windows的资源,找到那个加减号还有连接线的图片资源然后画上,不过不知道资源标号是多少,找不到这方面的资料....

要不你就用第3方控件吧
 
老大规定,不能用太多的第三方控件的!
 
不知谁有这样的成功实例?
 
收藏此貼,正在研究中。
 
那你就告诉他要效果就用别的控件,否则就没这效果
 
后退
顶部