带分隔符作为字符串的字符串?
我有一个名为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
所以每行有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;
,似乎很好地工作。我的问题是将StringList中的更改同步到原始的String属性中?有这么多的历史数据,所以我不认为改变TChar是一个现实的选择。
更新: 澄清。我想我可以设法使用上面的方法将字符串转换为StringList。然后在网格中显示它不应该那么辛苦。当我想将TStringList转换回原来的String属性wih' - $ - '作为分隔符时,问题就出现了。例如,我无法执行HistoryText:= myStringList.Delimitedtext。
第二次更新: 我已经解决了它。你们都得到了+1的快速答案,真的很想帮忙。总之我是如何做到的。
读自Historytext:
MyStringList.Text := Historytext;
现在每排有3个分隔符“ - $ - ”每行由一个换行符照常分离。
- 在循环中解析Stringlist并将其显示在网格中。我不再担心MyStringList。
- 让用户删除并编辑网格中的行。
- 当按网格中的行和列循环完成并构建与原始格式相同的新字符串时。
- 将该字符串指定给HistoryText。
所以从StringList的焦点转移到电网可以更容易:)
野生刺在黑暗中(这是不是很清楚你是问):
工作通过网格行:
- 对于每一行:
- 一个空字符串分配给一个临时字符串VAR
- 对于每一列添加行/列值加上你的分隔符来临时字符串VAR
- 删除最后一个分隔符从临时字符串VAR(如果非空)
- 添加临时串变种到StringList的
- 写的StringList的文本属性回到你HistoryText
const
Delimiter = '-$-';
var
row: Integer;
col: Integer;
SL: TStringList;
rowString: string;
begin
SL := TStringList.Create;
try
for row := 0 to StringGrid1.RowCount - 1 do begin
rowString := '';
for col := 0 to StringGrid1.ColCount - 1 do begin
rowString := StringGrid1.Cells[col, row] + Delimiter;
end;
if rowString <> '' then begin
rowString := Copy(rowString, 1, Length(rowString) - Length(Delimiter));
end;
SL.Add(rowString);
end;
HistoryText := SL.Text;
finally
SL.Free;
end;
end;
使用字符串列表断行属性的Uwe的解决方案:
var
row: Integer;
col: Integer;
SLRows: TStringList;
SLCols: TStringlist;
begin
SLRows := TStringList.Create;
try
SLCols := TStringList.Create;
try
SLCols.LineBreak := '-$-';
for row := 0 to StringGrid1.RowCount - 1 do begin
SLCols.Clear;
for col := 0 to StringGrid1.ColCount - 1 do begin
SLCols.Add(StringGrid1.Cells[col, row]);
end;
SLRows.Add(SLCols.Text);
end;
HistoryText := SLRows.Text;
finally
SLCols.Free;
end;
finally
SLRows.Free;
end;
end;
相反分隔符(一个字符)和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;
答它的工作原理,甚至反过来。
嘿,这是一个很好的。你知道什么时候(哪个Delphi版本)被引入? – 2010-07-21 10:37:07
D7
对不起,但我不明白。 字符串属性中的每行与Carriage return + linefeed分隔。所以真正的字符串是: 16.5.2003 - $ - 12:09 - $ - anna - $ - Organization created#D#A 2.6.2005 - $ - 13:03 - $ - jimmy - $ - 组织编辑# D#A 19.12.2005 - $ - 13:33 - $ - 马德琳 - $ - 组织编辑#D#A lst:= TStringList.Create; 尝试 lst.LineBreak:=' - $ - '; lst.Text:= myObject.HistoryText //在网格中使用列表,例如 finally lst.Free; 结束; 这是你的意思吗? – 2010-07-21 11:35:00
你真正的问题是什么?你提到想要在网格中显示,并且stringlist过程似乎“正常工作”。 “同步变更”也有点宽泛。你需要什么? – Tobiasopdenbrouw 2010-07-21 09:54:41
Se我的更新:) – 2010-07-21 10:50:02
我的解决方案在D2007 +中都可以工作 - 而且要短得多。 – 2010-07-21 11:02:00