TSonEditで再変換機能を実装するには?

解決


みけにゃん  2002-11-11 23:59:07  No: 2064

今まではMemoコンポーネントでプログラムしていたので
あんまり気にしていなかったのですが、IME98から実装された
再変換機能をTSonEditに実装したいのですがどうすれば良いのでしょうか?
ちなみに初期の状態では右クリックのメニューはなかったので
ポップアップメニューを追加してそこに再変換の機能を実装します。
あと出来ればIMEを開く(Memoには初期からある)も実装したいです。


にしの  2002-11-12 02:05:18  No: 2065

検索しましょう。
検索すれば、ごろごろありますよ。


みけにゃん  2002-11-12 02:13:15  No: 2066

今それのようなものがusers.gr.jpの過去ログの中に見つかりました。
でもまだ完全な発見ではないです。


みけにゃん  2002-11-12 02:38:38  No: 2067

う〜ん、やっぱり分からないです。>さっきのはちょっとはずれでした
Googleを見たらTEditorの再変換の掲示板を見つけたのですが
TSonEditと違うものなので流用できそうにないです(>_<)


みけにゃん  2002-11-12 02:41:18  No: 2068

追記です。
>あと出来ればIMEを開く(Memoには初期からある)も実装したいです。

これは以下のコードで解決しています。

// IMEを開くのコード(メモ帳と同じ動き?)
procedure TForm1.IME1Click(Sender: TObject);
begin
  if IME1.Caption = 'IMEを開く(&O)' then
  begin
    IME1.Caption := 'IMEを閉じる(&L)';
    SetImeMode(Handle, ImOpen);
  end
  else
  begin
    IME1.Caption := 'IMEを開く(&O)';
    SetImeMode(Handle, ImClose);
  end;
end;


にしの  2002-11-12 03:16:11  No: 2069

> Googleを見たらTEditorの再変換の掲示板を見つけたのですが
> TSonEditと違うものなので流用できそうにないです(>_<)

TSonEditがどういうものかよく知らないので、流用できるかどうかはわかりませんが、TEditor掲示板でわたしが作ったユニットでは、TMemo,TRichEdit,TEditどれでも再変換可能でしたよ。

そこで紹介されているサイトはすでに消えているようですが、InternetArchiveでは見れました。
http://web.archive.org/web/20011102034008/http://www.netlaputa.ne.jp/~stadt/vb/t12_ime/reconvert.htm
参考にどうぞ。
VBですので、これをDelphiに移植するだけです。
注意すべきは、VBではネイティブにUnicodeを扱えますが、DelphiではSJISということです。ATOKでは、Unicodeである必要があるので、このままだと失敗します。
# 私は失敗しました^^;


にしの  2002-11-12 03:17:41  No: 2070

> >あと出来ればIMEを開く(Memoには初期からある)も実装したいです。
> これは以下のコードで解決しています。
これだと、
・右クリックで、「IMEを開く」
・半角/全角キーでIMEを閉じる。
・右クリックで…
ここでIMEを開けませんよ。
OnPopupで、IMEが開いているかどうかを調べ、キャプションを変更することでできますね。


みけにゃん  2002-11-12 17:42:55  No: 2071

えっとTSonEditはそんびんさん作のエディッタコンポーネントです。
http://homepage2.nifty.com/sigotnin/delphi.htm

ちなみにGoogleでIME+再変換+Delphiで検索したところTEditorの
再変換コンポーネントはにしのさんの作ったのがありましたが
HPが閉鎖と書いてあったのでどんな物か分からないです。

私が何もないフォームにそのままTEdit、TMemo、TRitchEdit、TSonEditを
貼り付けた状態で実行して再変換を行ってみましたが、TSonEdit以外は
再変換が出来ました。(TRitchEditは右クリックメニューが出ません)

後半のIMEの方はなんと解決できそうですがこちらは難解になりそうです。


にしの  2002-11-12 18:18:59  No: 2072

http://www.overs.jp/software/download/immreconv.zip
に置きました。
ただし、ATOKに関しては未調整です。うまく動きません。

ソースは買えてないので、MSIME98以降なら動くと思いますが、現在の環境にMSIMEがないのでわかりません。

このソースで何をしているかわからない場合は、上で紹介した
http://web.archive.org/web/20011102034008/http://www.netlaputa.ne.jp/~stadt/vb/t12_ime/reconvert.htm
を参考にしてください。


みけにゃん  2002-11-12 19:06:22  No: 2073

再変換の機能は問題なく動きました。>TSonEditで確認

あと変換キー(VK_CONVERT)を押した時、SelLengthが0でない時にも
変換がしたいのですが、TSonEditのOnKeyPressかOnKeyDownどちらで
取得したら良いのでしょうか?そうでなかったら何のイベントでこの条件式を
追加したら良いのでしょうか?

OnPopupイベントは見つけたのですがIMEが開いているかどうかを
チェックする関数が分からないのでこれも出来ればお願いします。


みけにゃん  2002-11-12 19:47:03  No: 2074

>OnPopupイベントは見つけたのですがIMEが開いているかどうかを
>チェックする関数が分からないのでこれも出来ればお願いします。

