TStrings类的一些高级的用法

TStrings是一个抽象类,在实际开发中,是除了基本类型外,应用得最多的。
常规的用法大家都知道,现在来讨论它的一些高级的用法。
先把要讨论的几个属性列出来:
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[i]);
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[i]);
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[i]);
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[i]);
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[i]);
    ShowMessage(strs.Values[strs.Names[i]]);
    ShowMessage(strs.ValueFromIndex[i]);
end;
end;
通过这个例子不难看出:
这个时候strs中的内容是:
0=aaa
1=bbb
2=ccc
3=ddd
而Names中则是:
0
1
2
3
在Values中则是:
aaa
bbb
ccc
ddd

似乎有点不合适宜,但谁也不能否认,delphi还是蛮好用的,这个是最近两天中碰到的问题的解法

delphi TStringList 用法详解

//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 TForm 1.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;

时间: 2024-08-24 20:48:51

TStrings类的一些高级的用法的相关文章

MongoDB高级查询用法

译 MongoDB高级查询用法 2018年09月04日 18:52:43 小小小辉happy 阅读数 752更多 分类专栏: 数据库 db的帮助文档 输入:db.help(); db.AddUser(username,password[, readOnly=false])  添加用户 db.auth(usrename,password)     设置数据库连接验证 db.cloneDataBase(fromhost)     从目标服务器克隆一个数据库 db.commandHelp(name)

高级闭包用法

高级闭包用法: #!/usr/bin/env python # !-*-coding:utf-8-*- """ 高级装饰器和闭包实例 """ import time def logged(when): """ 输出函数的日志信息 :param when: 选取那种日志格式 """ def log(f, *args, **kargs): print "asdfads %s&quo

判断类是否存在函数class_exists用法分析

原文地址:判断类是否存在函数class_exists用法分析 如果我们要判断一个类是不是可以用,可以先使用class_exists函数来判断一下,下面来看几个例子. bool class_exists ( string $class_name [, bool $autoload = true ] ) 此功能是否给定的类被定义检查.this function checks whether or not the given class has been defined.返回true,如果class_

Tstrings类简单介绍及实例

用TStrings保存文件;var  S: TStrings;begin  S := TStringList.Create();  { ... }  S.SaveToFile('config.txt', TEncoding.UTF8); Tstrings类简单介绍及实例 在DELPHI的程序开发过程中Tstrings类的使用是比较频繁的,下面就此类在DELPHI5的开发环境中进行一下简单的介绍及实例(注:本文只对tstrings类中的方法及属性进行介绍, 从其父类继承的属性及方法不属本文讨论之内

C++ Primer 学习笔记_25_类与数据抽象(11)--const 用法小结、static与const以及static const(const static)

一.const 用法总结 1.可以对const 的用法做个小总结: const int n = 100;  //定义常量 const Test t(10); const int & ref = n;   //const引用 int& ref = n;  //Error [const与指针] const int* p; //const出现在*前面,表示*p是常量 (*p = 200; //Error) int * const p2;  //const出现在*后面,表示p2是常量 (p2 =

二,前端---伪类与伪元素的用法

一:基本用法 ::before和::after这两个伪类下有特有的属性content,用于在CSS渲染中向元素逻辑上的头部或尾部添加内容.这些内容不会改变文档的内容,不会出现在DOM中,不可复制,仅仅是在CSS渲染层加入. 1:[String] 使用引号包括一段字符串,将会向元素内容中添加字符串,如:a:after{content: ' / '} 2:attr() 调用当前元素的属性,可以方便的比如将图片的Alt提示文字或链接的Href地址显示出来,如下: a:after { content:

nmap 高级扫描用法

nmap提供了四项基本功能(主机发现.端口扫描.服务与版本侦测.OS侦测)及丰富的脚本库.Nmap既能应用于简单的网络信息扫描,也能用在高级.复杂.特定的环境中:例如扫描互联网上大量的主机:绕开防火墙/IDS/IPS:扫描Web站点:扫描路由器等等. 简要回顾Nmap简单的扫描方式:全面扫描:nmap-T4 -A targetip 主机发现:nmap-T4 -sn targetip 端口扫描:nmap-T4 targetip 服务扫描:nmap-T4 -sV targetip 操作系统扫描:nm

Java常用类之Date和DateFormat用法

---20150802 1.Date时间类(java.util.Date) -->在标准Java类库中包含一个Date类.它的对象表示一个特定的瞬间,精确到毫秒 -->Java中时间的表示说白了也是数字,是从:标准纪元1970.1.1 0点开始到某个时刻的毫秒数,类型为long. 此类学习之建议----看源码 代码: MyFundamental.TestDate.DateDemo package TestDate; import java.util.Date; //注意不要导成java.sql

AtomicInteger类保证线程安全的用法

J2SE 5.0提供了一组atomic class来帮助我们简化同步处理.基本工作原理是使用了同步synchronized的方法实现了对一个long, integer, 对象的增.减.赋值(更新)操作. 比如对于++运算符AtomicInteger可以将它持有的integer 能够atomic 地递增.在需要访问两个或两个以上 atomic变量的程序代码(或者是对单一的atomic变量执行两个或两个以上的操作)通常都需要被synchronize以便两者的操作能够被当作是一个atomic的单元.