[Delphi] 半角(SBCS)と全角(MBCS)を区別する (for VCL.Net)

半角文字と全角文字を区別する方法です。.Net環境ではDelphiもほかの言語と同じように Unicode になってしまったので、従来のような ByteType 関数による半角文字と全角文字の判定は行うことができません。
同じように、Win32 API のIsDBCSLeadByte などの API も使用できなくなっています。
(ここでは半角 = 1バイト文字、全角文字 = 2バイト以上の文字としています。2バイト半角文字もありますが、使用される頻度がほとんど無いため考慮の対象から除外しています。)
そこで、Unicodeの環境では、Shift-JIS(Windows環境ではコードページ932と定義されています)の形に変換してからチェックを行う必要があります。
以下は、エディットボックスに半角文字しか入力させないようにする例です。このコードを埋め込むには uses に System.Text を追加する必要があります。

procedure TForm5.Edit1KeyPress(Sender: TObject; var Key: Char);
const
  VK_Z = 26;
var
  nByteSize: Integer;
begin
  if not (Ord(Key) in [VK_BACK, VK_RETURN, VK_Z]) then // 除外キー
  begin
    nByteSize := Encoding.GetEncoding(932).GetByteCount(String(Key));
    if (nByteSize <> 1) then Key := #0;
  end;
end;

コメント (0件)


くろねこ研究所
https://www.blackcat.xyz/article.php/ProgramingFAQ_del0052