3

文字列として保存されているオブジェクトに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つのフィールドがあり、区切り文字列は「-$-」です。文字ではなく文字列を区切り文字として、stringlists区切り文字プロパティに割り当てることはできません。

文字列を文字列リストに抽出するルーチンがあります。

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に変更することは現実的なオプションではないと思います。

更新: 説明。上記の方法で文字列を文字列リストに変換できると思います。次に、グリッドに表示するのはそれほど難しくないはずです。問題は、区切り文字として'-$-'を使用してTStringListを元のStringプロパティに変換し直すときに発生します。たとえば、HistoryText:=myStringList.Delimitedtextを実行できません。

2番目の更新: 私はそれを解決しました。あなたは皆、速い答えと本当に助けようとしているために+1を得ました。要約すると、私はそれをどのようにしたか。

Historytextから読む:

MyStringList.Text := Historytext;

これで、各行に「-$-」の3つの区切り文字があり、各行は通常どおり改行で区切られます。

  • ループで文字列リストを解析し、グリッドに表示します。MyStringListについてはもう気にしません。
  • ユーザーがグリッド内の行を削除および編集できるようにします。
  • グリッド内の行と列でループが終了したら、元の文字列と同じ形式で新しい文字列を作成します。
  • その文字列をHistoryTextに割り当てます。

したがって、フォーカスをStringListからグリッドにシフトすると、簡単になります:)

4

2 に答える 2

6

Delimiter (文字) と DelimitedText の代わりに、LineBreak (文字列) と Text を使用することもできます。

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;

その逆でも機能します。

于 2010-07-21T10:17:13.273 に答える
2

暗闇の中でワイルドスタブ(あなたが何を求めているのかはあまり明確ではありません):

グリッド行を操作します。

  • 行ごとに:
    • 空の文字列を一時的な文字列 var に割り当てます
    • 各列について、行/列の値と区切り文字を一時文字列 var に追加します
    • 一時文字列 var から最後の区切り文字を削除します (空でない場合)
    • 一時文字列 var を stringlist に追加します
  • stringlist の text プロパティを 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;

TStrings の LineBreak プロパティの 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;
于 2010-07-21T10:08:29.127 に答える