zoukankan      html  css  js  c++  java
  • TStringList 常用方法与属性&DelimitedText空格问题

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

    DelimitedText空格

    DelimitedText 空格也默认为分割符的原因很简单:
    Borland的程序员把这个属性对应的write方法中的一行代码多加了一个空格。

    2种方法解决这个问题。

    空格问题的解决方法之一:
    先StringReplace用一个特殊字符替代空格,然后StringReplace回来
    ss:='aa|bb c| c';
    ss:= StringReplace(ss,' ','#',[rfReplaceAll]);
    s:= TStringList.Create;
    s.Delimiter:= '|';
    s.DelimitedText:= ss;
    for i:= 0 to s.Count - 1 do
    begin
    s[i]:= StringReplace(s[i],'#',' ',[rfReplaceAll]);
    memo1.Lines.Add(s[i]);
    end;

    空格问题的解决方法之二:

    找到 {DelphiInstDir}\source\Win32\rtl\common\Classes.pas 文件,知道SetDelimitedText函数。如下所示:

    注:{DelphiInstDir}为Delphi安装目录

    procedure TStrings.SetDelimitedText(const Value: string);
    var
    P, P1: PChar;
    S: string;
    begin
    BeginUpdate;
    try
    Clear;
    P := PChar(Value);
    while P^ in [#1..' '] do
    {$IFDEF MSWINDOWS}
    P := CharNext(P);
    {$ELSE}
    Inc(P);
    {$ENDIF}
    while P^ <> #0 do
    begin
    if P^ = QuoteChar then
    S := AnsiExtractQuotedStr(P, QuoteChar)
    else
    begin
    P1 := P;
    // while (P^ > ' ') and (P^ <> Delimiter) do //源代码
    while (P^ > '') and (P^ <> Delimiter) do     //修改后的代码

    为方便携带,可将Classes.pas 文件重新编译到你的工程文件中即可。步骤:工程-添加到工程-Classes.pas

  • 相关阅读:
    把git项目放到个人服务器上
    关于fcitx无法切换输入法的问题解决
    博客变迁通知
    (欧拉回路 并查集 别犯傻逼的错了) 7:欧拉回路 OpenJudge 数据结构与算法MOOC / 第七章 图 练习题(Excercise for chapter7 graphs)
    (并查集) HDU 1856 More is better
    (并查集 不太会) HDU 1272 小希的迷宫
    (并查集 注意别再犯傻逼的错了) HDU 1213 How Many Tables
    (最小生成树 Kruskal算法) 51nod 1212 无向图最小生成树
    (并查集) HDU 1232 畅通工程
    (最小生成树 Prim) HDU 1233 还是畅通工程
  • 原文地址:https://www.cnblogs.com/94YY/p/2043484.html
Copyright © 2011-2022 走看看