一、表结构
首先建立如下结构的数据表Code.DB,并输入一些测试数据
其中,科目代码aCode的数据类型一定要字符型(一定),长度按具
二、编写程序
1. 新建一Project:CodeTree.drp,主窗体命名为frmMain,单元存
2. 单元main.pas的完整源代码如下:
unit Main;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls
, Forms, Dialogs
Db, DBTables, ComCtrls, ImgList, StdCtrls;
type
TForm1 = class(TForm)
tvwCode: TTreeView;
tblCode: TTable;
ImageList1: TImageList;
btnClose: TButton;
procedure FormCreate(Sender: TObject);
procedure btnCloseClick(Sender: TObject);
private
{ Private declarations }
function LoadCode(crTbl:TDBDataSet):Integer;
function GetLevel(sFormat,sCode:String):Integer;
public
{ Public declarations }
end;
var
Form1: TForm1;
const
SCodeFormat =‘322222'; //科目代码结构
SFirstNodeTxt =科目代码'; //首节点显示的文字
implementation
{$R *.DFM}
//以下函数是本文的重点部分,其主要功能是用一循环将Code.db
表中的科目代码和
科目代码名称显示出来
function TForm1.LoadCode(crTbl:TDBDataSet):Integer;
var NowID,sName,ShowTxt:String;
i,Level:Integer;
MyNode:array[0..6]of TTreeNode;//保存各级节点,最长支持6
级(重点)
begin
Screen.Cursor:=crHourGlass;
Level:=0;
With crTbl do
begin
try
if not Active then Open;
First;
tvwCode.Items.Clear;
//以下是增加第一项
MyNode[Level]:=tvwCode.Items.Add(tvwCode.TopItem,SFirstN
odeTxt);
MyNode[Level].ImageIndex:=0;
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]:=tvwCode.Items.AddChild(MyNode[Level-1],Sh
owTxt);
MyNode[Level].ImageIndex:=1;
MyNode[Level].SelectedIndex:=2;
end;
//以上是增加子项
Next;
end;
finally
Close;
end;
end;
MyNode[0].Expand(False);//将首节点展开
Screen.Cursor:=crDefault;
end;
//以上函数将Code.db表中的科目代码和科目代码名称显示出来
//下面函数的功能是返回一代码的级数,参数sFormat传递科目代
码结构;
//参数sCode传递某一科目代码
function TForm1.GetLevel(sFormat,sCode:String):Integer;
var i,Level,iLen:Integer;
begin
Level:=-1;//如果代码不符合标准,则返回-1
iLen:=0;
if (sFormat<>‘')and(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 TForm1.FormCreate(Sender: TObject);
begin
with tblCode do
begin
DatabaseName:=ParamStr(1); //使tblCode的DatabaseName指向
应用程序所在的路
径
TableName:=‘Code.DB';
//指向数据表Code.DB
Open;
IndexFieldNames:=‘aCode'; //按字段aCode排序(不要漏掉)
end;
LoadCode(tblCode);
end;
procedure TForm1.btnCloseClick(Sender: TObject);
begin
Close;
end;
end.
其中,常量ScodeFormat是科目代码的代码结构,其定义的规则一
当然,本文的核心是LoadCode函数,该函数用了一个循环来遍历数
三、运行结果
好了,现在把Code.DB复制到和可执行文件相同的目录下,按下F9
以上程序在中文Windows 9x、Delphi 4 C/S环境下编译通过。