我在一个存储为字符串的对象中有一个名为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是一个现实的选择。
更新 澄清。我想我可以设法使用上面的方法将String转换为StringList。然后在网格中显示它应该不那么难。当我想将TStringList转换回原始的String属性wih' - $ - '作为分隔符时,问题就来了。我不能做HistoryText:= myStringList.Delimitedtext例如。
第二次更新: 我已经解决了。你们都获得了+1的快速答案并且真的想要帮助。总结我是如何做到的。
从Historytext中读取:
MyStringList.Text := Historytext;
现在每行有3个' - $ - '分隔符,每行都像往常一样用换行符分隔。
因此,将焦点从StringList转移到网格变得更容易:)
答案 0 :(得分: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;
Ans甚至反过来也是如此。
答案 1 :(得分:2)
在黑暗中狂野刺伤(你要问的不是很清楚):
完成网格行:
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的TStrings LineBreak属性解决方案:
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;