y232995558

TStringList的用法

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

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

分类:

技术点:

相关文章: