Delphi TList 使用范例

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 里只是沧海一粟。

你可能感兴趣的:(Delphi)