TSynEditで、Caretの位置がずれるのを防ぐには


risa  2024-04-28 01:11:15  No: 151463  IP: [192.*.*.*]

 いつもお世話になっております。標記の件について相談させてください。

1 不具合の再現方法
 ・使用するコンポーネントは、TurboPack SynEditの最新版。
 ・フォームにSynEdit1と構文強調表示用のコンポであるSynPasSyn1
  を配置。
 ・SynEdit1のフォント名をMSゴシックにし、Highlighterとして
  SynPasSyn1を指定。
 ・SynPasSyn1のNumber(整数)のFont.StyleをBoldに設定。

2 不具合の内容
  上記をコンパイルして、ひたすら数字を打ち続ける(例:2222222222…)
  すると、通常であれば、Caretは打った文字の直後に表示されるはずが、
  だんだん入力した文字の中に食い込んで表示される。
  (イメージ:222222222|222)

 ※CharWidthといったプロパティ値を少し大きくすれば解決するかとも
  思ったのですが、その場合、Boldでない文字を打ったとき、今度は
  キャレットが何もない領域に表示されてしまいました。

編集 削除
igy  2024-05-01 04:36:01  No: 151464  IP: [192.*.*.*]


詳しくないのですが・・・・

Delphi 12.1 のGetItでSynEdit for VCL 2024.02 をインストールし、
フォントをMSゴシックにしたときBoldの文字でCaretの位置がずれるのを確認いたしました。

一方、Delphi 10.2.3のSynEdit for VCL 1.3では、この現象は発生しなかったです。

GitHub - TurboPack/SynEdit
https://github.com/TurboPack/SynEdit

Releases · TurboPack/SynEdit · GitHub
https://github.com/TurboPack/SynEdit/releases
には
> Last release based on GDI painting 
> As the project has now moved to text painting using DirectWrite,
とあるので、最新版では DirectWrite を使っているみたいですね。


最新版にこだわらなければ、少し古いバージョンを検討してみるのもよいかもしれません。

編集 削除
risa  2024-05-01 10:04:15  No: 151468  IP: [192.*.*.*]

ご多忙な中、貴重なご助言ありがとうございます。実際、どこの部分で描画しているのか、休みを使って一生懸命追おうとしましたが、コードの波に押し寄せられ、うまく辿り着けないでおりました。
描画方法が変わったのですね。カラーの絵文字なども描画できるようになり、密かに喜んでいたのですが、少し残念です。
ただ、実使用上は通常の文字の正常な描画環境が確保できるのであれば、現状は問題ないかな、という感じです。
当面は古い環境で使ってみて、時期を見て再トライする方向にしたいと思います。
後ほど結果はご報告いたします。

編集 削除
risa  2024-05-01 12:57:59  No: 151470  IP: [192.*.*.*]

 先ほど、

https://github.com/TurboPack/SynEdit/releases/tag/LastGDIbased
(Last release based on GDI painting)

をダウンロードし、Alexandria\Delphiフォルダ内の「SynEditDelphi.groupproj」
を使って「EmbarcaderoR Delphi 11 バージョン 28.0.48361.3236」
に インストールしようとしました。

 その結果、ユニット「SynEditRegexSearch」の中にある、次の
3か所で「未定義の識別子:SetAdditionalPCREOptions」という
エラーが出て、インストールが完了しませんでした。

FRegEx.SetAdditionalPCREOptions
RegEx.SetAdditionalPCREOptions(PCRE_UCP);
RegEx.SetAdditionalPCREOptions(PCRE_UCP);

この3行を無理やりコメントアウトすると、何とかインスト
ールできるのですが、可能であれば、極力そのままの形でイ
ンストールしたいと思っています。
 もしこの部分の手直し方法をご存じの方がいればご教示を
お願いできれば幸いです。見たところ、Delphi 標準の正規表
現ライブラリ?のメンバ関数名が変わったのかな?とも思え
ました。

編集 削除
igy  2024-05-01 14:35:04  No: 151471  IP: [192.*.*.*]

> もしこの部分の手直し方法をご存じの方がいれば

正しいかは、わからないのですが、
最新版のファイル SynEditRegexSearch と入れ替えて試しにコンパイルしてみるとか・・

編集 削除
AAAAA  2024-05-01 21:22:46  No: 151472  IP: [192.*.*.*]

Embarcadero® Delphi 11 バージョン 28.0.44500.8973 だけど
インストールしてもエラーは出ないね

編集 削除
risa  2024-05-03 04:24:58  No: 151473  IP: [192.*.*.*]

回答ありがとうございます。
確かにご指摘のとおり、3行部分だけをなんとかすればインストールできるのでは、という発想から、最新版のユニットと比較したところ、この三行以外は基本同じでした。
そのため、ユニットを最新版に入れ替えましたところ、無事インストールできました。
これから動作を検証してみたいと思います。

編集 削除
risa  2024-05-03 04:32:03  No: 151474  IP: [192.*.*.*]

AAAAA様、時間をとって検証いただき、ありがとうございます。改めて最初からやってみたのですが、やはり3行部分で引っかかりました。
そのため、上記のような対応で回避いたしました。

編集 削除