Delphi中 TStringList高级用法.docx

上传人:b****3 文档编号:4747809 上传时间:2022-12-08 格式:DOCX 页数:12 大小:19.79KB
下载 相关 举报
Delphi中 TStringList高级用法.docx_第1页
第1页 / 共12页
Delphi中 TStringList高级用法.docx_第2页
第2页 / 共12页
Delphi中 TStringList高级用法.docx_第3页
第3页 / 共12页
Delphi中 TStringList高级用法.docx_第4页
第4页 / 共12页
Delphi中 TStringList高级用法.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

Delphi中 TStringList高级用法.docx

《Delphi中 TStringList高级用法.docx》由会员分享,可在线阅读,更多相关《Delphi中 TStringList高级用法.docx(12页珍藏版)》请在冰豆网上搜索。

Delphi中 TStringList高级用法.docx

Delphi中TStringList高级用法

Delphi中TStringList的详细用法

TStringList类是在Delphi使用最厂的一个对像,我们这里一起来看看TStringList的详细用法.

先把要讨论的几个属性列出来:

1、CommaText

2、Delimiter&DelimitedText

3、Names&Values&ValueFromIndex

 

TStrings是一个抽象类,在实际开发中,是除了基本类型外,应用得最多的。

TStringList常用方法与属性:

var

 List:

TStringList;

 i:

Integer;

begin

 List:

=TStringList.Create;

 List.Add('Strings1');          {添加}

 List.Add('Strings2');

 List.Exchange(0,1);            {置换}

 List.Insert(0,'Strings3');     {插入}

 i:

=List.IndexOf('Strings1'); {第一次出现的位置}

 List.Sort;                     {排序}

 List.Sorted:

