いつもお世話になってます。
Delphi XE4.0の文字列変数定義についての質問です。
Borland Delphi5 で作成したプログラムを
Delphi XE4.0 Enterpriseに移植しているのですが
変数String型の定義がデフォルトでUnicodeStringとなってしまいます。
これによりLength等の値が変わってしまう為
デフォルトでAnsiStringに変更できるようなコンパイル設定や方法などありませんでしょうか?
ご存知の方がいらっしゃればご教授いただければ幸いです。
どうぞよろしくお願いします。
> デフォルトでAnsiStringに変更できるようなコンパイル設定や方法などありませんでしょうか?
ありません。
ANSI アプリケーションを作りたいのであれば、
Delphi 2007 (R2) を使う事を検討して下さい。
Unicode アプリケーションが作りたいのだけれど、
文字列長とかの計算を "半角=1 / 全角=2" でやりたいのであれば、
MECSUtils を使ってください。
[MECSUtils]
http://ht-deko.minim.ne.jp/tech021.html
暫定的に、コンパイラ指令の{$H-}を試しても良いかも。
ただ、最終的にはUnicode化することになると思いますが...
> 暫定的に、コンパイラ指令の{$H-}を試しても良いかも。
これは String を ShortString (ANSI: 短い文字列) とみなすスイッチなので、
場合によっては AnsiString (ANSI: 長い文字列) を代替できないかもしれません。
[Delphi 2009 と 文字列型]
http://edn.embarcadero.com/jp/article/38791
また、Delphi が内部で呼び出している API もすべて W 系なので、
それとの整合性も考慮しなくてはなりません。
'ABC' 等の定数は Unicode として扱われるので、
引数に AnsiString(RawByteString) または String(UnicodeString) を持つ
オーバーロードされた関数がある場合、Unicode 版が呼び出されてしまい、
予期せぬ結果になる事があります。
例えば
Pos('あいう', <AnsiString 型の変数>)
このような記述だと、Unicode 版の Pos() が呼び出されます。
また、TMemo 等の SelStart や SelLength も ANSI と Unicode では値が異なります。
VCL で使われている String なプロパティ等に至っては置換しようがありません。
Unicode 版 Delphi で、ANSI しか使わないアプリを作るのは予想以上に厄介な作業なのです。
Nov様、DEKO様
ご回答ありがとうございました。
諦めてUnicodeStringで組み直すしかなさそうですね。
たいへん勉強になりました。
ありがとうございました。
ツイート | ![]() |