掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
Window10でTEditorコンポーネントのキャレットが消える問題への対応 (ID:149666)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
HFUKUSHI 様、au様、書きこみありがとうございます。 HFUKUSHI 様、あまりエンバカデロ様の動きは気にしておりませんでしたが、 エンバカデロ様は当然といえば当然のような考え方をなさっているようですね。 あまり期待はできなさそうです。 私自身、TEditorの熱烈な支持者で、これを使った他のエディタも深くリスペクト して使用させていただいております。微力ではありますが、知り合いにお願いし、 Windows10のスタートメニューから、フィードバックhubへこの件を「重要問題」 扱いで報告させていただきました。私のソフトの改善のみならず、皆さんもそれらの ソフトを問題なく使える日がまた来るといいな、と思っています。 au様、私がShowCaretを試行的に入れてみたのは、まさにそのWMImeComposition メソッド内です。そういえば、Caretは単なる表示非表示の切替ではなくて、隠した 回数分表示コマンドを実行しないと表示されない、といったような仕様になっていた ことを思い出しました。 ためしに、以下のような行を1行入れてみましたところ、Caretは表示されるように なりました。 procedure TEditor.WMImeComposition(var Msg: TMessage); var Imc: HIMC; L: Integer; S: String; begin inherited; // WM_IME_CHAR メッセージが発行され、IME 文字列長分の WM_CHAR が // Windows の DefWindowsProc によってポストされる。 if (Msg.LParam and GCS_RESULTSTR <> 0) and not FReadOnly then begin Imc := ImmGetContext(Handle); L := ImmGetCompositionString(Imc, GCS_RESULTSTR, nil, 0); SetLength(S, L + 1); ImmGetCompositionString(Imc, GCS_RESULTSTR, PChar(S), L + 1); ImmReleaseContext(Handle, Imc); SetLength(S, L); FImeCount := L; PutStringToLine(S); while FCaretUpdateCount > 0 do CaretEndUpdate; // この1行を追加。CaretEndUpdateのなかでFCaretUpdateCount はDecされる。 end; end; シンプルに考えてですが、IMEの変換処理の途中で不具合が起きてい る(IMN_CLOSECANDIDATEが飛んでこず、CaretEndUpdateの回数がこ なせない)というのであれば、IMEの変換処理が終わる際(このプロシ ージャを抜ける直前)に、きちんと本来あるべき姿に戻してあげれば よいはずです。 (=FCaretUpdateCountが0となり、Caretが表示される状態にする) そのため、お示しいただいた処理というのは、おそらく正解なので はないかと考えております。 引き続き皆さまのお知恵をお借りしたいと思いますが、当方ではこの 処理を入れて、しばらく違和感がないか試験的に使ってみようと思います。 お二人とも、お知恵をお貸しくださり、ありがとうございました。 OSのバグらしく、直る見込みもないと考えてしまっていたので、絶望感の 中にいたのですが、引き続き自分のソフトを最高の作品に仕上げていこうと いうモチベーションが保てそうです。 引き続き、もし何かございましたら、よろしくお願いいたします。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.