首页 > 解决方案 > 更改 Firemonkey TMemo 组件中选定子字符串后面的背景颜色

问题描述

我希望通过在子字符串后面绘制黄色背景,以编程方式将焦点设置在(Delphi 10.3.1)Firemonkey TMemo 组件中的特定子字符串上。下面的代码在正确的位置绘制了一个黄色矩形,但该矩形似乎叠加在文本上,从而隐藏了它。是否有一些 TMemo 属性可以用来避免这种情况?如果没有,推荐的修复方法是什么?

procedure TTextGUIMemo.SetFocusOnHit(HitIndex: integer);
var
  LineIndex: integer;
  GlobalHitInterval: TIntegerArray2;
begin
  FFileCptHitsExpd.FileCptHits.GetHitSubstringGlobal(HitIndex, {=>}LineIndex,
                GlobalHitInterval);
  FMemo.SetFocus;
  FMemo.SelStart:= GlobalHitInterval[0];
  FMemo.SelLength:= GlobalHitInterval[1];
  FMemo.SelectionFill.Color := TAlphaColorRec.Yellow; 
  FMemo.FontColor:= TAlphaColorRec.Black;
  FMemo.Repaint;
end;

提前感谢您的任何建议。

标签: firemonkeytmemo

解决方案


看(XE7)FMX.Memo.pas procedure TMemo.DoContentPaint()可能会认为绘制顺序是错误的。另一方面,它可能是故意的,也许我只是不明白为什么。

首先绘制文本,然后是选择,最后是拼写突出显示。标准选择颜色是$7F3399FF。注意 Alpha 通道 ( 7F)。这使它半透明,因此文本显示出来,即使选择颜色绘制在文本上。

在此处输入图像描述

因此,您的问题的解决方案是将颜色定义为部分透明,例如:

FMemo.SelectionFill.Color := $7FFFFF00; // or perhaps even more transparent $4FFFFF00

然而,这样做的效果是,文本不再是黑色(就像它不是原始选择颜色一样)。

在此处输入图像描述

FMX.Memo.pas使用我重新排列的文件副本进行测试,procedure TMemo.DoContentPaint()以便标记的代码块// selection位于该块之前// text。在这种情况下,可以使用完全不透明的颜色进行选择。

FMemo.SelectionFill.Color := $FFFFFF00; // alpha = $FF

在此处输入图像描述

但切勿修改原始 Delphi 安装目录中的任何文件。在您的项目目录中制作该文件的副本并修改该副本。不利的一面是,对于新的更新版本,您可能需要记住再次复制和修改。


推荐阅读