我有一个对象中的属性叫做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
所以每一行都有四个字段:日期、时间、用户和消息,使用'-$-'作为分隔符。
由于分隔符是字符串而不是字符,因此无法将其分配给字符串列表的分隔符属性。
我有一个例程来将字符串提取到字符串列表中:
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;
看起来一切都运行良好。我的问题是如何将StringList中的更改同步回原始的字符串属性?由于该分隔符具有如此多的历史数据,因此我认为将其更改为TChar并不是一个现实的选择。
更新: 澄清一下,我认为我可以使用上述方法将String转换为StringList。那么在网格中显示它应该不难。问题出现在当我想要将TStringList转换回带有'-$-'作为分隔符的原始String属性时。例如,我不能使用HistoryText:= myStringList.Delimitedtext。
第二次更新: 我已经解决了。你们所有人都得到了+1分的快速答案和真正想要帮助的奖励。总结一下我是如何做到的。
从Historytext中读取:
MyStringList.Text := Historytext;
现在每行都有3个'-$-'的分隔符,每行像往常一样用换行符分隔。
- 循环解析Stringlist并将其显示在网格中。不再关心MyStringList。
- 让用户删除和编辑网格中的行。
- 完成后按行和列循环网格,并使用与原始格式相同的格式构建一个新字符串。
- 将该字符串分配给HistoryText。
所以将重点从StringList转移到网格中使它更容易 :)