收藏 分销(赏)

Delphi中-TStringList-的详细用法.doc

上传人:二*** 文档编号:4716054 上传时间:2024-10-10 格式:DOC 页数:10 大小:79KB 下载积分:5 金币
下载 相关 举报
Delphi中-TStringList-的详细用法.doc_第1页
第1页 / 共10页
本文档共10页,全文阅读请下载到手机保存,查看更方便
资源描述
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;   //排序与倒排序 {排序函数} function DescCompareStrings(List: TStringList; Index1, Index2: Integer): Integer; begin   Result := -AnsiCompareText(List[Index1], List[Index2]); end;   procedure TForm1.Button1Click(Sender: TObject); var   List: TStringList; begin   List := TStringList.Create;   List.Add('bbb');   List.Add('ccc');   List.Add('aaa');    //未排序   ShowMessage(List.Text);  //bbb ccc aaa    //排序   List.Sort;   ShowMessage(List.Text);  //aaa bbb ccc   //倒排序   List.CustomSort(DescCompareStrings);  //调用排序函数   ShowMessage(List.Text);  //ccc bbb aaa  //假如   List.Sorted := True;   List.Add('999');   List.Add('000');   List.Add('zzz');   ShowMessage(List.Text);  //000 999 aaa bbb ccc zzz 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; for i := 0 to Strs.Count-1 do     ShowMessage(Strs); end; 执行了这段代码后,可以看到ShowMessage显示出来的分别是:aaa bbb ccc ddd。 也就是说,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; for i := 0 to Strs.Count-1 do     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; for i := 0 to Strs.Count-1 do     ShowMessage(Strs); end; 显示出来的仍然是aaa bbb ccc ddd。为什么不是:"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; for i := 0 to Strs.Count-1 do     ShowMessage(Strs); end; 显示出来的又是aaa bbb ccc ddd。对比一下,应该不难明白吧?这个就不多说了,用得也不多。 但是还要多说一句,当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; for i := 0 to strs.Count-1 do 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组件,通常用于显示多行的纯文本内容。     Delphi 5中其Items属性类型是TStrings(实际上是继承自TStrings的TMemoStrings),因此可以直接从TStrings兼容类型的变量导入数据。     Delphi 7中组件有变化,没有了Items属性,取而代之的是Lines属性,类型是TStrings。   4.TRichEdit是另一个我们常见的一个可视化VCL组件,通常用于显示格式化的文本内容。    Delphi 5中其Items属性类型也是TStrings(实际上是继承自TStrings的TRichEditStrings),因此可以直接从TStrings兼容类型的变量导入数据。     Delphi 7中组件有变化,没有了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类型 procedure TForm1.Button1Click(Sender: TObject); var   I: Integer; begin   for I := 0 to Form1.ComponentCount-1 do     ListBox1.Items.InsertObject(0, Form1.Components[I].Name,Form1.Components[I] as TObject); end;   Delete 在指定位置删除一个字符串,如果字符串配有对象,那么对象也删除 TStringList.Delete('0')  Clear 清空列表字符串,如果字符串配有对象,那么对象也被移出,但是对象不会被释放  Exchange 交换两个字符串的位置,如果字符串配有对象,那么对象也被交换 TStringList.Exchange(0,1)  Find 查找一个已知字符串在列表中的位置,注意方法声明中的Index的声明是 var Index TStringList.Find(const S: string; var Index: Integer): Boolean;  IndexOf 与Find不同,IndexOf用来查找某一字符串指定的位置 TStringList.IndexOf(const S: 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.LoadFromFile('c:\tmp.txt');{打开} List.SaveToFile('c:\tmp.txt'); {保存} List.Clear; {清空} List.Free; {释放} end; --------------------------------------------------------------------------------    另: TStringList 有一个小Bug  Delimiter将空格也作为分隔符的问题  它会将空格当做分隔符!  例  List.Delimiter := '|';  List.DelimitedText := 'aaa|bb b|ccc|ddd';  //bbb若有空格,那么它的Count就是5而不是4  而SplitColumns是IdStrings.pas里的函数,  它修正了TStrings.DelimitedText和TStrings.Delimiter将空格也作为分隔符的问题  SplitColumns 
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服