再问一个面试关于TREEVIEW的题目(delphi)

rocket204 2009-01-06 10:12:41
table A
id bh cname lastbh
21 01 银行存款 0
22 02 现金 0
23 0101 中行 01
24 0102 建行 01
25 0201 美圆 02
26 0103 农行 01
27 03 支票 01
28 010101 西江支行 0101
29 010101 三联支行 0102
31 0202 人民币 02
32 0301 期票 03

要通过TREEVIEW以树状形式显示出来,

显示的结果应该是:
01 银行存款
0101 中行
010101 西江支行
010201 三联支行
0102 建行
0103 农行
02 现金
0201 美圆
0202 人民币
03 支票
0301期票

请教各位,如何实现?
谢谢!
...全文
147 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
madejie 2009-01-07
  • 打赏
  • 举报
回复
function getnodelevel(sformat,scode:string):integer;//获得树深度
var i,level,ilen:integer;
begin
level:=-1;
ilen:=0;
if (trim(sformat)<>'') and (trim(scode)<>'') then
for i:=1 to length(sformat) do
begin
ilen:=ilen+strtoint(sformat[i]);
if length(scode)=ilen then
begin
level:=i;
break;
end;
end;
result:=level;
end;

procedure loadtree(tree:Ttreeview;treedb:Tdbdataset;dwnr,dwbm:string);
//treedb可以使用query控件,dwnr可以自己设定如 所有科目,dwbm设定分级如222,
//使用方法loadtree(treeview1,query1,'所有科目','222')
var
curID,nodetxt:string;
i,level,cnode,num:integer;
mynode:array[0..6] of Ttreenode; //最深为6级
begin
tree.items.clear;
level:=0;
tree.items.clear;
mynode[level]:=tree.items.add(tree.topitem,dwnr);
with treedb do
begin
try
if not active then open;
first;
tree.Items.BeginUpdate;
for i:=1 to recordcount do
begin
curID:=trim(fields[0].asstring);
nodetxt:=curID+'-'+ trim(fields[1].asstring);
level:=getnodelevel(dwbm,curID);
if level>0 then
begin
mynode[level]:=tree.items.addchild(mynode[level-1],nodetxt);
end;
next;
end;
tree.Items.EndUpdate;
except
messagedlg('打开数据表出错,请检查基本设置!',mtwarning,[mbok],0);
close;
end;
end;
end;
sanguomi 2009-01-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 jjwander 的回复:]
const
ID_DEPT = 2;
var
nLevel: Integer;
pNodes: array[0..1023] of TTreeNode;
lpID, lpName: string;
TmpSql: string;
begin
TmpSql := 'Select bh,cname from tabla order by bh';
with adoquery1 do
begin
close;
sql.clear;
sql.add(Tmpsql);
Open;
end;
TreeView1.Clear;
pNodes[0] := TreeView1.Add(nil, '所有部门');
with adoquery1.Re…
[/Quote]

写错了一点点,呵呵
TreeView1 后面都没带Item
jjwander 2009-01-07
  • 打赏
  • 举报
回复
贴的代码是我程序段里拷了部分出来修改的

意思差不多这样

LZ自己参考下
jjwander 2009-01-07
  • 打赏
  • 举报
回复
const
ID_DEPT = 2;
var
nLevel: Integer;
pNodes: array[0..1023] of TTreeNode;
lpID, lpName: string;
TmpSql: string;
begin
TmpSql := 'Select bh,cname from tabla order by bh';
with adoquery1 do
begin
close;
sql.clear;
sql.add(Tmpsql);
Open;
end;
TreeView1.Clear;
pNodes[0] := TreeView1.Add(nil, '所有部门');
with adoquery1.Recordset do
while not Eof do
begin
lpID := Fields['bh'].Value;
lpName := Trim(Fields['cname'].Value);
nLevel := Length(lpID) div ID_DEPT;
pNodes[nLevel] := TreeView1.AddChild(pNodes[nLevel - 1], lpName);
MoveNext;
end;
zhihaozwj 2009-01-07
  • 打赏
  • 举报
回复
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, DB, DBTables, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Q: TQuery;
TreeV: TTreeView;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure TreeVExpanding(Sender: TObject; Node: TTreeNode;
var AllowExpansion: Boolean);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var node : TTreeNode;
begin
Q.Close;
Q.DatabaseName := 'D:\' ;
Q.SQL.Clear;

