それは、TStringHelper.Substring です。
TStringHelper には Copy 関数とは別の Copy メソッド(from DEKO さん)があります。
Copy メソッドがあるから、TStringHelper だと一般的名称の Substring に置き換わったんだなーなんて気楽に構えていると死にます!
というか死んだ!
下記の様に TStringHelper.substring を Copy 関数の代わりに使ったとします。
1 procedure Test;2 var3  Str: String;4 begin5  Str := 'Hello, helper !';6  Writeln(Str.Substring(1, 5)); // 期待する出力 'Hello'7 end;
期待する出力は↓ですが
Hello
実際には
ello,
こうなります。
つまり、Substring の開始 index は "0" なのです!
Delphi の String 型は歴史的経緯により、index は 1 から始まります。
C++Builder のために一般的な index に合わせたのかな……。
と、そんな訳で TStringHelper.Substring を使うときはお気を付けを。
……index が 1 始まりの Copy 関数的なメソッド追加されないかな。混乱するだろうけど。
TStringHelper経由だと原則0オリジンのようですが、[]演算子のみ{$ZEROBASEDSTRINGS ON|OFF}の影響を受けて0/1オリジンが切り替えられるようです。
返信削除https://twitter.com/kylix_rd/statuses/239061223734386688
まだDelphi XE3を買っていないので試してませんけど…。
なんと!
削除それは知らなかったです。
試してみます!!