首页 > 代码库 > TStringList 常用操作

TStringList 常用操作

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 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;

//待续...

分类: 4.其他技术区,2e.Delphi 中的容器类
好文要顶 关注我 收藏该文 技术分享 技术分享
技术分享
万一
关注 - 34
粉丝 - 876
荣誉:推荐博客
+加关注
4
0
? 上一篇:Delphi 的信息框相关函数
? 下一篇:文件路径相关的字符串操作
posted on 2007-12-10 23:17 万一 阅读(28095) 评论(23) 编辑 收藏


FeedBack:
#1楼  2008-04-08 10:27 Liangpei2008
Delphi7以下版本中DelimitedText有Bug,不知道2007改了没有~
它会将空格当做分隔符!

List.Delimiter := ‘|‘;
List.DelimitedText := ‘aaa|bb b|ccc|ddd‘;
//bbb若有空格,那么它的Count就是5而不是4
而SplitColumns是IdStrings.pas里的函数,
它修正了TStrings.DelimitedText和TStrings.Delimiter将空格也作为分隔符的问题
SplitColumns


支持(0)反对(0)
  
#2楼  2008-04-08 11:45 万一
是这样, 但用 Add 添加的不要紧.
支持(0)反对(0)
  
#3楼  2008-07-16 14:16 qcl
万老师:
分隔符可以是换行符吗? 我现在的STRING是TXT读进来的 ,是这样的形式
111,222
333,444
是不是换行符都隐式在STRING里了 要怎么把第一行读出来 ,之后我就可以以逗号把每个数据单个读出来了 另外 老师有什么快捷的联系方式吗 我想随时请教:)
支持(0)反对(0)
  
#4楼  2008-07-16 14:20 qcl
刚试了下 用list.text:=str 就可以分行ADD进LIST 很神奇噢
支持(0)反对(0)
  
#5楼  2008-07-16 17:14 DXH_tt
经常听人说delphi里大循环,或者多线程,是怎么回事呢?timer事件是不是多线程呢博主先生?
支持(0)反对(0)
  
#6楼[楼主]  2008-07-16 23:01 万一  
@qcl: 祝贺你自己已经解决了, 通过 TStringList 分割字串还有一些更巧妙的办法, 如果需要我给你介绍.

@DXH_tt:
关于 Delphi 中的多线程: Delphi 中的多线程是模拟的. 系统运行着许多进程、线程, 但这些线程并不是真正同步运行的, 系统按某个极小的时间单位分别去关照每个线程, 因为时间单位极小, 所以我们感觉程序并没有中断运行. 这也就是系统多线程的理念.
我们在 Delphi 的某个进程中假如也使用了若干多线程, 当系统关注到这个进程的时候会循环执行此进程中的个个线程, 好像系统并没有认为这里有多线程, 只是 Delphi 的内部协调而已. 所以有人说 Delphi 的多线程其实是个大循环.
这仅仅是个人的理解, 仅供参考.
另外, timer 事件不是多线程的, 但如果在其中插入 Application.ProcessMessages; 代码, 也可以模拟多线程.
支持(0)反对(0)
  
#7楼  2008-07-17 09:02 qcl
好啊 我想了解更多:)
支持(0)反对(0)
  
#8楼  2008-09-16 09:57 外来天客
万一老师,我有个关于改变图片颜色的问题想请教一下,能告诉我你的Email吗?谢谢
支持(0)反对(0)
  
#9楼[楼主]  2008-09-16 10:40 万一  
wy132435@gmail.com
支持(0)反对(0)
  
#10楼  2008-11-27 11:36 南山古桃
搜TStringList,万一兄文章出现在第一个,哈,飞马过去把此文抢了
支持(0)反对(0)
  
#11楼[楼主]  2008-11-27 11:44 万一  
@南山古桃
欢迎"桃子", 这是很早以前写得, 不全面也不深入.
支持(0)反对(0)
  
#12楼  2008-11-27 14:03 南山古桃
对我很有帮助,已经把TStringList有个大致了解了
感谢!
支持(0)反对(0)
  
#13楼  2008-11-28 16:08 得到
不错呀 能多点这样的文章就好了 我什么时候能达到你1/10的功力就满足了哦
支持(0)反对(0)
  
#14楼  2009-03-08 15:37 sweidong
万一老师,在你这里学到很多东西,我是业余爱好,现在搞的mdi中子窗口有多个combobox,在子窗口创建时我要对所有的combobox的items赋值(从数据库中遍历,有几条到几百条不等),其中还有几个combobox是一样(如儿童,父亲,母亲各自的国籍、民族、户口地址等等),我也得给它从数据库遍历赋值,用的AddObject方法,有code和name两列,这样就造成该子窗口显示出来速度很慢,有什么办法可以优化一下,谢谢
支持(0)反对(0)
  
#15楼[楼主]  2009-03-08 16:52 万一  
@sweidong
在需要时间的代码前添加这句试试:
Application.ProcessMessages;

TStringList 常用操作