2010-07-21 159 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