喫茶XRAYトップページ

[▲前のスレッド]

[2543] フリカナを漢字に変換Part2返信 削除
2009/7/6 (月) 19:36:42 Sayke
勝手にPart2

ってな事で、結果的にVistaでは上手くいかない。

今は懐かしVBではSendKeyでやってたんだね。
これってVistaでも正常に動作するんですよね。
そこで imm云々は捨てて・・・

Unit1
****---------------------------------****
const
  arrStrKana :array [0..80] of String = (
    'ア','イ','ウ','エ','オ',
    'ァ','ィ','ゥ','ェ','ォ',
    'カ','キ','ク','ケ','コ',
    'ガ','ギ','グ','ゲ','ゴ',
    'サ','シ','ス','セ','ソ',
    'ザ','ジ','ズ','ゼ','ゾ',
    'タ','チ','ツ','テ','ト',
    'ダ','ヂ','ヅ','デ','ド',
    'ナ','ニ','ヌ','ネ','ノ',
    'ハ','ヒ','フ','ヘ','ホ',
    'バ','ビ','ブ','ベ','ボ',
    'パ','ピ','プ','ペ','ポ',
    'マ','ミ','ム','メ','モ',
    'ヤ','ユ','ヨ',
    'ャ','ュ','ョ',
    'ラ','リ','ル','レ','ロ',
    'ワ','ヲ','ン','ッ','ヴ');
  arrStrRoma :array [0..80] of String = (
    'a','i','u','e','o',
    'la','li','lu','le','lo',
    'ka','ki','ku','ke','ko',
    'ga','gi','gu','ge','go',
    'sa','si','su','se','so',
    'za','zi','zu','ze','zo',
    'ta','ti','tu','te','to',
    'da','di','du','de','do',
    'na','ni','nu','ne','no',
    'ha','hi','fu','he','ho',
    'ba','bi','bu','be','bo',
    'pa','pi','pu','pe','po',
    'ma','mi','mu','me','mo',
    'ya','yu','yo',
    'lya','lyu','lyo',
    'ra','ri','ru','re','ro',
    'wa','wo','nn','ltu','vi');

function StrZen2StrHan(strZen:String):String;
var
   Chr : array [0..255]  of  char;
   strTmp :String;
begin
   //// ひらかなはそのままでは半角カタカナに変換できないので
   //// 一旦カタカナに変換できる文字列をカタカナに変換
   Windows.LCMapString(
      GetUserDefaultLCID(),
      LCMAP_KATAKANA, //変換を指定
      PChar(strZen),        //変換する文字列
      Length(strZen) + 1,   //サイズ
      chr,                      //変換結果
      Sizeof(chr)               //サイズ
      );
   strTmp := Chr;

   //半角に変換できる文字列を半角に変換
   Windows.LCMapString(
      GetUserDefaultLCID(),
      LCMAP_HALFWIDTH,
      PChar(strTmp),        //変換する文字列
      Length(strTmp) + 1,   //サイズ
      chr,                      //変換結果
      Sizeof(chr)               //サイズ
      );
   Result :=  Chr;
end;

function StrHan2StrZen(strHan:String):String;
var
   Chr : array [0..255]  of  char;
begin

   //半角に変換できる文字列を半角に変換
   Windows.LCMapString(
      GetUserDefaultLCID(),
      LCMAP_FULLWIDTH,
      PChar(strHan),        //変換する文字列
      Length(strHan) + 1,   //サイズ
      chr,                      //変換結果
      Sizeof(chr)               //サイズ
      );
   Result :=  Chr;
end;


procedure ExSendKey(s:String);
var
  WStr1,WStr2 :WideString;
  i,j,Index :Integer;
begin
  WStr1 := WideString(StrHan2StrZen(s));//半角を全角に
 {カタカナをローマ字に}
  WStr2 := '';
  for i := 1 to Length(WStr1) do
  begin
    Index := -1;
    for j := 0 to 81 do
    begin
      if arrStrKana[j] = WStr1[i] then
      begin
        Index := j;
        Break;
      end;
    end;
    if Index = -1 then
    begin
      WStr2 := WStr2 + WStr1[i];
    end else begin
      WStr2 := WStr2 + arrStrRoma[index];
    end;
  end;
  s := StrZen2StrHan(String(WStr2));//全角を半角に戻す
  for i := 1 to Length(s) do
  begin
    if s[i] = ' ' then //スペース
    begin
      keybd_event(VK_CONTROL,0,0,0);
      keybd_event(LoByte(VkKeyScan(s[i])),0,0,0);
      keybd_event(LoByte(VkKeyScan(s[i])),0,KEYEVENTF_KEYUP,0);
      keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0);
    end else begin
      keybd_event(LoByte(VkKeyScan(s[i])),0,0,0);
      keybd_event(LoByte(VkKeyScan(s[i])),0,KEYEVENTF_KEYUP,0);
    end;
  end;
end;
****---------------------------------****

Unit2
Edit1 (imSKata)//フリカナ
Edit2 (imHira)//漢字
****---------------------------------****
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if Key = Chr(VK_RETURN) then
  begin
    Edit2.SetFocus;
    if Edit2.Text = '' then
    begin
      ExSendKey(Edit1.Text);
    end;
  end;
end;
****---------------------------------****

「どうだ、これでXPもVistaも同じに動くじゃん!」
低レベルな私には原始的なこんなんしか思いつかん!(;_;)

[2544] Re:フリカナを漢字に変換Part2返信 削除
2009/7/6 (月) 19:47:24 Mr.XRAY
▼ Saykeさん

お疲れさまです.
文字種を定義しておく,これが確実ですね.
まだ,実際に動かしていませんが,
半角のカナはそろそろいらいなのでは...
と思うのですが,たまに他の掲示板でも質問ででてくることがありますねぇ.
英数字は必要か... う〜ん.


ちょっと話が違いますが,[2532]の白猫さんの

>  keybd_event(VK_CONVERT,0,0,0);
>  keybd_event(VK_CONVERT,0,KEYEVENTF_KEYUP,0);


これ,確実な気がします.
しかし,Vistaには泣かされますな〜.


[▼次のスレッド]
INCM/CMT
Cyclamen v3.82