Delphi ------TStringList

2024-05-30 07:58
文章标签 delphi ------ tstringlist

本文主要是介绍Delphi ------TStringList,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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帮助

这篇关于Delphi ------TStringList的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1015947

相关文章

KLayout ------ 旋转物体90度并做平移

KLayout ------ 旋转创建的物体 正文 正文 前段时间,有个小伙伴留言问我,KLayout 中如何旋转自己创建的物体,这里特来说明一下。 import pyapoly = pya.DPolygon([pya.DPoint(0, 0), pya.DPoint(0, 5), pya

delphi 部署设置(deployment)看不见内容的解决方法

情况说明: 这事,今年已遇到两次了(分别是两个朋友),情况如下: 菜单:project-->deployment,用于我们对程序部署设置,特别是安卓开发需要使用到。  点开后,正常情况下应该是下图这样的: 而问题情况如下,所有内容看不见(不是没有内容,而应该是字体颜色与背景色一样,表现出的结果就是看不见),但选中某个数据内容的时候是可见的,如下图: 这样的情况,虽然有内容,但

#define用法,避免重复------笛风读书笔记系列

读书笔记系列之:#define用法,避免重复                                                                               笛风                                                                               2013.10.11

delphi屏幕分辩率及缩放自适应解决方案

以下在win10上做的测试,win7未试验,有需要的可以自行测试。 首先应用程序Application.Manifest中设置为:per Monitor V2. 不然有可能窗体收不到屏幕变动通知。 Delphi10.4版本中,窗体有Scaled属性,true为默认,表示屏幕缩放时,窗体也跟着缩放。false时屏幕缩放比例的变化,窗体不会相应跟着变动。 窗体的OnAfterMonitorDpi

javaEE之------SpringMVC中ParameterMethodNameResolver应用

原文地址:http://blog.csdn.net/yangxin_blog/article/details/50568947 介绍 方法动态调用核心类 org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver 正在学习SpringMVC,感觉这个很重要。 前台访问后台会根据sp

jq中的表单验证插件------jquery.validate

今天我们来说一下表单验证,有人说我们在进行表单验证的时候使用正则来验证是非常麻烦的,现在我来给大家介绍一下表单验证的插件:jquery.validate.min.js 它是与jquery一起结合用来使用的,使用它是非常方便,只需写校验规则和错误字段即可。 我们常见的校验规则有以下几种: (1)required:true               必输字段(2)email:tru

自己造轮子系列(一)------数据库连接池的实现

一、什么是数据库连接池 拿公交司机做比方,司机要开车了,不可能马上开车的时候去造一辆车,开完车又给销毁了,这样做很大一部分时间将浪费在造车上面,效率非常的低下。正确的做法是已经造好车辆,开车的时候,从车库里面提一辆出去,开完车又把车辆放回车库,这样做会提高效率。连接池的工作原理也是如此。 数据库的获取链接与释放连接非常消耗系统资源,在我的笔记本上,用mysql数据库,获得15个连接要

大三上------期末总结

今天终于把万恶的期末考试给考完了!想想考的都是专业课,原本以为肯定会复习地很开心。因为不用像以前一样只是考试前一周什么都不会,然后考前疯狂地看书刷题,考完之后瞬间遗忘。不过事实证明...为了考试看书还是非常痛苦...即使是喜欢的算法,C++,操作系统....不过幸好已经考完啦!接下来为期四周的寒假又不用为考试而学习了!         大三上这一个学期接触的主要的东西依旧还是底

delphi 开发app

好的工具用起来就会顺手,很多Delphi从业者用惯了Delphi工具,在面对移动APP称王的时代似乎有力使不出。现在不用再担心JAVA语言的一些特性,太纠结了。我们直接用Delphi XE7开发吧。虽然Delphi XE2开始就支持移动开发了,但这中间的五个版本实在令人头痛,问题不少。作为开发者希望能有一个稳定的开发工具,在加强Delphi XE 6功能的同时修正不少Delphi XE6的BUG。

2012组------我们来啦--兄弟连

在我赶往期待之地的驿站的时候,在那个慵懒而又昏暗的候车厅里,我就在思考着,在这么一个寒冷的夜晚,又有谁会和我有着共同的目的地,又有着怎样的故事呢,一切都是未知,但我知道,在未来之后的几天里,我就能看到这些故事的创造者,或许还会跟我有着共同的故事吧!        十一月的月末,就是这样的日子,我们的团队齐聚一起,东到吉林、北至内蒙、南达成都、最终归于中原。在在延绵万里的大地上,我们占据了祖