带有分隔符的Stringlist作为字符串?

Rol*_*son 2 delphi tstringlist delphi-2007

我在一个存储为字符串的对象中有一个名为HistoryText的属性.我想显示网格中的所有行.我应该能够删除和编辑网格中的行.格式为:

16.5.2003-$-12:09-$-anna-$-Organization created
2.6.2005-$-13:03-$-jimmy-$-Organization edited
19.12.2005-$-13:33-$-madeleine-$-Organization edited
Run Code Online (Sandbox Code Playgroud)

因此每行有4个字段,日期,时间,用户和消息,分隔符字符串为' - $ - '.由于分隔符是字符串而不是char,因此无法将其分配给stringlists定界符属性.

我有一个例程将字符串提取到Stringlist:

procedure ParseDelimited(const aStringList: TStringList; const aOrgList, aDelimiter: string);
var
   vDelimiterPos : integer;
   vPartialStr : string;
   vRemaingTxt : string;
   vDelimiterLength : integer;
begin
   vDelimiterLength := Length(aDelimiter);

   if (AnsiRightStr(aOrgList, Length(aDelimiter)) = aDelimiter) then
     vRemaingTxt := aOrgList
   else
     vRemaingTxt := aOrgList + aDelimiter;

   aStringList.BeginUpdate;
   aStringList.Clear;
   try
     while Length(vRemaingTxt) > 0 do
     begin
       vDelimiterPos := Pos(aDelimiter, vRemaingTxt);
       vPartialStr := Copy(vRemaingTxt,0,vDelimiterPos-1);
       aStringList.Add(vPartialStr);
       vRemaingTxt := Copy(vRemaingTxt,vDelimiterPos+vDelimiterLength,MaxInt);
     end;
   finally
     aStringList.EndUpdate;
   end;
end;
Run Code Online (Sandbox Code Playgroud)

它似乎工作正常.我的问题是将StringList中的更改同步回原始的String属性?这个分隔符有很多历史数据,所以我认为将它改为TChar是一个现实的选择.

更新: 澄清.我想我可以设法使用上面的方法将String转换为StringList.然后在网格中显示它应该不那么难.当我想将TStringList转换回原始的String属性wih' - $ - '作为分隔符时,问题就来了.我不能做HistoryText:= myStringList.Delimitedtext例如.

第二次更新: 我已经解决了.你们都获得了+1的快速答案并且真的想要帮助.总结我是如何做到的.

从Historytext中读取:

MyStringList.Text := Historytext;
Run Code Online (Sandbox Code Playgroud)

现在每行有3个' - $ - '分隔符,每行都像往常一样用换行符分隔.

  • 在循环中解析Stringlist并在网格中显示它.我再也不关心MyStringList了.
  • 让用户删除并编辑网格中的行.
  • 在网格中按行和列完成循环并构建一个与原始格式相同的新字符串.
  • 将该字符串分配给HistoryText.

因此将焦点从StringList转移到网格变得更容易:)

Uwe*_*abe 5

您可以使用LineBreak(字符串)和Text:而不是Delimiter(char)和DelimitedText.

lst := TStringList.Create;
try
  lst.LineBreak := '-$-';
  lst.Text := '16.5.2003-$-12:09-$-anna-$-Organization created';
  Memo1.Lines := lst;  // or whatever you do with it
finally
  lst.Free;
end;
Run Code Online (Sandbox Code Playgroud)

Ans它的工作方式甚至相反.