これで修正できたと思うのですが、どうでしょうか?
http://hp.vector.co.jp/authors/VA015730/delphi/TipsTips.htmlの
「すでにIMEがオープンしているか」を参考にしてみました。

procedure TForm1.PopupMenu1Popup(Sender: TObject);
var
  imc:        HIMC;
  bImeStatus: Boolean;
begin
  imc := ImmGetContext(Handle);
  bImeStatus := ImmGetOpenStatus(imc);

  if bImeStatus = True then
  begin
    IME1.Caption := 'IMEを閉じる(&L)';
  end
  else
  begin
    IME1.Caption := 'IMEを開く(&O)';
  end;
end;


にしの  2002-11-12 20:01:32  No: 2075

本題の前に、
「タスクバーとフォームのタイトルを同じにするには?」
への返答をしたほうがよいかと思います。


みけにゃん  2002-11-12 20:47:30  No: 2076

返答の方を行いました。>タスクバーとフォームのタイトルを同じにするには?」

何度かVK_CONVERTが来てSelLngthが0以上の時と言うのを
いろいろやってみたのですが、OnKeyPressでもOnKeyDownでも
取得できずKeyPressではデバッグしても何も起こらず
KeyDownの方ではKeyに299と言う数値が入ってしまい

VK_CONVERTに設定されている28と同じにならないのですが
どうすれば変換キーを押した時にイベント(この場合は再変換)を起こす事が
出来るのでしょうか?


にしの  2002-11-12 21:12:41  No: 2077

漢字変換中は、WM_CHARなどでなくWM_IME_CHARなどがきます。
WndProcを変更し、WM_IME_CHARを取得してやればできそうです。
ただ、このあたりは特殊な動きをしています。
できるだけ、デフォルトの動きをそのまま残すような仕様になおしたほうがいいと思います。


みけにゃん  2002-11-12 22:50:40  No: 2078

今TSonEditに新しくNewWndProcを作ってWM_IME_CHARを捕まえてみたのですが
変換キーではなくてスペースキーが入ってしまうようで、ShowMessageで
SelTextの内容を表示しようとしてもスペースで内容を消されて
何も表示されないメッセージボックスが出るだけです。

ちなみにしようと思っている事は既に変換済みの文字を選択して
その時に変換キーを押すと文字が再変換されると言う部分です。


にしの  2002-11-12 23:12:57  No: 2079

漢字変換中でなければ、KeyDownでもKeyUpでも拾えますよね。
漢字変換中は、IMEが取得してしまうんでKeyDownでは送られてきません。


みけにゃん  2002-11-13 00:01:20  No: 2080

以下のようなコードを組んで実行したのですがWindows自体が
フリーズすると言う事になってしまいました。EXEで試すと
今度は不正な処理で落ちます。

procedure TForm1.Memo1KeyUP(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if Key = VK_CONVERT then
  begin
    if Memo1.Sellength <> 0 then
      ImmReconvert(Handle, Memo1.SelText);
  end;
end;

何か良い方法はないのでしょうか?


みけにゃん  2002-11-13 01:13:54  No: 2081

補足です
上のコードで落ちるのは選択した文字列に全角スペースが入った場合です。
それ以外の場合は正常に再変換されるようです。


みけにゃん  2002-11-13 01:19:39  No: 2082

ごめんなさい、もうひとつ補足なのですが右クリックのメニュー時の
変換でも同じエラーで落ちるようです。>全角スペースを含んだ再変換
これはどうすれば回避できるのでしょうか?

これが分かればメールソフトのメール作成部分もTSonEditを
使用しようと思っています。


そんぴん  2002-11-13 06:23:22  No: 2083

おじゃまします。TSonEditの作者です。

再変換機能は次のバージョンでサポートされます。
手元では既に完成していますのでもうすぐ公開予定です。
但し、MSIMEのタイプライブラリが必要になります。これはWord98に付属しています。
このタイプライブラリなしで実装する方法があればいいのですが、残念ながら私の能力では難しそうです。


みけにゃん  2002-11-13 06:55:05  No: 2084

そんぴんさんありがとうございます。
アップされましたらコンポーネントを使わさせて頂きますね。
でもタイプライブラリがどこに入っているか不明です(>_<)
>一応マシンにはWord98とWord2000が入っています。

次期バージョンまでこの機能についてはちょっと止めておきます。
にしのさん本当にありがとうございました。


そんぴん  2002-11-13 17:31:25  No: 2085

タイプライブラリはOfficeフォルダの中にあります。MSIME.TLBというやつですが、どうやら、Word98にしか付いていないようです。


みけにゃん  2002-11-14 05:59:16  No: 2086

MSIME.TLBを未開封だったWord98/Excel97/Outlook98


みけにゃん  2002-11-14 06:00:44  No: 2087

2重書き込みになっていたらごめんなさいです。
MSIME.TLBを未開封だったWord98/Excel97/Outlook98のCDから
発見しました。(家のノートPCの付属品です。)
これで新バージョンでも対応できそうです。


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加