在加载二级节点时,从数据库中查询用户名,想能实现这样的功能,在查询用户名的同时判断该用户是否为销户状态,如果是,则将该节点的颜色设为红色,以下是加载二级节点代码:
if treeview1.Selected.HasChildren then//如果当前选中的节点有子节点,则不再加载
abort
else
begin
while not ado_add.Eof do
begin
node_bill:=treeview1.Items.AddChild(treeview1.Selected,ado_add.fieldbyname('khmc').AsString);
if ado_add.FieldByName('xiaohu').AsBoolean=true then
xiaohu_flag:=true;
ado_add.Next;
end;
end;
然后在 customerdrawitem 事件中进行判断:
if xiaohu_flag=true then
treeview1.canvas.font.color:=clred;
这样一来所有的节点都变成了红色,如果用node.level:=clred 则所有的二级节点都变成红色,我只要符合条件的用户才将它的颜色改变,有没有什么方法可以做到啊?在网上找了很多都没达到效果,郁闷中~~~
if treeview1.Selected.HasChildren then//如果当前选中的节点有子节点,则不再加载
abort
else
begin
while not ado_add.Eof do
begin
node_bill:=treeview1.Items.AddChild(treeview1.Selected,ado_add.fieldbyname('khmc').AsString);
if ado_add.FieldByName('xiaohu').AsBoolean=true then
xiaohu_flag:=true;
ado_add.Next;
end;
end;
然后在 customerdrawitem 事件中进行判断:
if xiaohu_flag=true then
treeview1.canvas.font.color:=clred;
这样一来所有的节点都变成了红色,如果用node.level:=clred 则所有的二级节点都变成红色,我只要符合条件的用户才将它的颜色改变,有没有什么方法可以做到啊?在网上找了很多都没达到效果,郁闷中~~~
解决方案 »
- delphi工程存储路径的相关问题
- 关于QuotedStr在Filter里的应用~~
- delphi与西门子的plc(s7-300)通讯
- FASTREPORT中FREESPACE的困绕,大家帮帮我
- 用idsmtp,作邮件发送的出了如下错误,我是按照delphi自带的demo做的。。。
- 如何将事先建立好的窗体连接上来?
- 怎样令菜单像Delphi的菜单一样
- IActiveDesktop问题,不但给分,而且给钱!
- 看别人的程序有一句程序不明白
- 在 DLL 创建窗体的办法,CREATEFORM();不可以用,立即给分,谢谢。。。
- 使用TImage改变Width和Height时,报存储不足的错误,如何解决?
- 怎样去掉窗体右上角的最小化、复原按钮,只留下关闭按钮
设计node_bill的imageindex即可
xiaohu_flag: Boolean;
......其他信息
end;
PTNodeData = ^TNodedata;所有的节点的Data都是此记录类型;
将下面的语句更改:
var
NodeData = PTNodeData;
begin
......
if ado_add.FieldByName('xiaohu').AsBoolean=true then
xiaohu_flag:=true;更改为
.....
if ado_add.FieldByName('xiaohu').AsBoolean=true then
NodeData.xiaohu_flag:=true;
else
NodeData.xiaohu_flag:=False;..............
if xiaohu_flag=true then
treeview1.canvas.font.color:=clred;改为
..........
if PTNodeData(Node.Data).xiaohu_flag=true then
treeview1.canvas.font.color:=clred;
Node.Data = @NodeData;
Node.Data = @NodeData; //这两句还不太明白是什么作用?
if PTNodeData(Node.Data).xiaohu_flag=true then //这边会有地址引用错误,窗体一显示时就会执行这边的代码
xiaohu_flag: Boolean;
end;
PTNodeData = ^TNodedata;
TForm1 = class(TForm)
TreeView1: TTreeView;
ImageList1: TImageList;
Button1: TButton;
procedure TreeView1CustomDrawItem(Sender: TCustomTreeView;
Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.TreeView1CustomDrawItem(Sender: TCustomTreeView;
Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
if PTNodeData(Node.Data).xiaohu_flag then
Treeview1.Canvas.Font.Color := clred;
end;procedure TForm1.Button1Click(Sender: TObject);
var
Idx: Integer;
NodeData: array [0..1000] of PTNodeData;
Node: TTreeNode;
begin
for Idx := 0 to 10 do
begin
New(NodeData[Idx]);
Node := Treeview1.Items.AddChild(nil, '');
if Idx mod 2 = 0 then
NodeData[Idx].xiaohu_flag := True
else
NodeData[Idx].xiaohu_flag := False;
Node.Data := NodeData[Idx];
Node.Text := 'Node'+IntToStr(Idx);
Node.ImageIndex := 0;
end;
end;
我的代码:(ondbclick) treeview1
Node.Data := @NodeData;
if treeview1.Selected.HasChildren then //如果当前选中的节点有子节点,则不再加载
abort
else
begin
while not ado_add.Eof do
begin
node_bill:=treeview1.Items.AddChild(treeview1.Selected,ado_add.fieldbyname('khmc').AsString);
if ado_add.FieldByName('xiaohu').AsBoolean=true then
NodeData.xiaohu_flag:=true
else
NodeData.xiaohu_flag:=False;
ado_add.Next;
end;
end;
后面的判断代码是一样的,可就是地址引用出错~~~不懂哪错了啊~
还是这两句不懂什么作用~~~
PTNodeData = ^TNodedata; //指针?
Node.Data = @NodeData; //这两句还不太明白是什么作用?
麻烦你了`~~~~
var
Idx: Integer;
NodeData: array [0..1000] of PTNodeData;
Node_Bill: TTreeNode;
begin
if treeview1.Selected.HasChildren then //如果当前选中的节点有子节点,则不再加载
abort
else
begin
for Idx := 0 to 10 do
begin
New(NodeData[Idx]);
node_bill:=treeview1.Items.AddChild(treeview1.Selected, '');
if Idx mod 2 = 0 then
NodeData[Idx].xiaohu_flag:=true
else
NodeData[Idx].xiaohu_flag:=False;
Node_Bill.Data := NodeData[Idx];
Node_Bill.Text := 'Node'+IntToStr(Idx);
Node_Bill.ImageIndex := 0;
end;
end;
end;
procedure TE_khzl_changeF.TreeView1CustomDrawItem(Sender: TCustomTreeView;
Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
if PTNodeData(Node.Data).xiaohu_flag then
Treeview1.Canvas.Font.Color := clred;
end;
这段代码怎么在窗体一创建时就会执行的啊?
Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
if Node.HasChildren then //添加这个判断
exit; if PTNodeData(Node.Data).xiaohu_flag then
Treeview1.Canvas.Font.Color := clred;
end;嘿嘿,我乱猜的~~~
Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
if (Node.level =0) then //这样判断试试,反正一级结点就退出
exit; if PTNodeData(Node.Data).xiaohu_flag then
Treeview1.Canvas.Font.Color := clred;
end;
Node.data := PTNodeData; 这个是写在加载一级节点的地方么?会有错误~~
[Error] E_khzl_change.pas(271): '(' expected but ';' found
----------------------------------------------
在加入一级节点是就要把Node.data := PTNodeData,
----------------------------------------------
可是这个写在加载一级节点时会出错.
真是太麻烦你了~呵~
TNodeData = packed record
xiaohu_flag: Boolean;
end;
PTNodeData = ^TNodedata;
TForm1 = class(TForm)
TreeView1: TTreeView;
ImageList1: TImageList;
Button1: TButton;
procedure TreeView1CustomDrawItem(Sender: TCustomTreeView;
Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
procedure Button1Click(Sender: TObject);
procedure TreeView1Click(Sender: TObject);
private
{ Private declarations }
public
end;var
Form1: TForm1;implementationuses
Clipbrd;{$R *.dfm}procedure TForm1.TreeView1CustomDrawItem(Sender: TCustomTreeView;
Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
if PTNodeData(Node.Data).xiaohu_flag then
Treeview1.Canvas.Font.Color := clred;
end;procedure TForm1.Button1Click(Sender: TObject); //增加一级节点
var
Idx: Integer;
NodeData: array [0..1000] of PTNodeData;
Node: TTreeNode;
begin
for Idx := 0 to 10 do
begin
New(NodeData[Idx]);
Node := Treeview1.Items.AddChild(nil, '');
if Idx mod 2 = 0 then
NodeData[Idx].xiaohu_flag := True
else
NodeData[Idx].xiaohu_flag := False;
Node.Data := NodeData[Idx];
Node.Text := 'Node'+IntToStr(Idx);
Node.ImageIndex := 0;
end;
end;procedure TForm1.TreeView1Click(Sender: TObject); //增加二级节点
var
Idx: Integer;
NodeData: array [0..1000] of PTNodeData;
Node_Bill: TTreeNode;
begin
if treeview1.Selected.HasChildren then
abort
else
begin
for Idx := 0 to 10 do
begin
New(NodeData[Idx]);
node_bill:=treeview1.Items.AddChild(treeview1.Selected, '');
if Idx mod 2 = 0 then
NodeData[Idx].xiaohu_flag:=true
else
NodeData[Idx].xiaohu_flag:=False;
Node_Bill.Data := NodeData[Idx];
Node_Bill.Text := 'Node'+IntToStr(Idx);
Node_Bill.ImageIndex := 0;
end;
end;
end;
if Treeview1.Selected <> nil then
New(NodeData[Idx]);你两次加载都写了,我测试时好像不行哦~
窗体的 onshow 事件:
ado_add.SQL.Clear;
ado_add.SQL.Text:='select distinct pqmc from pqzl';
ado_add.Open;
for i:=0 to ado_add.RecordCount-1 do
begin
New(NodeData[i]);
dbcombobox2.Items.Add(ado_add.fieldbyname('pqmc').AsString);
node:=treeview1.Items.Add(nil,ado_add.fieldbyname('pqmc').AsString);
ado_add.Next;
end;
树的 ondbclick事件:
if treeview1.Selected.HasChildren then //如果当前选中的节点有子节点,则不再加载
abort
else
begin
for idx:=0 to ado_add.RecordCount-1 do
begin
node:=treeview1.Items.AddChild(treeview1.Selected,ado_add.fieldbyname('khmc').AsString);
if ado_add.FieldByName('xiaohu').AsBoolean=true then
NodeData[Idx].xiaohu_flag :=true
else
NodeData[Idx].xiaohu_flag :=False;
Node.Data := NodeData[Idx];
ado_add.Next;
end;
end;
你帮我看下哪里有问题-_-~~
......
nodedata[Idx].xiaohu_flag := False;
Node.Data := NodeData[Idx];
......
ado_add.Next;
可是怎么测试程序都不要这样写却可以达到效果的啊,还有哦,再问你一下,nodedata要定义在哪里呀?这是测试程序:
procedure TForm1.Button2Click(Sender: TObject);//一级
var
i:integer;
begin
for i:=0 to 20 do
begin
New(NodeData[i]);
node:=treeview1.Items.Add(nil,'1221');
end;
end;
procedure TForm1.TreeView1DblClick(Sender: TObject);//二级
var
Idx: Integer;
begin
if treeview1.Selected.HasChildren then
abort
else
begin
for Idx := 0 to 10 do
begin
Node := Treeview1.Items.AddChild(treeview1.Selected,'123' );
if Idx mod 2 = 0 then
NodeData[Idx].xiaohu_flag := True
else
NodeData[Idx].xiaohu_flag := False;
Node.Data := NodeData[Idx];
end;
end;
end;
Idx: Integer;
NodeData: array [0..1000] of PTNodeData;
Node_Bill: TTreeNode;
如果说NodeData只能在一个作用域内,那其它两个变量(idx,node_bill),可是定义在public处的吧?
TNodeData = packed record //定义一个记录类型
xiaohu_flag: Boolean; //记录中的变量
end;
PTNodeData=^TNodedata; //这个是表示什么意思,指针吗?
NodeData: array [0..1000] of PTNodeData; //nodedata与ptnodedata是什么关系,
New(NodeData[idx]); //这个又是什么呢,
Node_bill.Data := NodeData[Idx]; //node_bill.data表示的是什么啊?
NodeData[Idx].xiaohu_flag //指针,数组都快晕了~
谢谢你啊,只能说谢谢你了,~~~~~!!!!
Node_bill.Data := NodeData[Idx]; 指针复制NodeData[Idx].xiaohu_flag 读取记录指针指向的内存空间中某个字段数据
PTNodeData(Node.Data). 这样是表示什么呢?
PTNodeData(Node.Data)把无类型指针转换成PTNodeData类型指针。
数组是为了保存多个节点数据指针
那可不可以不用无类型指针node.data,这个应该是相当于一个中间变量一样的吧,这个是在任何一个方法里面都可以用的吗,无须定义? 直接用这样 nodedata[idx].xiaohu_flag 来判断可不可以? (好像不行,这个指针数组是只能在一个作用域内的)老大,你QQ多少啊?以后还会向你请教的呢~