喫茶XRAYトップページ


[2528] 漢字変換の件返信 削除
2009/7/3 (金) 10:13:16 白猫
すいません、またしゃしゃり出てきました

vistaでの漢字変換がうまくできないので、調べたとところ

下記のサイトから漢字からひらがなに変換できる回答があったので、
vista 及び delphi2009で行った所、うまくいきました
http://homepage1.nifty.com/MADIA/delphi/delphi_bbs/200903/200903_09030008.html

逆にひらがなから漢字変換できないか、ない知恵をしぼりだして
Button2Clickで記述した通り、keybd_eventを使えばできそうみたいですが

もっとうまいやり方は、ありますかね?

unit Unit1;

interface

uses
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls
  , Forms, Dialogs, StdCtrls, msime, ActiveX;
  //上記サイトの記述にしたがって msineとActiveXを入れる

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
//edit1.textの漢字をひらがなに変換する
procedure TForm1.Button1Click(Sender: TObject);
var
  vGuid: TGUID;
  vFELanguage: IFELanguage;
  bsIn, bsOut: PWideChar;
  W: array [0..1023] of WideChar;
  Buffer: Pointer;
begin
 if CLSIDFromString(PWideChar(WideString('MSIME.Japan')), vGuid) <> S_OK then
  Exit;

 if CoCreateInstance(vGuid, nil, CLSCTX_SERVER, IFELanguage, vFELanguage) <> S_OK
 then Exit;

 if vFELanguage.Open <> S_OK then
  Exit;

  StringToWideChar(Edit1.Text, @W, SizeOf(W));
  bsIn := SysAllocString(@W);

  bsOut := nil;

  if vFELanguage.GetPhonetic(bsIn, 1, -1, @bsOut) <> S_OK then
   Exit;

  Edit2.Text := WideCharToString(bsOut);

  if Assigned(bsIn) then
   SysFreeString(bsIn);

  if Assigned(bsOut) then
   SysFreeString(bsOut);

  vFELanguage.Close;
  vFELanguage := nil;

  Edit2.SetFocus;
  edit2.SelStart:=length(edit2.Text);
end;

//ひらがなに変換したものを漢字に変換処理する
procedure TForm1.Button2Click(Sender: TObject);
begin
 if edit2.Text<>'' then
 begin
  keybd_event(VK_CONVERT,0,0,0);
  keybd_event(VK_CONVERT,0,KEYEVENTF_KEYUP,0);
 end;
end;

initialization
  CoInitialize(nil);

finalization
  CoUnInitialize;

end.

[2532] Re:漢字変換の件返信 削除
2009/7/3 (金) 12:17:32 白猫
▼ 白猫さん
一部修正
procedure TForm1.Button2Click(Sender: TObject);
begin
 if edit2.Text<>'' then
 begin
  edit2.setfocus; //これ入れないとまずいすね!
  keybd_event(VK_CONVERT,0,0,0);
  keybd_event(VK_CONVERT,0,KEYEVENTF_KEYUP,0);
 end;
end;

[2533] Re2:漢字変換の件返信 削除
2009/7/3 (金) 12:39:16 Sayke
▼ 白猫さん
こんにちは
ちょっとコピペしました。

期待したのとちょっと違った結果でした(^_^;)
何故か意味不明な・・・

[2534] Re3:漢字変換の件返信 削除
2009/7/3 (金) 13:00:44 白猫
▼ Saykeさん
あれ、おかしいですね?
私の行ったやり方は、

Edit1のimemodeをimhiraにしてから
ひらがな 入力を漢字変換してから

button1を押して、edit2.textに再度ひらがな戻す

button2を押すと、edit2.textを未確定文字に戻す
形で、行いました。、

それと、このbutton2の作業は、delphi2009の
ユニコードでないと、うまく作動しません

以前のansiだと、変換に失敗します。

あつかましい質問ですが、delphi2009で
試験をしたのでしょうか?


[2535] Re4:漢字変換の件返信 削除
2009/7/3 (金) 13:26:48 Sayke
▼ 白猫さん

> あつかましい質問ですが、delphi2009で
D2007でした。
いやはや大変失礼いたしました。<m(__)m>

Vistaになって変換が上手くできず困っておりまして
救世主現るとばかり良く読みもせず飛びついてしまい
ますた。
ご迷惑お掛けしました。

[2537] Re5:漢字変換の件返信 削除
2009/7/3 (金) 17:51:36 白猫
▼ Saykeさん
すいませんね、お役に立てなくて

漢字からひらがなを取得するだけなら
このやり方でdelphi2007からもできるのですが

ひらがなを未確定文字列にするのは、難しいようです。

私も、マイクロソフトのTSF関係を読んだですが

私が、アホなのか? 書いてる奴がアホなんか
それとも、両者ともアホなのか?
よくわかりませんが?

ただ感覚的に、ひらがなを未確定文字列に変換する
ことが、できそうもないなと、思われました

解決策としては、ATOKなら従来にやり方で
visitaでも利用できるそうです。

私の言えることは、ここまでです。
ゴメンナサイ。

[2538] Re6:漢字変換の件返信 削除
2009/7/3 (金) 22:23:43 DEKOHomePage
> ひらがなを未確定文字列にする

http://www.geocities.jp/ht_deko/ft0806.html
コレの件でしょうか?違っていたらゴメンナサイ。

# ANSI系 Delphi + TSF系 IME + Vista の話です。

[2539] Re7:漢字変換の件返信 削除
2009/7/4 (土) 08:04:26 白猫
▼ DEKOさん
そうなんですよね

特に「CUAS」というレイヤーが
問題児みたいで、こいつを、ちゃんと組み立てれば
従来のIMEも認識して、動かせると
私、個人は思っているのですが?

次期OSは、このあたりどう対処してるのだろうか?
マイクロソフトさんも、満を持しての製品だからな
....????? ワカンネ...

これ以上書くと、毒を吐きそうなので、
ここまでとします。

注 CUASとはCicero Unaware Application Support
   の略称
   CiceroはTSFの開発コードネームだそうです。

[2542] Re6:漢字変換の件返信 削除
2009/7/6 (月) 16:10:43 Sayke
▼ 白猫さん
> すいませんね、お役に立てなくて
とんでもございません。
> TSF関係
理解できませんです(^_^;)

(略)
SetImeMode(Edit1.Handle,imHira);
Imc := ImmGetContext(Edit1.Handle);
ImmSetOpenStatus(Imc,TRUE);
ImmSetCompositionString(Imc,SCS_SETSTR
    ,PChar(StrKana),Length(StrKana),nil,0);
ImmReleaseContext(Edit1.Handle,Imc);
(略)
Vistaでも[変換]Key([SPACE]じゃない)なら漢字変換できま
すが、でも思わず[SPACE]Key押さえちゃいますよね。
んで、消えてしまう。(正確には空白文字で上書き)

で騙しとして・・・
(略)
immSetCompositionString(Imc,SCS_SETSTR
  ,PChar(StrKana),Length(StrKana),nil,0);
ImmNotifyIME(Imc, NI_COMPOSITIONSTR, CPS_CONVERT, 0);
ImmReleaseContext(Edit1.Handle,Imc);
(略)
で、「外人の名前だったらどうすんの?」な質問は無しと
言う事で。


[2545] Re7:漢字変換の件返信 削除
2009/7/6 (月) 22:23:38 白猫
▼ Saykeさん
今、vistaから delphi2007を起動して、試験すると
うまく、うごきますね
恐れいりました。

でも,delphi2009から行うと、うまく動きませんでした
ansistringに変換しても、だめでした。

個人的な感想を言うと、vistaなんてvistaなんて
キライ!


[2546] Re8:漢字変換の件返信 削除
2009/7/6 (月) 23:04:55 Mr.XRAY
> 個人的な感想を言うと、vistaなんてvistaなんて
> キライ!


----------------------------------------------
注:  Delphiは弊社の製品ではありません.
     マイクロソフトはこの現象,この製品のパフォーマンスの信頼性に関与する
     ことはありません。
     今後共,末永くマイクロソフトの製品をご愛用いただけますよう深くお願い
     たします.

この情報でお客様の問題は解決しましたか ?
 ○はい
 ○いいえ
 ○わからない
----------------------------------------------

スミマセン.掲示板汚しでした.m(_ _)m


[2547] Re9:漢字変換の件返信 削除
2009/7/7 (火) 06:57:31 白猫
▼ Mr.XRAYさん
ああ、やっちゃた〜  おらしらね〜 ト!

もし、苛立ちがつのるようでしたら
ストレス解消に「ウエデイングベル」
の歌をオススメします

http://www.youtube.com/watch?v=H5O9_IvNOcw&NR=1

少しは、気分がやすらぐと思います。

この情報でお客様のストレスは解決しましたか ?
 ○はい
 ○いいえ
 ○わからない


[2548] Re10:漢字変換の件返信 削除
2009/7/7 (火) 11:37:42 Mr.XRAY
> この情報でお客様のストレスは解決しましたか ?
 ◎はい(少し)
 ○いいえ
 ○わからない

[2558] Re8:漢字変換の件返信 削除
2009/7/17 (金) 21:08:43 白猫
▼ 白猫さん
しっつこくて、申し訳ありません。
前回ダウンロードした本を読んでいるうちに
ちょと、気になる箇所があって、まさかと思いながら
記述したなら、なんとなく、ひらがなを未変換文字に
できそうです。
条件は、Delphi2009で操作したものです
WindosXP,VistaでもOKでした

Saykeさんのプログラムを借用しました。

==================================
Edit1で、ひらがなを確定したものを
Button1を押すと
Edit2に ひらがな 未確定変換となる
=================================
---------------------------
unit Unit6;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,imm, StdCtrls;

type
  TForm6 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
   procedure newSetCharToEdit(Buf: String);

  public
    { Public 宣言 }
  end;

var
  Form6: TForm6;

implementation

{$R *.dfm}

procedure TForm6.Button1Click(Sender: TObject);
begin
 newSetCharToEdit(Edit1.Text);
end;

procedure TForm6.newSetCharToEdit(Buf: String);
var
  IMC: HIMC;
  BufLen:Integer;
  bSize:Integer;
  Buf2:String;
  AnsiSt:AnsiString; //これがミソ
begin
  Edit2.SetFocus;
  edit2.Text:='';

  AnsiSt:=buf; //引数bufを変換

  AnsiSt:=StringReplace(AnsiSt,' ',' ',[rfReplaceAll]);
  //半角スペースがあるとうまく変換できないから、全角スペースに置き換える

  IMC:=ImmGetContext(Edit1.Handle);
  SetLength(Buf2,255);
  bSize:= ImmGetCompositionString(IMC,GCS_COMPSTR,PChar(Buf2),255);
  SetLength(Buf2,bSize);

  Buf:=Buf2 + Buf;

  BufLen:=length(ansist);

  ImmSetCompositionString(IMC,SCS_SETSTR, PChar(Buf),BufLen, nil, 0);

 // ImmNotifyIME(Imc, NI_COMPOSITIONSTR, CPS_CONVERT, 0);
 //自分で確かめてください
  ImmReleaseContext(Edit1.Handle,IMC);

end;

end.
--------------------------------
ながなが、スイマセンでした。
これで、お終いとします
ごめんなさい。


Saykeさんありがとうございました。
なんか、おもしろものができました
白猫こと 隠れコピーキャットより



[2559] Re9:漢字変換の件返信 削除
2009/7/17 (金) 22:10:44 Mr.XRAY
▼ 白猫さん

> 条件は、Delphi2009で操作したものです
> WindosXP,VistaでもOKでした


おおっ,サンクスです.ちょうどランニングに出た時刻に白猫さんから.
今,戻ってみたら...
これで,[フリガナ入力エディト]のバージョンアップができそうです.
このコード,絶対削除しないでくださいね.


INCM/CMT
Cyclamen v3.82