文字列として保存されているオブジェクトに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からグリッドにシフトすると、簡単になります:)