您的位置:首页 > 编程语言 > Delphi

Delphi TList 使用范例

2014-04-10 15:50 561 查看


Delphi TList 使用范例

TList包含对象指针列表。 
Tlist用于存储和维护对象列表。TList引入属隆和方法以执行以下操作: 
(1)在列表中增加或删除对象。 
(2)在列表中重排对象。 
(3)在列表中定位和获得对象。 
(4)在列表中对对象进行排序。 
属性列表 
Capacity 标识TList对象维护的指针数组的大小。 
Count 表明在列表中使用的项的数量。 
Items 列出对象的引用。 
List 标识组成Items的指针数组。 
方法列表 
~TList 删除与TList对象有关的内存。 
Add 在列表的末尾插入有关的内存。 
Clear 从列表中删除所有项。 
Delete 删除Index参数标识的项。 
Error 产生EListError异常。 
Exchange 交换Items数组中两项的位置。 
Expand 增加列表的Capacity。 
First 返回Items[0]。 
IndexOf 返回Items数组中一指针的索引。 
Insert 增加一对象至Items数组中。 
Last 返回Items[Count-1]。 
Move 在Items数组中改变某一项的位置。 
Pack 从Items数组中删除所有的零项。 
Remove 从Items数组中删除Items参数的第一个引用。 
Sort 在列表中执行QuickSort。 
TList 创建一个新的TList对象。

 

现在,让我们用一个例子来结束我对Delphi的List的介绍。这个例子是一个管理人员信息的程序。不过因为这只是一个示例,所以这个程序只是一个简单的ConsoleApplication。使用Console Application来做示例程序可以免掉一些界面设计的工作。这个程序通过Index来管理人员信息。人员信息包括Name、Telephone和Address。程序通过TstringList来读取人员信息文件,然后用那些指向Record的指针把信息存放在TList里并修改。代码如下:

程序代码

program Info

{$APPTYPE CONSOLE}

uses

SysUtils, Classes;

type

PInfo=^TInfo;

TInfo=record

Name:String;

Tel:String;

Address:String;

end;

var

SL:TstringList;

List:TList;

AppPath:String;

{ 开辟一个新的PInfo 指针,填入信息并返回指针将在Command_Delete 或FinaInfo 里释放 }

function MakeInfo(Name,Tel,Address:String):PInfo;

var P:PInfo;

begin

New(P);

P^.Name:=Name;

P^.Tel:=Tel;

P^.Address:=Address;

{ 返回的指针将被保存在List 里 }

result:=P;

end;

{ 在屏幕上打印所有可用的命令 }

procedure PrintMenu;

begin

writeln(\'======菜单======\');

writeln(\'V---- 查看所有人员的信息\');

writeln(\'A---- 增添新的人员信息\');

writeln(\'D----删除人员\');

writeln(\'E---- 修改人员信息\');

writeln(\'M---- 查看所有可用命令\');

writeln(\'X----退出程序\');

end;

{ 修改人员信息的程序 }

procedure Command_Edit;

var I:Integer;

Name,Tel,Address:String;

P:PInfo;

begin

write(\' 请输入要修改的人员信息的序号:\');

readln(I);

if(I<0)or(I>=List.Count)then

writeln(\' 输入超出范围。\')

else

begin

{ 取得某个人员信息的指针 }

P:=List.Items;

writeln(\' 开始输入人员信息(若某项信息不需要修改则留

空):\');

write(\' 姓名:\');

readln(Name);

write(\' 电话号码:\');

readln(Tel);

write(\' 地址:\');

readln(Address);

{ 保存输入的信息 }

if Name<>\'\' then P^.Name:=Name;

if Tel<>\'\' then P^.Tel:=Tel;

if Address<>\'\' then P^.Address:=Address;

writeln(\' 修改人员信息执行完毕。\');

end;

end;

{ 增加人员信息的程序 }

procedure Command_Add;

var Name,Tel,Address:String;

begin

writeln(\' 开始输入人员信息:\');

write(\' 姓名:\');

readln(Name);

write(\' 电话号码:\');

readln(Tel);

write(\' 地址:\');

readln(Address);

{ 使用MakeInfo 生成TInfo 的指针

并加入Tlist 中 }

List.Add(MakeInfo(Name,Tel,Address));

writeln(\' 增加人员信息执行完毕。\');

end;

{ 打印所有人员信息的程序 }

procedure Command_View;

var I:Integer;

P:PInfo;

begin

writeln(\' 人员信息列表:\');

for I:=0 to List.Count-1 do

begin

P:=List.Items;

writeln(IntToStr(I)+\'号===================\');

writeln(\'姓名:\'+P^.Name);

writeln(\'电话:\'+P^.Tel);

writeln(\'地址:\'+P^.Address);

{ 满六个就暂停,刚好填满一个屏幕 }

if I mod 6=5 then

begin

writeln(\' 请按回车键继续。\');

readln;

end;

end;

writeln;

end;

{ 删除人员信息的程序 }

procedure Command_Delete;

var I:Integer;

P:PInfo;

begin

write(\' 请输入要删除的人员信息的序号:\');

readln(I);

if(I<0)or(I>=List.Count)then

writeln(\' 输入超出范围。\')

else

begin

P:=List.Items;

List.Delete(I);

Dispose(P);

writeln(\' 删除执行完毕。\');

writeln;

end;

end;

{ 处理用户输入的命令 }

function GetCommand:Boolean;

{ 返回False 表示退出 }

var C:Char;

begin

write(\' 输入命令并回车:\');

readln(C);

result:=True;

case C of

\'V\',\'v\':Command_View;

\'A\',\'a\':Command_Add;

\'D\',\'d\':Command_Delete;

\'M\',\'m\':PrintMenu;

\'X\',\'x\':result:=False;

\'E\',\'e\':Command_Edit;

else writeln(\' 未知命令。\');

end;

end;

{ 从Info.txt 把人员信息加载入Tlist }

procedure LoadInfo;

var I:Integer;

Name,Tel,Address,Index:String;

begin

SL.LoadFromFile(AppPath+\'Info.txt\');

for I:=0 to SL.Count div 3-1 do

begin

Index:=IntToStr(I)+\'.\';

{ 文件格式:Index.Field=Value

在这里使用Index.X 区别不同序号的人员信息的字段名称

然后通过Values 属性读取信息 }

Name:=SL.Values[Index+\'Name\'];

Tel:=SL.Values[Index+\'Tel\'];

Address:=SL.Values[Index+\'Address\'];

List.Add(MakeInfo(Name,Tel,Address));

end;

end;

{ 把TList 里的人员信息保存到Info.txt }

procedure SaveInfo;

var I:Integer;

P:PInfo;

begin

SL.Clear;{ 清空TstringList }

for I:=0 to List.Count-1 do

begin

P:=List.Items;

SL.Add(IntToStr(I)+\'.Name=\'+P^.Name);

SL.Add(IntToStr(I)+\'.Tel=\'+P^.Tel);

SL.Add(IntToStr(I)+\'.Address=\'+P^.Address);

end;

SL.SaveToFile(AppPath+\'Info.txt\');

end;

{ 初始化程序 }

procedure InitInfo;

begin

SL:=TstringList.Create;

List:=TList.Create;

{ 获得本程序所在的路径 }

AppPath:=ExtractFilePath(ParamStr(0));

end;

{ 清空程序使用的内存 }

procedure FinaInfo;

var I:Integer;

begin

for I:=0 to List.Count-1 do

Dispose(PInfo(List.Items));

List.Free;

SL.Free;

end;

begin

{ TODO -oUser -cConsole Main : Insert code here }

InitInfo;

LoadInfo;

writeln(\'Information Editor V1.0 by VCZH\');

PrintMenu;

while GetCommand do;{ 循环直到返回False }

SaveInfo;

FinaInfo;

writeln(\' 谢谢使用。请按回车键退出程序。\');

readln;

end.

在循环开始时,I 的值被指向0,然后Index的值就变成“0.”。在执行Name:=SL.Values[Index+\'Name\']时,就等于执行Name:=SL.Values[\'0.Name\']于是, “0.Name”这个字段的内容就被读取,然后Name 就变成了“vczh ”。接着进入下一个循环。程序就是通过在字段前加“Index.”这样的方法区别不同人员的信息。在读取完一个人的信息后,程序执行List.Add(MakeInfo(Name,Tel,Address)),信息便存放在List里了。程序通过操作List
增加、删除或修改人员信息。在用户退出程序时,程序将List里的所有信息保存在“Info.txt”里。过程是这样的:程序先清空SL 里的内容,然后按照Info.txt原来的文件格式填写信息。因为Info.txt里的人员数目是会改变的,因此便不能使用TstringList.Values属性修改,而必须在清空TstringList后手动构建字段并填写信息。

 

Info.txt 的内容如下

0.Name=vczh

0.Tel=1234567

0.Address=Jupiter

1.Name= 陈梓瀚

1.Tel=8888888

1.Address=Venus

2.Name=chenzihan

2.Tel=9999999

2.Address=Mars

3.Name=Victor

3.Tel=0000000

3.Address=Saturn

经过这样的介绍,大家对Delphi 包含的与List,有相似性质的类都有了一定的认识。Delphi VCL 开发组为我们准备了这么多既实用又有效率的功能。而List在庞大的Delphi VCL 里只是沧海一粟。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: