今まではMemoコンポーネントでプログラムしていたので
あんまり気にしていなかったのですが、IME98から実装された
再変換機能をTSonEditに実装したいのですがどうすれば良いのでしょうか?
ちなみに初期の状態では右クリックのメニューはなかったので
ポップアップメニューを追加してそこに再変換の機能を実装します。
あと出来ればIMEを開く(Memoには初期からある)も実装したいです。
検索しましょう。
検索すれば、ごろごろありますよ。
今それのようなものがusers.gr.jpの過去ログの中に見つかりました。
でもまだ完全な発見ではないです。
う〜ん、やっぱり分からないです。>さっきのはちょっとはずれでした
Googleを見たらTEditorの再変換の掲示板を見つけたのですが
TSonEditと違うものなので流用できそうにないです(>_<)
追記です。
>あと出来れば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;
> 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である必要があるので、このままだと失敗します。
# 私は失敗しました^^;
> >あと出来ればIMEを開く(Memoには初期からある)も実装したいです。
> これは以下のコードで解決しています。
これだと、
・右クリックで、「IMEを開く」
・半角/全角キーでIMEを閉じる。
・右クリックで…
ここでIMEを開けませんよ。
OnPopupで、IMEが開いているかどうかを調べ、キャプションを変更することでできますね。
えっとTSonEditはそんびんさん作のエディッタコンポーネントです。
http://homepage2.nifty.com/sigotnin/delphi.htm
ちなみにGoogleでIME+再変換+Delphiで検索したところTEditorの
再変換コンポーネントはにしのさんの作ったのがありましたが
HPが閉鎖と書いてあったのでどんな物か分からないです。
私が何もないフォームにそのままTEdit、TMemo、TRitchEdit、TSonEditを
貼り付けた状態で実行して再変換を行ってみましたが、TSonEdit以外は
再変換が出来ました。(TRitchEditは右クリックメニューが出ません)
後半のIMEの方はなんと解決できそうですがこちらは難解になりそうです。
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
を参考にしてください。
再変換の機能は問題なく動きました。>TSonEditで確認
あと変換キー(VK_CONVERT)を押した時、SelLengthが0でない時にも
変換がしたいのですが、TSonEditのOnKeyPressかOnKeyDownどちらで
取得したら良いのでしょうか?そうでなかったら何のイベントでこの条件式を
追加したら良いのでしょうか?
OnPopupイベントは見つけたのですがIMEが開いているかどうかを
チェックする関数が分からないのでこれも出来ればお願いします。
>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;
本題の前に、
「タスクバーとフォームのタイトルを同じにするには?」
への返答をしたほうがよいかと思います。
返答の方を行いました。>タスクバーとフォームのタイトルを同じにするには?」
何度かVK_CONVERTが来てSelLngthが0以上の時と言うのを
いろいろやってみたのですが、OnKeyPressでもOnKeyDownでも
取得できずKeyPressではデバッグしても何も起こらず
KeyDownの方ではKeyに299と言う数値が入ってしまい
VK_CONVERTに設定されている28と同じにならないのですが
どうすれば変換キーを押した時にイベント(この場合は再変換)を起こす事が
出来るのでしょうか?
漢字変換中は、WM_CHARなどでなくWM_IME_CHARなどがきます。
WndProcを変更し、WM_IME_CHARを取得してやればできそうです。
ただ、このあたりは特殊な動きをしています。
できるだけ、デフォルトの動きをそのまま残すような仕様になおしたほうがいいと思います。
今TSonEditに新しくNewWndProcを作ってWM_IME_CHARを捕まえてみたのですが
変換キーではなくてスペースキーが入ってしまうようで、ShowMessageで
SelTextの内容を表示しようとしてもスペースで内容を消されて
何も表示されないメッセージボックスが出るだけです。
ちなみにしようと思っている事は既に変換済みの文字を選択して
その時に変換キーを押すと文字が再変換されると言う部分です。
漢字変換中でなければ、KeyDownでもKeyUpでも拾えますよね。
漢字変換中は、IMEが取得してしまうんでKeyDownでは送られてきません。
以下のようなコードを組んで実行したのですが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;
何か良い方法はないのでしょうか?
補足です
上のコードで落ちるのは選択した文字列に全角スペースが入った場合です。
それ以外の場合は正常に再変換されるようです。
ごめんなさい、もうひとつ補足なのですが右クリックのメニュー時の
変換でも同じエラーで落ちるようです。>全角スペースを含んだ再変換
これはどうすれば回避できるのでしょうか?
これが分かればメールソフトのメール作成部分もTSonEditを
使用しようと思っています。
おじゃまします。TSonEditの作者です。
再変換機能は次のバージョンでサポートされます。
手元では既に完成していますのでもうすぐ公開予定です。
但し、MSIMEのタイプライブラリが必要になります。これはWord98に付属しています。
このタイプライブラリなしで実装する方法があればいいのですが、残念ながら私の能力では難しそうです。
そんぴんさんありがとうございます。
アップされましたらコンポーネントを使わさせて頂きますね。
でもタイプライブラリがどこに入っているか不明です(>_<)
>一応マシンにはWord98とWord2000が入っています。
次期バージョンまでこの機能についてはちょっと止めておきます。
にしのさん本当にありがとうございました。
タイプライブラリはOfficeフォルダの中にあります。MSIME.TLBというやつですが、どうやら、Word98にしか付いていないようです。
MSIME.TLBを未開封だったWord98/Excel97/Outlook98
2重書き込みになっていたらごめんなさいです。
MSIME.TLBを未開封だったWord98/Excel97/Outlook98のCDから
発見しました。(家のノートPCの付属品です。)
これで新バージョンでも対応できそうです。
ツイート | ![]() |