|
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
|