谁能替我解决下面的问题?(0分)

  • 主题发起人 主题发起人 wangchengwu
  • 开始时间 开始时间
W

wangchengwu

Unregistered / Unconfirmed
GUEST, unregistred user!
网上介绍了好多这样的文章,但都不太齐全(没有添加、删除每每层的节点)。今天写了一天关于这方面的东西,还没搞定,代码,烂遭遭的,我不想贴了,各位高人,来写写怎么样?

用树型结构表示科目代码的一种高效算法
在很多常见的财务软件中,科目代码一般都用树型结构来显示。要实现这一点,通常的做法是用多个(嵌套)循环,甚至递归等算法,将科目表中的代码”织”成树,但这样不但算法复杂,而且执行效率低。本人在实际的开发应用中,摸索出一种简单高效的算法,在此和盆托出,只在抛砖引玉,找出最佳解决方案。下面介绍在Delphi中的实现方法。
一.表结构
首先建立如下结构的数据表TREE.DB,并输入一些测试数据:
字段名 类型 长度 说明
aCode 字符型 20 科目代码
aName 字符型 30 科目代码名称
...... ...... ...... ......
表(一)
其中,科目代码aCode的数据类型一定要字符型(一定),长度按具体要求而定,假如要支持六级编码,且代码结构是”3-2-2-2-2-2”,则该字段的长度不小于18,而其他字段则不作要求 。另外,要为字段aCode建一索引(切记),因为要用它来排序。
unit Unit1;

interface

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

type
TForm1 = class(TForm)
treeview1: TTreeView;
ADOConnection1: TADOConnection;
adotable1: TADOTable;
ImageList1: TImageList;
Edit1: TEdit;
Edit2: TEdit;
Button1: TButton;
Button2: TButton;
Edit3: TEdit;
procedure FormCreate(Sender: TObject);
procedure treeview1GetImageIndex(Sender: TObject; Node: TTreeNode);
procedure treeview1GetSelectedIndex(Sender: TObject; Node: TTreeNode);
private
{ Private declarations }
function getlevel(sformat,scode:string):integer;
public
{ Public declarations }
end;

var
Form1: TForm1;
tv:ttreenode;

const
scodeformat = '322222';
sfirstnodetxt = '科目代码';

implementation

{$R *.dfm}

function tform1.getlevel(sformat,scode:string):integer;
var
i,level,ilen:integer;
begin
level:=-1;
ilen:=0;
if (sformat<>'')and(scode<>'')then
for i:=1 to length(sformat) do
begin
ilen:=ilen+strtoint(sformat);
if length(scode)=ilen then
begin
level:=i;
break;
end;
end;
result:=level;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
nowid,showtxt:string;
level:integer;
mynode:array[0..6]of ttreenode;
begin
level:=0;
with adotable1 do
begin
try
if not active then open;
first;
treeview1.items.clear;
mynode[level]:=treeview1.items.add(treeview1.topitem,sfirstnodetxt);
mynode[level].selectedindex:=0;
while not eof do
begin
nowid:=trim(fieldbyname('acode').asstring);
showtxt:=nowid+'-'+fieldbyname('aname').asstring;
level:=getlevel(scodeformat,nowid);
if level> 0 then
begin
mynode[level]:=treeview1.items.addchild(mynode[level-1],showtxt);
end;
next;
end;
finally
close;
end;
end;
mynode[0].expand(false);
end;

procedure TForm1.treeview1GetImageIndex(Sender: TObject; Node: TTreeNode);
begin
node.imageindex:=node.level;
end;

procedure TForm1.treeview1GetSelectedIndex(Sender: TObject;
Node: TTreeNode);
begin
node.selectedindex:=node.imageindex;
end;

end.
 
有什么问题么?
 
后退
顶部