Delphi W1050 set 式で WideChar がバイト char に縮小されました

 Delphi で
「W1050 set 式で WideChar がバイト char に縮小されました。'SysUtils' ユニットの 'CharInSet' 関数で使用することを検討してください。」
なる警告

こういった関数を作成すると出現するエラー
  1. function CharInSetEx(C: WideChar; CharSet: TSysCharSet): Boolean;  
  2. begin  
  3.     Result := C in CharSet;  
  4.     // Result := System.SysUtils.CharInSet(C, CharSet);  
  5. end;  
  6.   
  7. CharInSetEx('あ', ['あ''A'])  
CharInSet とか関係なく、この関数に入った時点で 配列 CharSet の値が 0-255 に丸められてしまうため、 ASCII以外の文字列を 変数CharSetへ与えてもヒットしない
これは  TSysCharSet の定義(set of AnsiChar)である、集合型が0-255の範囲しか利用できないことに由来しています

この場合 array of  WideChar を使用して同様の引数で WideChar の処理を行うことが可能です(サロゲートペア除く)
ただし、CharSet: array of WideChar = ['A'] のようなデフォルト引数を利用することは不可能になります(overloadで同様の事が可能な場合があります) 
  1. function CharInSetEx(C: WideChar; CharSet: array of WideChar): Boolean;  
  2. begin  
  3.     Result := System.WideStrUtils.InOpArray(C, CharSet);  
  4. end;  
  5.   
  6. CharInSetEx('あ', ['あ''A'])  

コメント