|
用树型结构表示科目代码的一种高效算法(2) 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,SFirstNodeTxt); 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],ShowTxt); MyNode[Level].ImageIndex:=1; MyNode[Level].SelectedIndex:=2; end; //以上是增加子项 Next; end; finally Close; end; end; MyNode[0].EXPand(False);//将首节点展开
|