2010-07-21 163 views
2

我有一个名为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的焦点转移到电网可以更容易:)

+0

你真正的问题是什么?你提到想要在网格中显示,并且stringlist过程似乎“正常工作”。 “同步变更”也有点宽泛。你需要什么? – Tobiasopdenbrouw 2010-07-21 09:54:41

+0

Se我的更新:) – 2010-07-21 10:50:02

+0

我的解决方案在D2007 +中都可以工作 - 而且要短得多。 – 2010-07-21 11:02:00

回答

2

野生刺在黑暗中(这是不是很清楚你是问):

工作通过网格行:

  • 对于每一行:
    • 一个空字符串分配给一个临时字符串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; 
5

相反分隔符(一个字符)和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; 

答它的工作原理,甚至反过来。

+0

嘿,这是一个很好的。你知道什么时候(哪个Delphi版本)被引入? – 2010-07-21 10:37:07

+0

D7 2010-07-21 10:46:33

+0

对不起,但我不明白。 字符串属性中的每行与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