を移動して操作するには、次のアプローチを使用しますAnsiString
。ほとんどの場合は機能しますが、文字列へのポインターが機能しなくなることがあります。次のコードがあるとします。
var
s: AnsiString;
p: PAnsiChar;
offset, idx, cnt: Integer;
begin
s := 'some>very>long>string>with>field>delimiters>';
p := @s[1];
offset := 1;
// find the 5th field
cnt := 5;
repeat
idx := AnsiString.AnsiPos('>', p);
Inc(p, idx);
Inc(offset, idx);
Dec(cnt);
until cnt = 0;
// insert a new field after the 5th field
Insert(AnsiString('something new>'), s, offset);
// skip other fields
// insert other values
// repeat
end;
デバッグ時、ループが終了した直後にrepeat..until
インスペクタを見て、それを確認できますp = 'field>delimiters>'
。Insert()
ステートメントの後、s = 'some>very>long>string>with>something new>field>delimiters>'
およびp = 'something new>field>delimiters>'
インスペクターで。これは予想通りです。
私の実際の文字列は数千文字の長さです。文字列を移動して新しいフィールドを追加するこの方法は、何十回も機能しますが、突然機能しなくなります。 p
の呼び出し後、文字列の先頭に挿入された値が表示されなくなりましたInsert()
。 p
それが変わったことを知らないようですs
...
ほとんどのステートメントの後p
に文字を適切に参照し、いくつかの呼び出しの後に突然動作を停止するのはなぜですか?s
Insert()
Insert()
(質問を入力しているときに答えを見つけました。答えは今では明らかですが、問題に苦しんでいる間はそうではありません。おそらく質問と答えを投稿すると、他の人の助けになるでしょう...)