TreeV.Items.Clear;

Q.SQL.Add( ' select * from TableA ' ) ;
Q.Open;
if Q.RecordCount > 0 then
begin
while Not Q.Eof do
begin
if Length(Q.FieldByName('bh').AsString) = 2 then
begin
node := TreeV.Items.Add(nil,Q.FieldByName('bh').AsString + ' ' + Q.FieldByName('CName').AsString );
TreeV.Items.AddChild(node,'') ;
end;
Q.Next ;
end;
end;

end;

procedure TForm1.FormCreate(Sender: TObject);
var t : TTable ;
begin
Q := TQuery.Create(nil);

t := TTable.Create(nil);
t.Close;
t.TableName := 'D:\tableA.DB' ;
t.TableType := ttParadox ;

with t.FieldDefs do
begin
Clear;
Add('id', ftString, 10, False ) ;
Add('bh', ftString, 20, False ) ;
Add('CName',ftString, 50, False ) ;
Add('lastbh',ftString,50, False ) ;
end;
t.CreateTable ;
t.Free;

with TQuery.Create(nil) do
begin
Try
Close;
DataBaseName := 'D:\' ;
SQL.Clear;
SQL.Add( ' insert into tableA values(''21'',''01'',''銀行存款'',''0'') ' ) ;
ExecSQL;

SQL.Clear;
SQL.Add( ' insert into tableA values(''22'',''02'',''現金'',''0'') ' ) ;
ExecSQL ;

SQL.Clear;
SQL.Add( ' insert into tableA values(''23'',''0101'',''中行'',''01'') ' ) ;
ExecSQL ;

SQL.Clear;
SQL.Add( ' insert into tableA values(''24'',''0102'',''建行'',''01'') ' ) ;
ExecSQL ;

SQL.Clear;
SQL.Add( ' insert into tableA values(''25'',''0201'',''美元'',''02'') ' ) ;
ExecSQL ;

SQL.Clear;
SQL.Add( ' insert into tableA values(''26'',''0103'',''農行'',''01'') ' ) ;
ExecSQL ;

SQL.Clear;
SQL.Add( ' insert into tableA values(''27'',''03'',''支票'',''01'') ' ) ;
ExecSQL ;

SQL.Clear;
SQL.Add( ' insert into tableA values(''28'',''010101'',''西行支行'',''0101'') ' ) ;
ExecSQL ;

SQL.Clear;
SQL.Add( ' insert into tableA values(''29'',''010102'',''三聯支行'',''0102'') ' ) ;
ExecSQL ;

SQL.Clear;
SQL.Add( ' insert into tableA values(''31'',''0202'',''人民幣'',''02'') ' ) ;
ExecSQL ;

SQL.Clear;
SQL.Add( ' insert into tableA values(''32'',''0301'',''期票'',''03'') ' ) ;
ExecSQL ;
Finally
Free;
end;
end;
end;

procedure TForm1.TreeVExpanding(Sender: TObject; Node: TTreeNode;
var AllowExpansion: Boolean);
var i :integer ;
node1 : TTreeNode ;
begin
Node.DeleteChildren ;

i := Pos(' ',node.Text) - 1 ;
with TQuery.Create(nil) do
begin
Try
Close;
DataBaseName := 'D:\' ;
SQL.Clear;
SQL.Add( ' select * from TableA ' ) ;
Open;
if RecordCount > 0 then
begin
while Not Eof do
begin
if (i + 2 = Length(FieldByName('bh').AsString ) ) and
(Copy(FieldByName('bh').AsString ,1,i) = Copy(Node.Text,1,i) ) then
begin
node1 := TreeV.Items.AddChild(node,FieldByName('bh').AsString + ' ' + FieldByName('CName').AsString );
TreeV.Items.AddChild(node1,'') ;
end;

Next ;
end;
end ;
Finally
Free;
end;
end;

end;

end.

我這里不能用SQL,只能用本地DB,不好意思
window_8888 2009-01-07
  • 打赏
  • 举报
回复
分数太少.给个100点,我会给你写段代码
tjg5202 2009-01-07
  • 打赏
  • 举报
回复
看起来没有问题的呀。。。。。
zhihaozwj 2009-01-07
  • 打赏
  • 举报
回复
29 010101 三联支行 0102
這行記錄是不是有問題﹐我覺得應該是 29 010102 三联支行 0102

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