FireMonKeyのTMemoの入力時の横スクロールについて

解決


幽霊狐  2023-09-28 02:29:55  No: 151137  IP: 192.*.*.*

FireMonKeyのTMemoの入力時の横スクロールについて、質問させて下さい。
・開発環境
 Windows10
 Delphi 11 バージョン 28.0.48361.3236
 にて、Windowsアプリを作成しています。

・現象
 TMemoに横一行に長文を入力し、横スクロールを表示させ、更に入力し続けると、たまに横スクロールが動かず、入力された文字が見えない状態で入力され続けます。
 (常に発生するわけではありません。)

・どうしたいか?
 現象が発生しないようにしたいです。

・再現方法
 1.Formに、TMemoを任意に配置し、適当なサイズに広げます。(それ以外のプロパティは、デフォルトのままです。)
 2.実行し、1で配置したTMemoに横に長い文を入力します。(同じキーを押し続けていれば大丈夫です。)
 3.たまに横スクロールが動かず、TMemoの表示箇所はそのままで、文字が入力され続けます。

・解決になりませんでしたが、試したこと
 OnChangeTrackingイベントで、以下のことやってみました。
  ・Visibleプロパティにて、一旦TMemoを表示にし、再度表示させる。
  ・Repaintメソッドにて、TMemoを再描画させる。
  ・Caretを取得し、ScrollToメソッドで再設定させる(こちらは、スクロール位置の変更は出来たのですが、連続で行うと、微妙に位置がずれていってしまいました)。

・その他
 ・ターゲットプラットフォームは、【Windows 32ビット】・【Windows 64ビット】どちらでも現象が発生しました。
 ・縦スクロール・横スクロールが表示され、かつ一旦横に長い文を入力した後、その文の先頭にキャレットを戻し、
  再度横に長い文を入力すると、再現率が高く感じました。

どなたか、上記の解決方法をご存じの方がいらっしゃれば、その方法のご教授お願い致します。

編集 削除
take  2023-09-28 02:51:45  No: 151138  IP: 192.*.*.*

キーリピートによる繰り返し描画されるせいで起きているのかも

これで変化はあるでしょうか?

キー入力のレスポンスが悪い (特に TMemo)
https://ht-deko.com/techf003.html

編集 削除
幽霊狐  2023-09-28 05:09:46  No: 151139  IP: 192.*.*.*

takeさん

回答ありがとうございます。
早速ご教授頂いたリンク先を参照させて頂き、
・OnCreateイベントに、【FMX.Types.GlobalDisableFocusEffect := True;】を実装する。
・TMemoの【DisableFocusEffect】プロパティの設定値を【False】にする。
を、それぞれ別個で試してみたのですが、現象が発生してしまいました。

編集 削除
mam  URL  2023-09-28 06:17:02  No: 151140  IP: 192.*.*.*

かなり昔の事なので、間違いなく外しているとは思うのですが(GPU性能が凄く悪いPCを使っていた大昔です)以下を入れたことがあるような・・・。

initialization
begin
  //True:ハードウェアDirectXを使う、False:GDIを使う
  FMX.Types.GlobalUseDX:=True;

  //True:ソフトフェアDirectXを使用する、False:ソフトウェアDirextXを使わない
  FMX.Types.GlobalUseDXSoftware:=True;

  //True:Direct2Dを利用する、False:GDI+を使う
  FMX.Types.GlobalUseDirect2D:=false;

  //GDI+を使う場合のみ
  //True:クリアタイプレンダリングが有効、False:グレースケールアンチエイリアス処理
  FMX.Types.GlobalUseGDIPlusClearType:=false;

  //Trueだと処理が早くなるがフォーカス効果が無効になる
  FMX.Types.GlobalDisableFocusEffect:=True;

  //GPUキャンバスを使うかどうか
  FMX.Types.GlobalUseGPUCanvas:=True;
end;

編集 削除
幽霊狐  2023-09-28 07:52:04  No: 151141  IP: 192.*.*.*

mamさん

回答ありがとうございます。 
記載して頂いたソースを
・一行ごと(各プロパティ一つずつ)
・記載して頂いたソースまとめて
どちらも試させて頂いたのですが、現象が発生してしまいました。

ただ試させて頂いている最中、文字数が多い方が発生する確率が上がるように感じました。

編集 削除
KONNOYA  2023-10-03 05:57:16  No: 151157  IP: 192.*.*.*

試してみた所、この現象はFMXプロジェクトで、
TMemoコンポーネントの縦と横のスクロールバーが表示されている状態で、
長い文字列を(最長の行を)入力して、ENTERキーを押下して改行した後、次の行で発生しやすいですね。

回避策として、プラットフォームのコンポーネントになってしまいますが、
オブジェクトインスペクタ TMemoで、
ControlTypeプロパティを Platform と設定すると現象は出なくなりました。
※ Delphi 11.2で確認

編集 削除
幽霊狐  2023-10-03 13:13:36  No: 151162  IP: 192.*.*.*

KONNOYAさん

まず試して頂き、更に発生しやすい状態も見つけて頂いてありがとうございます。

それで、早速教えて頂きました回避策を試してみたところ、
自分の環境でも、発生しなくなりました。
本当にありがとうございます。
どうやらFireMonkeyのTMemoのバグみたいですね。
とにかく解決出来てよかったです。
改めて、KONNOYAさん、そして回答を頂いたtakeさん・mamさん、ありがとうございました。

編集 削除