開発ブログ - Delphi 過去ソースからモバイルへポーティング(文字列処理2)
過去のプログラムから、モバイルアプリケーションへポーティングをする際の文字列処理の問題。 文字列へのインデックスアクセスはどのように変えましょうか。
文字列へのインデックスアクセス
文字列にインデックスでアクセスするのはとてもよく使います。
インデックスが 1から始まっていたものが 0始まりに変わるということですが、デスクトップコンパイラは 1始まりのままですから、両方に対応するように書かなければなりません。
以下のようなコードを書き換えるには、大きく二通りの方法がありそうです。
var
i: Integer;
S: String;
begin
for i := 1 To Length(S) do begin
S[i];
end;
end;
Low, High を使って、適切なインデックス範囲にアクセス
Low() と High() は、デスクトップ/モバイルコンパイラ それぞれで適切な値を返すので、それを使ってアクセスする方法です。
(デスクトップでは 1~Length, モバイルでは 0~Length-1)
var
i: Integer;
S: String;
begin
for i := Low(S) To High(S) do begin
S[i];
end;
end;
この書き方は配列アクセスするときにやっていた書き方ですね。
ループ処理をしているときには、ループ部分だけを書き換えればいいので楽かもしれません。
ただ、デスクトップとモバイルで添え字の値が違っているので、添え字の値を永続化して使う場合などには注意が必要かもしれません。
すべて 0 始まりでアクセスする
インデックスを 0始まりとしてアクセスする方法です。
この場合は S[n] でアクセスすることはできません。
かわりに S.chars[n] としてアクセスします。
var
i: Integer;
S: String;
begin
for i := 0 To Length(S)-1 do begin
S.chars[i];
end;
end;
この場合、Copy や Pos のような関数も使うことができなくなります。
代わりに S.Substring や S.IndexOf のように TStringHelper のメソッドを使って書き換える必要があります。
1番目のやり方の方がコードの書き換え量は少なくて済みそうです。
ただ、2番目のやり方の方が Cなどと近くなるのでわかりやすいような...
とりあえず新規で書くときには 2番目のやり方が良いでしょう。
既存のものをメンテナンスするときには、適宜どちらかに決めて使うという感じでしょうか。