Delphi中 TStringList 的详细用法 good
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
http://blog.csdn.net/zisongjia/article/details/53784120
Delphi中 TStringList 的详细用法 good的更多相关文章
- Delphi中TStringList类常用属性方法详解
TStrings是一个抽象类,在实际开发中,是除了基本类型外,应用得最多的. 常规的用法大家都知道,现在来讨论它的一些高级的用法. 先把要讨论的几个属性列出来: 1.CommaText 2.Delim ...
- delphi 中TStringList Clear 方法的时候该对象有没有被释放
delphi 中TStringList 通过function AddObject(const S: string; AObject: TObject): Integer; 方法添加了一个对象,请问我在 ...
- Delphi中 StrToIntDef函数的用法
Delphi中 StrToIntDef函数的用法:比如我要判断一个文本框里输入的字符串能不能转换为integer类型,如果能,则返回转换后的整型数据,如果不能,则返回整数0,那么我就可以用strtoi ...
- delphi中Application.MessageBox函数用法详解
delphi中Application.MessageBox函数用法详解 Application.MessageBox是TApplication的成员函数,声明如下:functionTApplicati ...
- PHP中$_SERVER的详细用法
PHP中$_SERVER的详细用法 $_SERVER['PHP_SELF'] #当前正在执行脚本的文件名,与 document root相关. $_SERVER['argv'] #传递给该脚本的参数. ...
- Java中stream的详细用法
来自于:Java 8 stream的详细用法_旅行者-CSDN博客_java stream 一.概述 Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行 ...
- ecshop中foreach的详细用法归纳
ec模版中foreach的常见用法. foreach 语法: 假如后台:$smarty->assign('test',$test); {foreach from=$test item=list ...
- vue中watch的详细用法
在vue中,使用watch来响应数据的变化.watch的用法大致有三种.下面代码是watch的一种简单的用法: <input type="text" v-model=&quo ...
- vue中watch的详细用法(转载)
在vue中,使用watch来响应数据的变化.watch的用法大致有三种.下面代码是watch的一种简单的用法: <input type="text" v-model=&quo ...
随机推荐
- spark rdd持久化的简单对比
未使用rdd持久化 使用后 通过对比可以发现,未使用RDD持久化时,第一次计算比使用RDD持久化要快,但之后的计算显然要慢的多,差不多10倍的样子 代码 public class PersistRDD ...
- 使用Fiddler对android应用抓包 专题
工作原理 先上个图 此图一目了然,可以看出fiddler在请求中所处的位置,我们就可以确定它能干些什么. WinInet(“Windows Internet”)API帮助程序员使用三个常见的Inter ...
- 给定正整数n,计算出n个元素的集合{1,2,....,n}能够划分为多少个不同的非空集合
给定正整数n,计算出n个元素的集合{1,2,....,n}能够划分为多少个不同的非空集合 附源码: #include<iostream> using namespace std; int ...
- HDU1164_Eddy's research I【Miller Rabin素数测试】【Pollar Rho整数分解】
Eddy's research I Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- IOC介绍及其简单实现
预备知识: Java反射原理,XML及其解析 IOC:Inversion of Control,控制反转,它最主要反映的是与传统面向对象(OO)编程的不同.通常我们编程实现某种功能都需要几个对象相 ...
- Maven软件项目管理工具
http://my.oschina.net/jgy/blog/125503 拷贝mavne安装文件夹conf以下的settings.xml到用户主文件夹下 改动改文件 <localReposit ...
- Scala基本语法学习笔记
Scala语法与JAVA有很多相似的地方,两者也可以相互调用.但是整体感觉Scala语法等简洁.灵活.这里记录下Scala有特点的地方,以备以后查找方便. 参考: 使用 import: htt ...
- 图灵机(Turing Machine)
图灵机,又称图灵计算.图灵计算机,是由数学家阿兰·麦席森·图灵(1912-1954)提出的一种抽象计算模型,即将人们使用纸笔进行数学运算的过程进行抽象,由一个虚拟的机器替代人们进行数学运算. 所谓的图 ...
- Ajax打开三种页面的请求
xmlhttprequest对象可以打开两种方式的页面请求 1,.asmx格式的webservice页面. 2,.aspx格式的web窗体 其中web窗体可以是调用一新建的web窗体,同时调用和被调用 ...
- EPI_H/EPI_V(边缘保持指数,matlab 矢量化编程)
EPI: edge preservation index,衡量对原始图像的操作(目标图像)对图像边缘的保持能力. EPI_H:horizontal ,水平方向: EPI_V:vertical,垂直方向 ...