お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"文字の種類を判別"






文字列の文字の種類を判別します。
判別にはAPIの「GetStringTypeExA」を使用します。

例)
 文字列を渡し使用されてる文字の種類を返す関数を作成します。
 フォームにエディット、リストボックス、ボタンを配置して、エディットの
 文字列の種類をボタンを押したときに判別し、結果をリストボックスに
 返します。

Type
  TArrayWord = Array[0..0] of Word;
  TStringType = (stHalfNum, stHalfAlpha, stHalfSymbol, stHalfKatakana,
                 stWideNum, stWideAlpha, stWideSymbol, stWideKatakana,
                 stHiragana, stKanji, stControl);
  TStringTypes = Set of TStringType;

const  //  何故か「Windows.pas」に定義されていない
  C3_SYMBOL    =    $8;
  C3_KATAKANA  =   $10;
  C3_HIRAGANA  =   $20;
  C3_HALFWIDTH =   $40;
  C3_FULLWIDTH =   $80;
  C3_IDEOGRAPH =  $100;
  C3_LEXICAL   =  $400;
  C3_ALPHA     = $8000;

//  文字の種類を返す関数
function  StrType(Value: String): TStringTypes;
var
  i: Integer;
  CType: ^TArrayWord;
  CharLen: Integer;
begin
  Result := [];
  CharLen := ByteToCharLen(Value, Length(Value));
  GetMem(CType, SizeOf(Word) * CharLen);
  Try
    if  Not GetStringTypeExA(LOCALE_SYSTEM_DEFAULT, CT_CTYPE3,
                PChar(Value), Length(Value), CType^)  then  Exit;
    For i := 0 To CharLen - 1  Do
      if  CType^[i] = C3_SYMBOL  then               //  制御コード
        Result := Result + [stControl]
      else
      if  (CType^[i] and C3_HALFWIDTH) <> 0  then   //  *半角
        if  CType^[i] = C3_HALFWIDTH  then          //  半角数字
          Result := Result + [stHalfNum]
        else
        if  CType^[i] = (C3_ALPHA or C3_HALFWIDTH)  then    //  半角英字
          Result := Result + [stHalfAlpha]
        else
        if  (CType^[i] and C3_SYMBOL) <> 0  then    //  半角記号
          Result := Result + [stHalfSymbol]
        else
        if  (CType^[i] and C3_LEXICAL) <> 0  then   //  半角記号
          Result := Result + [stHalfSymbol]
        else
        if  (CType^[i] and C3_KATAKANA) <> 0  then  //  半角カタカナ
          Result := Result + [stHalfKatakana]
        else
      else                                          //  *全角
        if  CType^[i] = C3_FULLWIDTH  then          //  全角数字
          Result := Result + [stWideNum]
        else
        if  CType^[i] = (C3_ALPHA or C3_FULLWIDTH)  then    //  全角英字
          Result := Result + [stWideAlpha]
        else
        if  (CType^[i] and C3_SYMBOL) <> 0  then    //  全角記号
          Result := Result + [stWideSymbol]
        else
        if  (CType^[i] and C3_LEXICAL) <> 0  then   //  全角記号
          Result := Result + [stWideSymbol]
        else
        if  (CType^[i] and C3_KATAKANA) <> 0  then  //  全角カタカナ
          Result := Result + [stWideKatakana]
        else
        if  (CType^[i] and C3_HIRAGANA) <> 0  then  //  ひらがな
          Result := Result + [stHiragana]
        else
        if  (CType^[i] and C3_IDEOGRAPH) <> 0  then //  漢字
          Result := Result + [stKanji];
  Finally
    FreeMem(CType);
  end;
end;

//  ボタンクリック時
procedure TForm1.Button1Click(Sender: TObject);
var
  StringType: TStringTypes;
begin
  ListBox1.Items.Clear;

  StringType := StrType(Edit1.Text);

  if  stHalfAlpha in StringType  then
    ListBox1.Items.Add('半角英字');
  if  stHalfNum in StringType  then
    ListBox1.Items.Add('半角数字');
  if  stHalfSymbol in StringType  then
    ListBox1.Items.Add('半角記号');
  if  stHalfKatakana in StringType  then
    ListBox1.Items.Add('半角カタカナ');
  if  stWideAlpha in StringType  then
    ListBox1.Items.Add('全角英字');
  if  stWideNum in StringType  then
    ListBox1.Items.Add('全角数字');
  if  stWideSymbol in StringType  then
    ListBox1.Items.Add('全角記号');
  if  stWideKatakana in StringType  then
    ListBox1.Items.Add('全角カタカナ');
  if  stHiragana in StringType  then
    ListBox1.Items.Add('ひらがな');
  if  stKanji in StringType  then
    ListBox1.Items.Add('漢字');
  if  stControl in StringType  then
    ListBox1.Items.Add('制御コード');
end;

                                    JBC01362 アトリエ まっちゃん

Original document by Atelier Macchan 氏 ID:(JBC01362)


ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum