码迷,mamicode.com
首页 > Windows程序 > 详细

Delphi小谈之TStringList篇

时间:2015-07-28 17:36:49      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:

转载自:http://blog.csdn.net/jqandjq/article/details/5429137

 

  看了这里标题,大家可能以为我会谈TListBox控件,那就错了。我要谈的是Delphi提供给我们的具有列表性质的类:TStringList、TList和TObjectList。TStringList用来存放字符串,TList存放指针,而TObjectList则存放对象(Object)

  在我们使用Delphi的过程中,有很多数据的存储是要靠 数组解决的。虽然Delphi现在已经支持了可变数组,不过总有那么点缺陷:我们不能在删除一个项之后,使后边的项目自动前靠。因此,说说Delphi现成的List还是很有价值的。

 

  本文中先介绍TStringList,TList和TObjectList将在下面的两个文章中分别介绍。

  TStringList源码在 classes.pas里面。

 

TStringList类简介                 

  在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行,只需要操作TStringListt[3]。相信大家会问,TStringList明明是一个类,为什么能当数组那样子用呢?其实,我们在写TStringList[[3]的时候,就是在写TStringList.Strings[3]。Strings是TStringList的一个缺省属性。数组性的缺省属性就是这样子使用的。如果大家在编写类的时候要使用到这么一个功能的话,刻意参考如方法

property AProperty[I: Integer] read *** write ***;
default;

  Strings是一个可读写的属性。这也就是说,大家并不仅可以获取第N行的内容,也饿可以改变第N行的内容。因此我们需要知道TStringList里String的总数。TStringList的属性Count则可以满足我们的需求。

  上面已经说过,Text是返回所有字符串的属性。向Text赋值时,TStringList能够自动地把Texxt分成一行一行的,然后存储在TStringList里(当然,TStringList里面并不完全时这么存储的,详细的过程可以参见TStringList和TStrings的代码)。这样,Strings返回的字符串就是没有回车和换行的。但是,如果我们向Strings赋值的字符串有回车和换行,那么会出现什么情况呢?此时,Strings就会把哪个字符串断成几行,插入到原来的位置上。如果TStringListt只有这么些功能的话,那我就不必专门拿出来讲了——我是说,TStringList能让我们任意地插入或删除某行,这就要用到TStringList提供的方法

  TStringList里的每一个字符都有自己的位置标号(从0开始)。

 

Add和Append方法                

function Add(const S: String): Integer;
procedure Append(const S: String);

  Add方法向TStringList的尾行添加一行String(在这里和下面我们都假设输入的字符串没有回车和换行,否则Strings将被分割)。参数S代表的是要插入的字符串的内容。Add的返回值代表了新的字符串在TStringList的位置——也就是最后一行的位置,即新的Count减去一。

  Append方法和Add唯一不同的地方就是没有返回值。

 

Insert方法                    

procedure Insert(Index: Integer; const S: String);

  Insert方法向TStringList插入一行字符串。在Insert里,我们可以自由地选择字符串插入的位置。参数S代表要插入的字符串的内容,Index代表要插入的位置。

 

Delete方法                    

procedure Delete(Index: Integer);

  Delete方法删除某行字符串,我们同样可以自由地选择删除任意一行字符串。参数Index代表要删除的那一行字符串的位置。

 

IndexOf方法                   

function IndexOf(const S: String): Integer;

  IndexOf查找某一字符串在TStringList里的位置。参数S代表要查找的字符串。如果TStringList里面不存在S的话,则返回-1。

 

Move和Exchange方法              

procedure Move(CurIndex, NewInddex: Integer);
procedure Exchange(Index1, Index2: Integer);

  TStringList另外还提供了两个方法——Move和Exchange。

  Move方法能把一行字符串抽出来并插入到另一个指定的为位置上,参数CurIndex代表要移动的字符串的位置,NewIndex代表字符串新的位置。

  Exchange方法则能将随便两个字符串交换。参数Index1和Index2代表两行需要交换的字符串的位置。

 

LoadFromFile和SaveToFile方法         

procedure LoadFromFile(const FileName: String);
procedure SaveToFile(const FileName: String);

  TStringList的LoadFromFile和SaveToFile两个方法,使得我们对文本文件得操作变得非常方便。参数FileName代表目标文本文件的文件名。

  例如我们在编写记事本的时候,用到的TMemo.Lines就是TString(TStringList的父类,功能几乎相同,只是因为TString时虚类,我们无法创建并使用)。在保存的时候只需要一行代码:

TMemo.Lines.SaveToFile(FileName);

  非常方便。

 

Names和Values属性               

  TStringList还有一项特殊功能:可以把TStringList当成ini 控制器使用。不过它没有Section。现在我就来介绍TStringList的两个属性:Names和Values。

  如果TStringList的内容是这样子的:

ID=1
Name=Vczh
PositionID=8
Tel=00000000

  那么,Names[2]就返回"positionID",Values[/‘PositionID/‘]就返回"8"。其中"Names"是只读属性,而"Values"则可写。TStringList使我们不必拘泥于ini 和注册表。关于TStringLisst没有Section这个问题,我们完全可以在Names里面你做点手脚,只要程序能够识别就行。

  TStringList还有一个可以存放Object的功能。但是我个人认为使用TObjectList比较好,因为TObjectList在这方面提供了比TStringList更多的功能。

  下面我提供一个例程来介绍Values属性。

  新建一个工程保存,并在dpr文件所在的文件夹里建立一个叫做"Config.txt"的文件,并输入一下内容

Name=VCZH
Address=Somewhere
Email=vczh@162.com

  然后,建立一个窗体。并在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;
    {获取当前程序文件所在的文件夹名称以获得Config.txt文件的路径}
    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
    {通过上面介绍的Values属性获得各个字段的内容}
    edtName.Text:= SL.Value[/‘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;

  

Delphi小谈之TStringList篇

标签:

原文地址:http://www.cnblogs.com/xumenger/p/4682960.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!