unit test;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, DBTables, StdCtrls, ComCtrls, Grids, DBGrids;type
TFormMain = class(TForm)
Query1: TQuery;
TreeView1: TTreeView;
Query2: TQuery;
DBGrid1: TDBGrid;
DataSource1: TDataSource;
Table1: TTable; procedure addParentItem(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure addChildItem(node: TTreeNode;str: String);
procedure TreeView1DblClick(Sender: TObject); private
{ Private declarations }
public
{ Public declarations }
end;var
FormMain: TFormMain;
node:TTreeNode;implementation{$R *.dfm}procedure TFormMain.addParentItem(Sender: TObject);
var strTradeClass:String;
begin
strTradeClass:='';
with query1 do //查询所有交易类型
begin
SQL.Clear;
sql.Add('select distinct TradeClass from TradeTypeRecord');
open;
end;
//添加父结点
while not query1.Eof do
begin
node:=treeview1.Items.Add(node,query1.fieldbyname('tradeclass').AsString);
addChildItem(Node,query1.fieldbyname('tradeclass').AsString); //调用添加子结点过程
query1.Next; end;
end;
procedure TFormMain.FormCreate(Sender: TObject);begin
Node:=nil;
addParentItem(Sender);
end;
procedure TFormMain.addChildItem(node: TTreeNode;str: String);
begin
with query2 do //根据交易类型查询表名
begin
sql.Clear;
sql.Add('select TableName from TradeTypeRecord where +TradeClass='''+str+'''') ;
sql.Add('order by tablename');
open;
end;
while not query2.Eof do //添加子结点
begin
treeview1.Items.AddChild(node,query2.fieldbyname('TableName').AsString);
query2.Next;
end;
end;procedure TFormMain.TreeView1DblClick(Sender: TObject);
begin
table1.TableName:=treeview1.Selected.Text;
table1.Active:=true;
end;end.
这是一个示例,自己写的,经检验没错误,不过你那里表名可能不一样,数据库要改,另外,此界面比较丑陋,忍耐一下。
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, DBTables, StdCtrls, ComCtrls, Grids, DBGrids;type
TFormMain = class(TForm)
Query1: TQuery;
TreeView1: TTreeView;
Query2: TQuery;
DBGrid1: TDBGrid;
DataSource1: TDataSource;
Table1: TTable; procedure addParentItem(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure addChildItem(node: TTreeNode;str: String);
procedure TreeView1DblClick(Sender: TObject); private
{ Private declarations }
public
{ Public declarations }
end;var
FormMain: TFormMain;
node:TTreeNode;implementation{$R *.dfm}procedure TFormMain.addParentItem(Sender: TObject);
var strTradeClass:String;
begin
strTradeClass:='';
with query1 do //查询所有交易类型
begin
SQL.Clear;
sql.Add('select distinct TradeClass from TradeTypeRecord');
open;
end;
//添加父结点
while not query1.Eof do
begin
node:=treeview1.Items.Add(node,query1.fieldbyname('tradeclass').AsString);
addChildItem(Node,query1.fieldbyname('tradeclass').AsString); //调用添加子结点过程
query1.Next; end;
end;
procedure TFormMain.FormCreate(Sender: TObject);begin
Node:=nil;
addParentItem(Sender);
end;
procedure TFormMain.addChildItem(node: TTreeNode;str: String);
begin
with query2 do //根据交易类型查询表名
begin
sql.Clear;
sql.Add('select TableName from TradeTypeRecord where +TradeClass='''+str+'''') ;
sql.Add('order by tablename');
open;
end;
while not query2.Eof do //添加子结点
begin
treeview1.Items.AddChild(node,query2.fieldbyname('TableName').AsString);
query2.Next;
end;
end;procedure TFormMain.TreeView1DblClick(Sender: TObject);
begin
table1.TableName:=treeview1.Selected.Text;
table1.Active:=true;
end;end.
这是一个示例,自己写的,经检验没错误,不过你那里表名可能不一样,数据库要改,另外,此界面比较丑陋,忍耐一下。
弄一个窗口,放上一个TreeView和一个Button,分别取名为TV1和Btn1。如果需要
在每个节点前有个图,请在窗口上放上一个ImageList,取名为ImageList1,双击
它,加入六个图标。还要记得记得将TV1的Images属性改为ImageList1噢。双击按
钮Btn1,在里面填入以下代码,然后按F9运行,点击Btn1就可以看到效果了。
procedure TForm1.Btn1Click(Sender: TObject);
Const
MyDocDir = 'C:\My Documents';
PersonDir = '3hSoft';
Var
Var
I : Word;
SubNodeName : array [1..5] of ShortString;
RootNode, SubNode : TTreeNode;
P : PString;
begin
SubNodeName[1] := '便笺';
SubNodeName[2] := '发件箱';
SubNodeName[3] := '联系人';
SubNodeName[4] := '任务';
SubNodeName[5] := '日记';
TV1.Items.Clear;
TV1.Items.BeginUpdate;
New(P);
P^ := MyDocDir + '\' + PersonDir;
RootNode := TV1.Items.AddObject(Nil, '个人文件夹', P);
// 此 Node 的图标已对 Images 属性中取第 0 个了。
For I := 1 to 5 do
begin
New(P);
P^ := MyDocDir + '\' + PersonDir + '\' + SubNodeName[I];
SubNode := TV1.Items.AddChildObject(RootNode, SubNodeName[I], P)
;
;
// 如果不想使用图标的话请删除以下两行
SubNode.ImageIndex := I;
SubNode.SelectedIndex := I;
end;
TV1.Items.EndUpdate;
end;
二.在TreeView中如何设置选中结点
var
i:integer; {i为设置的选中结点的索引值}
begin
if i>treeview1.items.count then
treeview1.items[i].selected:=true;
或
treeview1.selected:=treeview1.items[i];
三。设置TreeView结点的图形
1. 设置TreeView的images属性为已存在的images对象
treeview1.images:=imagelist1;
2. 在加入结点后执行:
var
anode:TTreeNode;
begein
anode:=Treeview1.add(nil,'item1');
anode.imageindex:=0; {结点未选中时显示的图标}
anode.selectedindex:=1; {结点选中时显示的图标}
end
3. 如果结点图形在改变后未发生变化,可以执行:
treeview1.refresh;
四。如何批量处理TreeView结点
使用TreeView的items属性的BeginUpdate和EndUpdate方法,例:
TreeView1.items.BeginUpdate;
for i:=0 to TreeView1.items.count-1 do
begin
//将每个结点的文字改成为小写字母
TreeView1.items[i].text:=lowercase(TreeView1.items[i].text);
end;
TreeView1.items.EndUpdate;
五。实现TreeView结点拖拽的实例
下面的程序片段演示了如何实现拖拽treeview构件结点的例子
{鼠标按下时执行的语句}
procedure TForm1.Treeview1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
{判断左键按下并且鼠标点在一个结点上开始实现拖拽}
if ( Button = mbLeft ) and
( htOnItem in Treeview1.GetHitTestInfoAt( X, Y ) ) then
begin
Treeview1.BeginDrag( False );
end;
end;
{鼠标拖动执行语句}
procedure TForm1.Treeview1DragOver( Sender, Source: TObject;
X, Y: Integer; State: TDragState; var Accept: Boolean);
var
Node : TTreeNode;
begin
if Source = Treeview1 then
begin
Node := Treeview1.GetNodeAt( X, Y ); {取当前结点}
if Node <> nil then {当前结点不为空才能实现拖拽,accept:=true}
Accept := true;
end;
end;
{鼠标释放时执行的语句}
procedure TForm1.Treeview1DragDrop( Sender, Source: TObject;
X, Y : Integer );
var
TempNode : TTreeNode;
AttachMode : TNodeAttachMode;
begin
if Treeview1.Selected = nil then
Exit;
AttachMode := naAddChild; {设置结点移动模式,设移动结点为子结点}
{ 注意在这里存在一个bug,当移动结点时,如果目标结点没有子结点,}
{ 则加入的新的子结点会失败,所以先在当前目标结点的下面 }
{ 加入一个临时子结点,移动完毕后,再将临时结点删除 }
Treeview1.Items.BeginUpdate;
try
TempNode := Treeview1.Items.AddChild( Treeview1.DropTarget,
'Temp' );
try
{ 移动选中的结点到目标结点 }
Treeview1.Selected.MoveTo( Treeview1.DropTarget, AttachMode );
finally
TempNode.Free; { 不要忘了释放临时结点 }
end;
finally
Treeview1.Items.EndUpdate;
end;
end;
弄一个窗口,放上一个TreeView和一个Button,分别取名为TV1和Btn1。如果需要
在每个节点前有个图,请在窗口上放上一个ImageList,取名为ImageList1,双击
它,加入六个图标。还要记得记得将TV1的Images属性改为ImageList1噢。双击按
钮Btn1,在里面填入以下代码,然后按F9运行,点击Btn1就可以看到效果了。
procedure TForm1.Btn1Click(Sender: TObject);
Const
MyDocDir = 'C:\My Documents';
PersonDir = '3hSoft';
Var
Var
I : Word;
SubNodeName : array [1..5] of ShortString;
RootNode, SubNode : TTreeNode;
P : PString;
begin
SubNodeName[1] := '便笺';
SubNodeName[2] := '发件箱';
SubNodeName[3] := '联系人';
SubNodeName[4] := '任务';
SubNodeName[5] := '日记';
TV1.Items.Clear;
TV1.Items.BeginUpdate;
New(P);
P^ := MyDocDir + '\' + PersonDir;
RootNode := TV1.Items.AddObject(Nil, '个人文件夹', P);
// 此 Node 的图标已对 Images 属性中取第 0 个了。
For I := 1 to 5 do
begin
New(P);
P^ := MyDocDir + '\' + PersonDir + '\' + SubNodeName[I];
SubNode := TV1.Items.AddChildObject(RootNode, SubNodeName[I], P)
;
;
// 如果不想使用图标的话请删除以下两行
SubNode.ImageIndex := I;
SubNode.SelectedIndex := I;
end;
TV1.Items.EndUpdate;
end;
二.在TreeView中如何设置选中结点
var
i:integer; {i为设置的选中结点的索引值}
begin
if i>treeview1.items.count then
treeview1.items[i].selected:=true;
或
treeview1.selected:=treeview1.items[i];
三。设置TreeView结点的图形
1. 设置TreeView的images属性为已存在的images对象
treeview1.images:=imagelist1;
2. 在加入结点后执行:
var
anode:TTreeNode;
begein
anode:=Treeview1.add(nil,'item1');
anode.imageindex:=0; {结点未选中时显示的图标}
anode.selectedindex:=1; {结点选中时显示的图标}
end
3. 如果结点图形在改变后未发生变化,可以执行:
treeview1.refresh;
四。如何批量处理TreeView结点
使用TreeView的items属性的BeginUpdate和EndUpdate方法,例:
TreeView1.items.BeginUpdate;
for i:=0 to TreeView1.items.count-1 do
begin
//将每个结点的文字改成为小写字母
TreeView1.items[i].text:=lowercase(TreeView1.items[i].text);
end;
TreeView1.items.EndUpdate;
五。实现TreeView结点拖拽的实例
下面的程序片段演示了如何实现拖拽treeview构件结点的例子
{鼠标按下时执行的语句}
procedure TForm1.Treeview1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
{判断左键按下并且鼠标点在一个结点上开始实现拖拽}
if ( Button = mbLeft ) and
( htOnItem in Treeview1.GetHitTestInfoAt( X, Y ) ) then
begin
Treeview1.BeginDrag( False );
end;
end;
{鼠标拖动执行语句}
procedure TForm1.Treeview1DragOver( Sender, Source: TObject;
X, Y: Integer; State: TDragState; var Accept: Boolean);
var
Node : TTreeNode;
begin
if Source = Treeview1 then
begin
Node := Treeview1.GetNodeAt( X, Y ); {取当前结点}
if Node <> nil then {当前结点不为空才能实现拖拽,accept:=true}
Accept := true;
end;
end;
{鼠标释放时执行的语句}
procedure TForm1.Treeview1DragDrop( Sender, Source: TObject;
X, Y : Integer );
var
TempNode : TTreeNode;
AttachMode : TNodeAttachMode;
begin
if Treeview1.Selected = nil then
Exit;
AttachMode := naAddChild; {设置结点移动模式,设移动结点为子结点}
{ 注意在这里存在一个bug,当移动结点时,如果目标结点没有子结点,}
{ 则加入的新的子结点会失败,所以先在当前目标结点的下面 }
{ 加入一个临时子结点,移动完毕后,再将临时结点删除 }
Treeview1.Items.BeginUpdate;
try
TempNode := Treeview1.Items.AddChild( Treeview1.DropTarget,
'Temp' );
try
{ 移动选中的结点到目标结点 }
Treeview1.Selected.MoveTo( Treeview1.DropTarget, AttachMode );
finally
TempNode.Free; { 不要忘了释放临时结点 }
end;
finally
Treeview1.Items.EndUpdate;
end;
end;
弄一个窗口,放上一个TreeView和一个Button,分别取名为TV1和Btn1。如果需要
在每个节点前有个图,请在窗口上放上一个ImageList,取名为ImageList1,双击
它,加入六个图标。还要记得记得将TV1的Images属性改为ImageList1噢。双击按
钮Btn1,在里面填入以下代码,然后按F9运行,点击Btn1就可以看到效果了。
procedure TForm1.Btn1Click(Sender: TObject);
Const
MyDocDir = 'C:\My Documents';
PersonDir = '3hSoft';
Var
Var
I : Word;
SubNodeName : array [1..5] of ShortString;
RootNode, SubNode : TTreeNode;
P : PString;
begin
SubNodeName[1] := '便笺';
SubNodeName[2] := '发件箱';
SubNodeName[3] := '联系人';
SubNodeName[4] := '任务';
SubNodeName[5] := '日记';
TV1.Items.Clear;
TV1.Items.BeginUpdate;
New(P);
P^ := MyDocDir + '\' + PersonDir;
RootNode := TV1.Items.AddObject(Nil, '个人文件夹', P);
// 此 Node 的图标已对 Images 属性中取第 0 个了。
For I := 1 to 5 do
begin
New(P);
P^ := MyDocDir + '\' + PersonDir + '\' + SubNodeName[I];
SubNode := TV1.Items.AddChildObject(RootNode, SubNodeName[I], P)
;
;
// 如果不想使用图标的话请删除以下两行
SubNode.ImageIndex := I;
SubNode.SelectedIndex := I;
end;
TV1.Items.EndUpdate;
end;
二.在TreeView中如何设置选中结点
var
i:integer; {i为设置的选中结点的索引值}
begin
if i>treeview1.items.count then
treeview1.items[i].selected:=true;
或
treeview1.selected:=treeview1.items[i];
三。设置TreeView结点的图形
1. 设置TreeView的images属性为已存在的images对象
treeview1.images:=imagelist1;
2. 在加入结点后执行:
var
anode:TTreeNode;
begein
anode:=Treeview1.add(nil,'item1');
anode.imageindex:=0; {结点未选中时显示的图标}
anode.selectedindex:=1; {结点选中时显示的图标}
end
3. 如果结点图形在改变后未发生变化,可以执行:
treeview1.refresh;
四。如何批量处理TreeView结点
使用TreeView的items属性的BeginUpdate和EndUpdate方法,例:
TreeView1.items.BeginUpdate;
for i:=0 to TreeView1.items.count-1 do
begin
//将每个结点的文字改成为小写字母
TreeView1.items[i].text:=lowercase(TreeView1.items[i].text);
end;
TreeView1.items.EndUpdate;
五。实现TreeView结点拖拽的实例
下面的程序片段演示了如何实现拖拽treeview构件结点的例子
{鼠标按下时执行的语句}
procedure TForm1.Treeview1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
{判断左键按下并且鼠标点在一个结点上开始实现拖拽}
if ( Button = mbLeft ) and
( htOnItem in Treeview1.GetHitTestInfoAt( X, Y ) ) then
begin
Treeview1.BeginDrag( False );
end;
end;
{鼠标拖动执行语句}
procedure TForm1.Treeview1DragOver( Sender, Source: TObject;
X, Y: Integer; State: TDragState; var Accept: Boolean);
var
Node : TTreeNode;
begin
if Source = Treeview1 then
begin
Node := Treeview1.GetNodeAt( X, Y ); {取当前结点}
if Node <> nil then {当前结点不为空才能实现拖拽,accept:=true}
Accept := true;
end;
end;
{鼠标释放时执行的语句}
procedure TForm1.Treeview1DragDrop( Sender, Source: TObject;
X, Y : Integer );
var
TempNode : TTreeNode;
AttachMode : TNodeAttachMode;
begin
if Treeview1.Selected = nil then
Exit;
AttachMode := naAddChild; {设置结点移动模式,设移动结点为子结点}
{ 注意在这里存在一个bug,当移动结点时,如果目标结点没有子结点,}
{ 则加入的新的子结点会失败,所以先在当前目标结点的下面 }
{ 加入一个临时子结点,移动完毕后,再将临时结点删除 }
Treeview1.Items.BeginUpdate;
try
TempNode := Treeview1.Items.AddChild( Treeview1.DropTarget,
'Temp' );
try
{ 移动选中的结点到目标结点 }
Treeview1.Selected.MoveTo( Treeview1.DropTarget, AttachMode );
finally
TempNode.Free; { 不要忘了释放临时结点 }
end;
finally
Treeview1.Items.EndUpdate;
end;
end;
procedure TForm_goods.FormCreate(Sender: TObject);
var
jb:integer; //编号长度
treenode_jb1,treenode_jb2,treenode_jb3,treenode_jb4:Ttreenode;
begin //往列表里追加商品资料
{while timer2.Enabled do
application.ProcessMessages; }
data.database_server.open;
data.database_local.open;
treenode_jb1:=nil;
with data.Query1 do begin
if active then close;
sql.clear;
sql.Add('select * from goods');
prepare;
open;
first;
while not eof do begin
jb:=length(trim(fieldbyname('goodsnumber').asstring));
case jb of
2:
begin
treenode_jb1:=treeview.Items.Add(treenode_jb1,fieldbyname('goodsnumber').asstring+' '+fieldbyname('goodsname').asstring);
treenode_jb1.ImageIndex:=1;
end;
5:
begin
treenode_jb2:=treeview.Items.AddChild (treenode_jb1,fieldbyname('goodsnumber').asstring+' '+fieldbyname('goodsname').asstring);
treenode_jb2.ImageIndex:=1;
end;
7:
begin
treenode_jb3:=treeview.Items.AddChild(treenode_jb2,Fieldbyname('goodsnumber').asstring+' '+Fieldbyname('goodsname').asstring);
treenode_jb3.ImageIndex:=1;
end;
11:
begin
treenode_jb4:=treeview.Items.AddChild(treenode_jb3,Fieldbyname('goodsnumber').asstring+' '+Fieldbyname('goodsname').asstring);
treenode_jb4.ImageIndex:=2;
end;
end;
next;
end;
end;
end;
begin
var
gNode:TTreeNode;
begin
gNode:=TreeView1.Selected;
//if then gNode.ImageIndex:=2;
if gNode<>nil then
begin
//这里,你定义的程序
......
var
Node : TTreeNode;
begin
Node := TreeView1.selected; // 取得双击的节点。
//调用某过程
Myprocdure(Node.text);
//打开一个程序
ShellExecute(Handle,'open', 'notebook.exe', nil,
PChar(DefaultPath + '\Tools'), SW_SHOW);
end;
begin
var
gNode:TTreeNode;
begin
gNode:=TreeView1.Selected;
//if then gNode.ImageIndex:=2;
if gNode<>nil then
begin
//这里,你定义的程序
......
begin
var
gNode:TTreeNode;
begin
gNode:=TreeView1.Selected;
//if then gNode.ImageIndex:=2;
if gNode<>nil then
begin
//这里,你定义的程序
......
begin
var
gNode:TTreeNode;
begin
gNode:=TreeView1.Selected;
//if then gNode.ImageIndex:=2;
if gNode<>nil then
begin
//这里,你定义的程序
......
begin
var
gNode:TTreeNode;
begin
gNode:=TreeView1.Selected;
//if then gNode.ImageIndex:=2;
if gNode<>nil then
begin
//这里,你定义的程序
......
begin
var
gNode:TTreeNode;
begin
gNode:=TreeView1.Selected;
//if then gNode.ImageIndex:=2;
if gNode<>nil then
begin
//这里,你定义的程序
......