TstringList (Classes.pas)
在TstringList里,那些String被一行一行地储存。TstringList.Text返回全部的String。如果第一、二、三行分别是/'aa/'、/'bb/'、/'cc/' 的话,那么Text 返回的是“/'aa/'+#13#10+/'bb/'+#13#10+/'cc/'+#13#10” (不包括双引号)。所有的String都被TstringList用回车和换行符(#13#10)连接了起来。如果依次向Text赋值的话,Text就会被自动地分割成行储存在TstringList 里。这充分地体现出TstringList的一个很实用的价值:它能让我们逐行处理String。假如我们要操作第4行,只需操作TstringList[3]。相信大家会问,TstringList明明是一个类,为什么能当数组那样子用呢?其实,我们在写TstringList[3]的时候,就是在写TstringList.Strings[3]。Strings是TstringList的一个缺省属性。数组性的缺省属性就是这样子使用的。如果大家在编写类的时候要用到这么一个功能的话,可以参照如下方法:
property AProperty[I: Integer] read *** write ***;
default;。
Strings 是一个可读写的属性。这也就是说,大家不仅可以获得第N 行的内容,也可以改变第N 行的内容。因此我们需要知道TstringList 里S t r i n g 的总行数。TstringList的属性Count则可以满足我们的需要。
上面已经说过,Text是一个返回所有字符串的属性。向Text赋值时,TstringList能够自动地把Text分成一行一行的,然后储存在TstringList里(当然,TstringList里面并不完全是这么储存的,详细过程建议看TstringList和TStrings的代码)。这样,Strings返回的字符串就是没
有回车和换行的。但是,如果我们向Strings赋值的字符串有回车和换行,那么会出现什么情况呢?此时,Strings就会把那个字符串断成几行,插入到原来的位置上。如果TstringList只有这么些功能的话,那我就不必专门拿出来讲了——我是说,TstringList能让我们任意
地插入或删除某行,这就要用到TstringList提供的方法。
function Add(const S: string): Integer;
procedure Append(const S: string);
Add方法向TstringList的末尾添加一行String(在这里和下面我们都假设输入的字符串没有回车和换行,否则String将被分割)。参数S 代表的是要插入的字符串的内容。Add的返回值代表了新的字符串在TstringList的位置——也就是最后一行的位置,即新的Count 减去一。
Append 方法与Add 唯一不同的地方是没有返回值。
procedure Insert(Index: Integer; const S: string);
Insert方法向TstringList插入一行字符串。在Insert里,我们可以自由地选择字符串插入的位置。参数S 代表要插入的字符串的内容,Index 代表要插入的位置。
procedure Delete(Index: Integer);
Delete 方法删除某行字符串,我们同样可以自由地选择删除任意一行字符串。参数Index代表要删除的那一行字符串的位置。学习笔记
function IndexOf(const S: string): Integer;
IndexOf查找某一字符串在TstringList里的位置。参数S代表要查找的字符串。如果TstringList里不存在S的话,则返回-1。
procedure Move(CurIndex, NewIndex: Integer);
procedure Exchange(Index1, Index2: Integer);
TstringList另外还提供了两个方法—— Move 和Exchange。Move方法能把一行字符串抽出来并插入到另一个指定的位置上。参数CurIndex代表要移动的字符串的位置,NewIndex 代表字符串新的位置。
Exchange方法则能将随便两行字符串交换。参数Index1和Index2代表两行需要交换的字符串的位置。
procedure LoadFromFile(const FileName: string);
procedure SaveToFile(const FileName: string);
TstringList的LoadFromFile和SaveToFile两个方法,使得我们对文本文件的操作变得非常方便。参数FileName 代表目标文本文件的文件名。例如我们在编写记事本的时候,用到的TMemo.Lines 就是TStrings(TstringList的父类,功能几乎相同,只是因为TStrings是虚类,我们无法创建并使用)。在保存的时候只需一行代码:TMemo.Lines.SaveToFile(FileName),非常方便。
TstringList还有一项特殊功能:可以把TstringList当成ini控制器使用。不过它没有Section。现在我就来介绍TstringList的两个属性:Names和Values。
如果TstringList的内容是这样子的:
ID=1
Name=Vczh
PositionID=8
Tel=00000000
那么,Names[2]就返回“PositionID ”,Values[/'PositionID/']就返回“8”。其中“Names”是只读属性,而“Value”则可写。TstringList使我们不必拘泥于ini和注册表。关于TstringList没有Section这个问题,我们完全可以在Names 里做点手脚,只要程序能够识别就行(文
章末尾处的范例里将出现此方法供大家参照)。
TstringList还有一个可以存放Object的功能。但是我个人认为使用TObjectList比较好,因为TObjectList在这方面提供了比TstringList更多的功能。
下面我提供一个例程来介绍Values属性。
新建一个工程保存,并在dpr文件所在的文件夹里建立一个叫做“Config.txt”的文件,并输入以下内容:
Name=VCZH
Address=Somewhere
[email protected]
然后,建立一个窗体。如图所示:并在TForm1 的Private 区段里建立一个变量:
SL:TstringList;
这个例程的功能是编辑Config.txt 里的Name 、Address、Email。SL在程序启动时读入Config.txt文件;按下Cancel 按钮则退出;按下OK 按钮则改变SL 的内容并保存在Config.txt文件里;当程序再次运行时,改变后的内容就会显示在三个文本框里。代码如下:
procedure TForm1.FormCreate(Sender: TObject);
begin
SL:=TstringList.Create;
{ 获取当前程序文件所在的文件夹名称以获得C o n f i g . t x t 文件的路径 }
SL.LoadFromFile(ExtractFilePath(ParamStr(0))+/'Config.
txt/');
end;
procedure TForm1.FormClose(Sender: TObject; var Action:
TCloseAction);
begin
SL.Free;
end;
procedure TForm1.btnCancelClick(Sender: TObject);
begin
Close;
end;
procedure TForm1.FormShow(Sender: TObject);
begin
{ 通过上面介绍的V a l u e s 属性获得各个字段的内容 }
edtName.Text:=SL.Values[/'Name/'];
edtAddress.Text:=SL.Values[/'Address/'];
edtEmail.Text:=SL.Values[/'Email/'];
end;
procedure TForm1.btnOKClick(Sender: TObject);
begin
{ 修改各个字段的内容并保存 }
SL.Values[/'Name/']:=edtName.Text;
SL.Values[/'Address/']:=edtAddress.Text;
SL.Values[/'Email/']:=edtEmail.Text;
SL.SaveToFile(ExtractFilePath(ParamStr(0))+/'Config.
txt/');
Close;
end;