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ビット】どちらでも現象が発生しました。
・縦スクロール・横スクロールが表示され、かつ一旦横に長い文を入力した後、その文の先頭にキャレットを戻し、
再度横に長い文を入力すると、再現率が高く感じました。
どなたか、上記の解決方法をご存じの方がいらっしゃれば、その方法のご教授お願い致します。
キーリピートによる繰り返し描画されるせいで起きているのかも
これで変化はあるでしょうか?
キー入力のレスポンスが悪い (特に TMemo)
https://ht-deko.com/techf003.html
takeさん
回答ありがとうございます。
早速ご教授頂いたリンク先を参照させて頂き、
・OnCreateイベントに、【FMX.Types.GlobalDisableFocusEffect := True;】を実装する。
・TMemoの【DisableFocusEffect】プロパティの設定値を【False】にする。
を、それぞれ別個で試してみたのですが、現象が発生してしまいました。
かなり昔の事なので、間違いなく外しているとは思うのですが(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;
mamさん
回答ありがとうございます。
記載して頂いたソースを
・一行ごと(各プロパティ一つずつ)
・記載して頂いたソースまとめて
どちらも試させて頂いたのですが、現象が発生してしまいました。
ただ試させて頂いている最中、文字数が多い方が発生する確率が上がるように感じました。
試してみた所、この現象はFMXプロジェクトで、
TMemoコンポーネントの縦と横のスクロールバーが表示されている状態で、
長い文字列を(最長の行を)入力して、ENTERキーを押下して改行した後、次の行で発生しやすいですね。
回避策として、プラットフォームのコンポーネントになってしまいますが、
オブジェクトインスペクタ TMemoで、
ControlTypeプロパティを Platform と設定すると現象は出なくなりました。
※ Delphi 11.2で確認
KONNOYAさん
まず試して頂き、更に発生しやすい状態も見つけて頂いてありがとうございます。
それで、早速教えて頂きました回避策を試してみたところ、
自分の環境でも、発生しなくなりました。
本当にありがとうございます。
どうやらFireMonkeyのTMemoのバグみたいですね。
とにかく解決出来てよかったです。
改めて、KONNOYAさん、そして回答を頂いたtakeさん・mamさん、ありがとうございました。
ツイート | ![]() |