Delphi怎么将TStringList按照分割符‘end’分割成多个TStringList

List:TStringList;List:=TStringList.Create;List.add('task');List.add('A');List.add('A'... List:TStringList;
List:= TStringList.Create;
List.add('task');
List.add('A');
List.add('A');
List.add('end');
List.add('task');
List.add('b');
List.add('b');
List.add('end');
List.add('task');
List.add('c');
List.add('c');
List.add('end');
要得到输出结果是List1里保存A的值,List2里保存b的值,List3里保存c的值。
展开
 我来答
splashchaos
推荐于2016-07-22 · TA获得超过1.1万个赞
知道大有可为答主
回答量:3342
采纳率:0%
帮助的人:3616万
展开全部

用TObjectList管理分割后的StringList(替代List1,2,3),循环List,和end比较(用了不分大小写的CompareText,否则用CompareString),下面是测试代码,注意:TObjectList需要Uses Contnrs。

uses
  Classes, SysUtils, Contnrs     
  ...
  
var
  ErrorMsg: String;
  List: TStringList;
  objList: TObjectList;
  i : Integer;
  flag_addnew : Boolean;  
begin
  objList := TObjectList.Create;
  List:= TStringList.Create;
  try
     List.add('task');
     List.add('A');
     List.add('A');
     List.add('end');
     List.add('task');
     List.add('b');
     List.add('b');
     List.add('end');
     List.add('task');
     List.add('c');
     List.add('c');
     List.add('end');
     writeln('Total count: '+IntToStr(List.Count));
     writeln(List.Text);

     flag_addnew := true;
     for i := 0 to List.Count-1 do
     begin
       if CompareText(List[i], 'end') <> 0 then
       begin
         if flag_addnew then
         begin
           objList.Add(TStringList.Create);
           flag_addnew := false;
         end;
         TStringList(objList[objList.Count-1]).Add(List[i]);
       end
       else
         flag_addnew := true;
     end;

     for i := 0 to objList.Count-1 do
     begin
       writeln('------ '+ IntToStr(i+1) + ' ------');
       writeln(TStringList(objList[i]).Text);
     end;
  finally
    List.Free;
    objList.Free;
  end;
end;

输出:

------ 1 ------
task
A
A

------ 2 ------
task
b
b

------ 3 ------
task
c
c
更多追问追答
追问
谢谢回答,思路我看懂了,但能不能把这段代码注释一下呢?
追答
     flag_addnew := true; // 设置一个标志,true = 创建TStringList,并添加到TObjectList中
     for i := 0 to List.Count-1 do //大循环,读取开始的TStringList中的字符串
     begin
       // 是否读取到分隔符字符串'end'
       if CompareText(List[i], 'end') <> 0 then
       begin
         // 如果读取的不是'end', 看是否需要创建新的TStringList并加入TObjectList中
         // 一开始标志是true,就是要创建,后面除非出现'end',否则都只要在当前
         // TObjectList所对应的TStringList中添加字符串
         if flag_addnew then
         begin
           objList.Add(TStringList.Create);
           flag_addnew := false;
         end;
         TStringList(objList[objList.Count-1]).Add(List[i]);
       end
       else 
         // 读取的是字符串'end',不要添加到TObjectList所对应的TStringList中,
         // 但需要设置标准=true,这样下一个循环的是,就可创建新的StringList并添加
         // 到ObjectList中。
         flag_addnew := true;
     end;
     
     // 循环读取TObjectList中的内容,每个object都是一个TStringList
     for i := 0 to objList.Count-1 do
     begin
       writeln('------ '+ IntToStr(i+1) + ' ------');
       writeln(TStringList(objList[i]).Text);
     end;
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式