=True;         {指定排序}

 List.Count;                    {总数}

 List.Text;                     {文本集合}

 List.Delete(0);                {删除,0是第一个数据}

 List.LoadFromFile('c:

\tmp.txt');{打开}

 List.SaveToFile('c:

\tmp.txt'); {保存}

 List.Clear;                    {清空}

 List.Free;                     {释放}

end;

 

 //读入字符串

var

 List:

TStringList;

begin

 List:

=TStringList.Create;

 List.CommaText:

='aaa,bbb,ccc,ddd';

 //相当于:

List.Text:

='aaa'+#13#10+'bbb'+#13#10'+'ccc'+'#13#10'+'ddd';

  ShowMessage(IntToStr(List.Count)); //4

 ShowMessage(List[0]); //aaa

  List.Free;

end;

相当于

 //置换分隔符

var

 List:

TStringList;

begin

 List:

=TStringList.Create;

 List.Delimiter:

='|';

 List.DelimitedText:

='aaa|bbb|ccc|ddd';

  ShowMessage(IntToStr(List.Count)); //4

 ShowMessage(List[0]); //aaa

  List.Free;

end;

 

 //类似的哈希表操作法

var

  List:

TStringList;

begin

 List:

=TStringList.Create;

  List.Add('aaa=111');

 List.Add('bbb=222');

 List.Add('ccc=333');

 List.Add('ddd=444');

  ShowMessage(List.Names[1]); //bbb

 ShowMessage(List.ValueFromIndex[1]); //222

 ShowMessage(List.Values['bbb']); //222

 //ValueFromIndex可以赋值:

 List.ValueFromIndex[1]:

='2';

 ShowMessage(List[1]); //bbb=2

  //可以通过Values赋值:

 List.Values['bbb']:

='22';

 ShowMessage(List[1]); //bbb=22

  List.Free;

end;

 

 //避免重复值

var

 List:

TStringList;

begin

 List:

=TStringList.Create;

  List.Add('aaa');

  List.Sorted:

=True; //需要先指定排序

 List.Duplicates:

=dupIgnore; //如有重复值则放弃 

 List.Add('aaa');

 ShowMessage(List.Text); //aaa

 //Duplicates有3个可选值:

 //dupIgnore:

放弃;

 //dupAccept:

结束;

 //dupError:

提示错误.

 List.Free;

end;

 

//排序与倒排序

{排序函数}

functionDescCompareStrings(List:

TStringList;Index1,Index2:

Integer):

Integer;

begin

 Result:

=-AnsiCompareText(List[Index1],List[Index2]);

end;

 

procedureTForm1.Button1Click(Sender:

TObject);

var

 List:

TStringList;

begin

 List:

=TStringList.Create;

 List.Add('bbb');

 List.Add('ccc');

 List.Add('aaa'); 

 //未排序

 ShowMessage(List.Text); //bbbcccaaa 

 //排序

 List.Sort;

 ShowMessage(List.Text); //aaabbbccc

 //倒排序

 List.CustomSort(DescCompareStrings); //调用排序函数

 ShowMessage(List.Text); //cccbbbaaa

 //假如

 List.Sorted:

=True;

 List.Add('999');

 List.Add('000');

 List.Add('zzz');

 ShowMessage(List.Text); //000999aaabbbccczzz

end;

 

现在来讨论它的一些高级的用法。

先把要讨论的几个属性列出来:

1、CommaText

2、Delimiter&DelimitedText

3、Names&Values&ValueFromIndex

先看第一个:

CommaText。

怎么用呢?

用代码说话:

const

constr:

String='aaa,bbb,ccc,ddd';

var

strs:

TStrings;

i:

Integer;

begin

strs:

=TStringList.Create;

strs.CommaText:

=constr;

fori:

=0toStrs.Count-1do

   ShowMessage(Strs);

end;

执行了这段代码后,可以看到ShowMessage显示出来的分别是:

aaabbbcccddd。

也就是说,strs.CommaText:

=constr这一句的作用,就是把一个字符串以','为分割符,分段添加到TStrings中。

那么如果不是以','来分割,又该怎么做呢?

现在看第二个例子。

使用Delimiter和DelimitedText。

const

constr:

String='aaa\bbb\ccc\ddd';

var

strs:

TStrings;

i:

Integer;

begin

strs:

=TStringList.Create;

strs.Delimiter:

='\';

strs.DelimitedText:

=constr;

fori:

=0toStrs.Count-1do

   ShowMessage(Strs);

end;

可以看到,显示的效果和第一个例子是一模一样的。

解释一下:

Delimiter为分隔符,默认为:

','。

DelimitedText就是按Delimiter为分隔符的一个串,得到赋值后回把这个字符串按Delimiter的字符添加到TStrings中。

说到这里,有想起一个属性,QuoteChar。

其默认值为:

'"'(不包括单引号)

有何用呢?

看例子:

const

constr:

String='"aaa"\"bbb"\"ccc"\"ddd"';

var

strs:

TStrings;

i:

Integer;

begin

strs:

=TStringList.Create;

strs.Delimiter:

='\';

strs.DelimitedText:

=constr;

fori:

=0toStrs.Count-1do

   ShowMessage(Strs);

end;

显示出来的仍然是aaabbbcccddd。

为什么不是:

"aaa""bbb""ccc""ddd"呢?

再来看一个例子:

const

constr:

String='|aaa|\|bbb|\|ccc|\|ddd|';

var

strs:

TStrings;

i:

Integer;

begin

strs:

=TStringList.Create;

strs.Delimiter:

='\';

strs.QuoteChar:

='|';

strs.DelimitedText:

=constr;

fori:

=0toStrs.Count-1do

   ShowMessage(Strs);

end;

显示出来的又是aaabbbcccddd。

对比一下,应该不难明白吧?

这个就不多说了,用得也不多。

但是还要多说一句,当Delimiter为:

','而QuoteChar为:

'"'时,DelimitedText和CommaText是同等的。

最后要说的三个是:

Names&Values&ValueFromIndex。

看看下面的代码:

const

constr:

String='0=aaa,1=bbb,2=ccc,3=ddd';

var

strs:

TStrings;

i:

Integer;

begin

strs:

=TStringList.Create;

strs.CommaText:

=constr;

fori:

=0tostrs.Count-1do

begin

   ShowMessage(strs.Names);

   ShowMessage(strs.Values[strs.Names]);

   ShowMessage(strs.ValueFromIndex);

end;

end;

通过这个例子不难看出:

这个时候strs中的内容是:

0=aaa

1=bbb

2=ccc

3=ddd

而Names中则是:

0

1

2

3

在Values中则是:

aaa

bbb

ccc

ddd

===============================================================================================

 TStringList 和 TList

在本章中,我们只讨论TStringList,而将TList放在下一章中再详细讨论

   第一章、TStringList

   在这里我们要讲解TStringList,但同时有一个相关类是不能忽略的,那就是TStrings类

   TStringList是由TStrings派生而来,而Tstrings是一个抽象类,他继承于Tpersistent类。

   因此,我们将TStrings类和TStringList类一同讲解,并做比较

   1、TStrings、TStringList不是可视组件,只是两个通用类,因此他们与可视组件TMemo、TRichEdit没有可比性。

   2、TStrings、TStringList都是管理“字符串-附属对象”这样一个列表,前者是抽象类,不能被实例化,只是定义了一些通用的属性、方法,而后者是从TStringList继承而来,可以实例化使用。

如:

var 

  S1,S2:

TStrings;

  S3:

TStringList;

begin

  S1:

=TStrings.Create;      //这样就不可以(因为TStrings是抽象类,不能直接创建对象)

  S3:

=TStringList.Create;   //这样是可以的

  S2:

=TStringList.Create;   //这样也是可以的(多态的典型使用)

end;

   注意:

   上面S2的声明是TStrings类型,他是将一个TStringList类创建了对象之后,赋值给声明的TStrings变量。

这是典型的多态的使用。

(什么?

你不知道什么是多态?

乖乖隆咚,这可是大腕啊,这都不认识,赶紧饿补一下再回来找小飞龙~~~~)

   我说过TStrings类是TStringList类的父类,多态使用中,子类对象赋值给父类变量后,变量的使用范围(属性、方法)是要注意的,子类没有的属性或方法,变量是不能使用的,而需要类型转换TStringList(S2)之后才能调用。

如下面的代码段

var     

 S:

TStrings;   

begin   

 S:

=TStringList.Create;//TStringList实现了TStrings中的抽象方法。

 

   

 S.Add('123456789ABC'); //所以这样调用Add方法,是正确的;

                             //因为TStrings类中是有Add方法的抽象声明的;

                             //它实际调用的是子类TStringList实现的Add。

 

                                             

 S.Sort                //而这样调用Sort排序方法就会出错;

                            //因为TStrings类中没有Sort方法的声明;

                            //而变量S被声明为TStrings类,所以他看不到子类中继承后新增加的方法和属性。

 S.Free;   

end; 

   上面代码中TStringList类中有一个方法,叫做Sort(这是一个排序的方法),但是在TStrings类里面却没有,他是TStringList子类新增加的方法。

那么好了,在上面的程序代码段中,如果这样调用代码S2.Sort,哈哈,马上你就会看到编译器报错,具体为什么,大家可以好好地想一想,或者参考李维大师的著作阅读相关章节。

var 

  S1,S2:

TStrings;

  S3:

TStringList;

begin

  S1:

=TStrings.Create;      //这样就不可以(因为TStrings是抽象类,不能直接创建对象)

  S3:

=TStringList.Create;   //这样是可以的

  S2:

=TStringList.Create;   //这样也是可以的(多态的典型使用)

   S1.Add('123456789ABC');     //报错了,因为S1中Add是抽象方法,只有声明

   S.Free;

end;

   我们再来看看上面代码中的S1变量,你可以声明TStrings的对象,但是,如果你像上面那样创建他,那么编译器编译的时候会发出警告信息,列出TStrings类中的抽象方法,提醒你,这是一个抽象类,你不应该直接创建他的对象,当然,如果你不怕死,非要编译运行程序的话,也没问题,编译器对警告信息一般是放过的,所以,你的程序(如上面所示)仍然可以运行!

   但是,嘿嘿,看见了吗?

我说但是了,如果你在后面的代码中使用了你所创建的TStrings对象的那些add,delete等方法的话,那你就死定了,因为这些是抽象方法,是不能用的,是Abstract方法。

   为什么第二段代码中的S.Add('123456789ABC')不会有问题,可以很好地执行;但是第三段代码中的S1.Add('123456789ABC')就会报错呢?

,他们的S和S1变量不都是TStrings类型吗?

   关于这个问题,本小飞龙已经点的很清楚了,这是面向对象程序设计语言中非常重要的一个环节“多态性”,如果读者对这个概念不清楚,那么很多东西都会稀里糊涂,会走很多弯路,所以,赶紧看看相关的资料。

在这里我们就不说了,我只说一句:

这非常重要!

 3、TMemo是我们常见的一个可视化VCL组件,通常用于显示多行的纯文本内容。

   Delphi5中其Items属性类型是TStrings(实际上是继承自TStrings的TMemoStrings),因此可以直接从TStrings兼容类型的变量导入数据。

   Delphi7中组件有变化,没有了Items属性,取而代之的是Lines属性,类型是TStrings。

 4.TRichEdit是另一个我们常见的一个可视化VCL组件,通常用于显示格式化的文本内容。

  Delphi5中其Items属性类型也是TStrings(实际上是继承自TStrings的TRichEditStrings),因此可以直接从TStrings兼容类型的变量导入数据。

   Delphi7中组件有变化,没有了Items属性,取而代之的是Lines属性,类型是TStrings。

   5、TStrings的派生类主要用于管理字符串集合和对象集合。

例如Delphi5中TStringList在内部分别为字符串和对象各声明了一个数组来存储数据,而在Delphi7中TStringList在内部是以一个记录类型来实现,因此他们能同时保存字符串和对象(注意:

一般我们用TStringList来处理数组列表,而用下一章将要讲到的TList类来处理对象列表;但事实上TStringList类也是可以处理对象的,关于这一点,只要读者仔细看看Delpgi7中的TStringList类VCL的源代码就明白了,注意源代码中私有变量是一个记录类型)。

   6、一般我们直接使用TStringList类而不是TStrings类,因为TStrings类是一个抽象类,不能直接使用,所以下面我们列出TStringList类的方法,并重点讲解其作用

方法描述 

Add在末尾添加一个字符串TStringList.Add('123456789ABC') 

AddObject在末尾添加一个对象TStringList.AddObject('btn',Button1); 

Insert在指定位置插入一个字符串TStringList.Insert(0,'123456789ABC') 

InsertObject在指定位置插入一个字符串,并给他分配一个相应的对象 

举例:

将窗体中的所有组件的组件名称放入ListBox的Item属性中

Item属性是一个TStrings类型procedureTForm1.Button1Click(Sender:

TObject);

var

 I:

Integer;

begin

 forI:

=0toForm1.ComponentCount-1do

   ListBox1.Items.InsertObject(0,Form1.Components[I].Name,Form1.Components[I]asTObject);

end;

 

Delete在指定位置删除一个字符串,如果字符串配有对象,那么对象也删除TStringList.Delete('0') 

Clear清空列表字符串,如果字符串配有对象,那么对象也被移出,但是对象不会被释放 

Exchange交换两个字符串的位置,如果字符串配有对象,那么对象也被交换TStringList.Exchange(0,1) 

Find查找一个已知字符串在列表中的位置,注意方法声明中的Index的声明是varIndex

TStringList.Find(constS:

string;varIndex:

Integer):

Boolean; 

IndexOf与Find不同,IndexOf用来查找某一字符串指定的位置

TStringList.IndexOf(constS:

string):

Integer; 

Sort排序,Sorted属性设置为False的时候,调用Sort排序; 

Sorted属性

 Sorted属性设置为False的时候,调用Sort排序;

Sorted属性设置为True的时候,列表自动排序,这时,就不要使用Insert了,而应使用Add来添加,系统会自动排序的; 

CustomSort客户自定义排序,这个我们不作介绍,有兴趣看Delphi帮助 

CaseSensitive设定字符串比较、取位置时,大小写是否敏感,这个我们不作介绍,有兴趣看Delphi帮助 

Duplicates添加字符串的时候,是否允许重复字段Add,这个我们不作介绍,有兴趣看Delphi帮助

 

//TStringList常用方法与属性:

var

List:

TStringList;

i:

Integer;

begin

List:

=TStringList.Create;

List.Add('Strings1');{添加}

List.Add('Strings2');

List.Exchange(0,1);{置换}

List.Insert(0,'Strings3');{插入}

i:

=List.IndexOf('Strings1');{第一次出现的位置}

List.Sort;{排序}

List.Sorted:

=True;{指定排序}

List.Count;{总数}

List.Text;{文本集合}

List.Delete(0);{删除,0是第一个数据}

List.LoadFromFi

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1